{"version":3,"sources":["jsdelivr-header.js","/npm/kws-rpc-builder@4.3.22/lib/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACSA,IAAI,aAAe,QAAQ,UAAU,aAEjC,SAAW,QAAQ,YAEnB,QAAU,QAAQ,aAClB,OAAS,QAAQ,YAGrB,MAAM,aAAe,IAGrB,SAAS,qBAAqB,GAE5B,IAAI,EAAiB,MAAO,CAAC,EAE7B,IAAI,IAAI,KAAO,EACf,CACE,IAAI,EAAQ,EAAgB,GAET,iBAAT,IACR,EAAgB,GAChB,CACE,SAAU,GAEhB,CAEA,OAAO,CACT,CAEA,SAAS,eAAe,GAEtB,GAAI,EAAJ,CAGA,GAAG,aAAqB,SACtB,MAAO,CAAC,KAAM,GAGhB,GAAG,EAAU,gBAAgB,SAC3B,OAAO,EAGT,GAAG,EAAU,uBAAuB,SAGlC,OADA,EAAU,KAAO,EAAU,YACpB,EAIT,GAAG,EAAU,iBAAiB,SAG5B,OADA,EAAU,KAAO,EAAU,MACpB,EAIT,QAA2B,IAAxB,EAAU,aACV,EAAU,iBAAiB,UAE9B,MAAM,IAAI,YAAY,iDA5BD,CA6BvB,CAaA,SAAS,gBAAgB,EAAQ,GAE/B,OAAO,eAAe,KAAM,SAAU,CAAC,MAAO,EAAQ,YAAY,IAClE,OAAO,eAAe,KAAM,SAAU,CAAC,MAAO,EAAQ,YAAY,GACpE,CAgBA,SAAS,WAAW,EAAQ,EAAS,EAAW,GAE9C,IAAI,EAAO,KAEX,IAAI,EACF,MAAM,IAAI,YAAY,yBAExB,IAAI,EAAO,OAAS,EAAO,OACzB,MAAM,IAAI,YAAY,qBAExB,IAAI,EAAkB,qBAAqB,EAAO,iBAGlD,GAAG,aAAmB,SACtB,CACE,GAAgB,MAAb,EACD,MAAM,IAAI,YAAY,6CAExB,EAAY,EACZ,OAAY,EACZ,OAAY,CACd,CAEA,GAAG,GAAW,EAAQ,gBAAgB,SACtC,CACE,GAAG,KAAe,aAAqB,UACrC,MAAM,IAAI,YAAY,0CAExB,EAAY,EACZ,EAAY,EACZ,OAAY,CACd,CAEA,GAAG,aAAqB,SACxB,CACE,GAAgB,MAAb,EACD,MAAM,IAAI,YAAY,6CAExB,EAAY,EACZ,OAAY,CACd,CAEA,GAAG,GAAa,EAAU,gBAAgB,UACrC,KAAe,aAAqB,UACrC,MAAM,IAAI,YAAY,0CAE1B,EAAU,GAAW,CAAC,EAGtB,aAAa,KAAK,MAEf,GACD,KAAK,GAAG,UAAW,GAGrB,OAAO,eAAe,KAAM,SAAU,CAAC,MAAO,EAAQ,SAEtD,IAAI,EAAc,EAAQ,aAAe,EAGzC,SAAS,EAAiB,GAExB,EAAK,OAAO,EAAM,MAAQ,EAC5B,CAEA,OAAO,eAAe,KAAM,YAC5B,CACE,IAAK,WAEH,OAAO,CACT,EAEA,IAAK,SAAS,GAGT,IAGE,EAAU,oBACX,EAAU,oBAAoB,UAAW,GAGnC,EAAU,gBAChB,EAAU,eAAe,OAAQ,IAIlC,IAGE,EAAM,iBACP,EAAM,iBAAiB,UAAW,GAG5B,EAAM,aACZ,EAAM,YAAY,OAAQ,IAG9B,EAAY,eAAe,EAC7B,IAGF,KAAK,UAAY,EAGjB,MAAM,EAAqB,EAAQ,iBA9LhB,IA+Lb,EAAqB,EAAQ,kBA/LhB,IAgMb,EAAqB,EAAQ,oBAhMhB,IAmMnB,IAAI,EAAY,EAEZ,EAAY,IAAI,OAChB,EAAY,IAAI,OAChB,EAAqB,IAAI,OAEzB,EAAc,CAAC,EAyBnB,SAAS,EAAuB,EAAK,GAEnC,IAAI,EAAU,YAAW,WAEvB,EAAmB,OAAO,EAAK,EACjC,GACA,GAEA,EAAmB,IAAI,EAAS,EAAK,EACvC,CAgBA,SAAS,EAAW,EAAQ,EAAQ,EAAI,EAAM,GAE5C,gBAAgB,KAAK,KAAM,EAAQ,GAEnC,OAAO,eAAe,KAAM,YAC5B,CACE,IAAK,WAEH,OAAO,CACT,EAEA,IAAK,SAAS,GAEZ,EAAY,eAAe,EAC7B,IAGF,IAAI,EAAW,EAAU,IAAI,EAAI,GAK5B,GAAa,EAAK,WACrB,OAAO,eAAe,KAAM,aAC5B,CACE,MAAO,QAAQ,KAGnB,IAAI,EAAiB,EAAgB,GAErC,KAAK,KAAO,EAAO,KAAK,KAAK,EAAQ,KAAM,GAU3C,KAAK,MAAQ,SAAS,EAAO,EAAQ,GAGnC,GAAG,aAAiB,UAAY,GAAS,EAAM,gBAAgB,SAC/D,CACE,GAAa,MAAV,EACD,MAAM,IAAI,YAAY,4CAExB,EAAY,EACZ,EAAS,KACT,OAAQ,CACV,MAEK,GAAG,aAAkB,UACvB,GAAU,EAAO,gBAAgB,SACpC,CACE,GAAgB,MAAb,EACD,MAAM,IAAI,YAAY,4CAExB,EAAY,EACZ,EAAS,IACX,CAiBA,IAAI,EAGJ,GAlBA,EAAY,eAAe,GAGxB,GACD,aAAa,EAAS,SAEb,MAAR,IAEE,IACD,EAAM,KAAO,GAEZ,IACD,EAAO,KAAO,IAMf,GAAmB,MAAV,EACZ,CAUE,GATkB,MAAf,EAAK,SAEH,EACD,EAAM,KAAO,EAAK,OAElB,EAAO,KAAO,EAAK,QAIpB,EAED,GAA2B,MAAxB,EAAe,OAAsB,EACtC,EACA,CACE,MAAO,QAST,EACA,CACE,OANW,EACA,EAAe,MACf,EAAe,SAK1B,OAAQ,GAAS,QAKrB,EACA,CACE,MAAQ,EACR,OAAQ,GAGZ,EAAU,EAAO,KAAK,EAAS,EACjC,MAIE,EADM,EACI,EAAS,QAIT,EAAO,KAAK,CAAC,OAAQ,MAAO,GAQxC,OArLJ,SAAuB,EAAS,EAAI,GAElC,IAAI,EACJ,CACE,QAAS,EAET,QAAS,YAAW,WAElB,EAAU,OAAO,EAAI,EACvB,GACA,IAGF,EAAU,IAAI,EAAU,EAAI,EAC9B,CAkKI,CAAc,EAAS,EAAI,IAG3B,EAAY,GAAa,KAAK,WAAa,EAAK,WAGvC,EAAU,KAAK,GAEjB,CACT,CACF,CAIA,SAAS,EAAO,GAEd,IAAI,EAAM,EAAY,GACtB,GAAI,EAAJ,QAEO,EAAY,GAEnB,IAAI,EAAU,EAAS,IAAI,EAAI,GAAI,EAAI,MACnC,IAEJ,aAAa,EAAQ,SAGrB,EAAuB,EAAI,GAAI,EAAI,MAVpB,CAWjB,CAjBA,SAAS,EAAY,iBAwBrB,KAAK,OAAS,SAAS,GAErB,GAAG,EAAS,OAAO,EAAO,GAE1B,IAAI,IAAI,KAAW,EACjB,EAAO,EACX,EAGA,KAAK,MAAQ,WAGX,IAAI,EAAY,EAAK,UAClB,GAAa,EAAU,OACvB,EAAU,QAGb,KAAK,SAEL,EAAmB,QAAQ,cAG3B,EAAU,SAAQ,SAAS,GAEzB,aAAa,EAAS,QACxB,GACF,EAeA,KAAK,OAAS,SAAS,EAAQ,EAAQ,EAAM,EAAW,GAGtD,GAAG,aAAkB,SACrB,CACE,GAAW,MAAR,EACD,MAAM,IAAI,YAAY,4CAExB,EAAY,EACZ,OAAY,EACZ,OAAY,EACZ,OAAY,CACd,MAEK,GAAG,aAAgB,SACxB,CACE,GAAgB,MAAb,EACD,MAAM,IAAI,YAAY,4CAExB,EAAY,EACZ,OAAY,EACZ,OAAY,CACd,MAEK,GAAG,aAAqB,SAC7B,CACE,GAAe,MAAZ,EACD,MAAM,IAAI,YAAY,4CAExB,EAAY,EACZ,OAAY,CACd,CAEkB,MAAf,EAAK,UAEN,EAAS,GAAU,CAAC,GAEb,KAAO,EAAK,QAGV,MAAR,KAED,EAAS,GAAU,CAAC,GAEb,KAAO,GAIhB,IAAI,EACJ,CACE,OAAQ,EACR,OAAQ,GAGV,GAAG,EACH,CACE,IAAI,EAAK,IACL,EAAU,EAId,SAAS,EAAiB,EAAO,GAE/B,EAAK,OAAO,GAEZ,EAAS,EAAO,EAClB,CAEA,IAAI,EACJ,CACE,QAXF,EAAU,EAAO,KAAK,EAAS,GAY7B,SAAiB,EACjB,gBAAiB,EAAgB,IAAW,CAAC,GAU3C,GAPA,EACJ,CACE,QAAiB,EACjB,SAAiB,EACjB,gBAAiB,EAAgB,IAAW,CAAC,GAGxB,eAAe,IAEtC,SAAS,EAAY,GAQnB,OANA,EAAQ,QAAU,WAAW,EACA,EAAgB,KAAK,IAAI,EAAG,MACzD,EAAY,GAAW,CAAC,GAAI,EAAI,KAAM,GACtC,EAAS,IAAI,EAAS,EAAI,IAE1B,EAAY,GAAa,GAAoB,EAAK,WAEzC,EAAU,KAAK,GAEjB,CACT,CAEA,SAAS,EAAM,GAEb,EAAY,eAAe,GAE3B,QAAQ,KAAK,EAAQ,8BAA8B,GAEnD,IAAI,EAAU,EAAmB,IAAI,EAAI,GAGzC,OAFA,aAAa,GAEN,EAAY,EACrB,CAEA,SAAS,IAEP,GAAG,EAAU,EACX,OAAO,EAAM,GAEf,IAAI,EAAQ,IAAI,MAAM,yBAClB,EAAM,QAAU,EAEpB,EAAM,MAAQ,EAEd,EAAiB,EACnB,CAEA,OAAO,EAAY,EACrB,CAMA,OAHA,EAAU,EAAO,KAAK,IAEtB,EAAY,GAAa,EAAK,WAErB,EAAU,KAAK,GAEjB,CACT,EAaA,KAAK,OAAS,SAAS,EAAS,GAE9B,IAAI,EACF,MAAM,IAAI,UAAU,0BAEtB,IAEE,EAAU,EAAO,OAAO,EAC1B,CACA,MAAM,GAGJ,OAAO,QAAQ,MAAM,EAAG,EAC1B,CAEA,IAAI,EAAS,EAAQ,GACjB,EAAS,EAAQ,IACjB,EAAS,EAAQ,OACjB,EAAS,EAAQ,QAAU,CAAC,EAE5B,EAAO,EAAO,KACd,EAAO,EAAO,KAGlB,GAAkB,MAAf,EAAK,QAAuB,GAAQ,EAAK,OAA5C,CAGA,GAAS,MAAN,GAA0B,MAAP,EACtB,CACE,IAAI,EAAe,IAAI,gBAAgB,EAAQ,GAE/C,GAAG,EAAK,KAAK,UAAW,GAAe,OACvC,OAAO,CACT,CAqCA,GAAG,EACH,CAEE,GAAW,MAAR,GAAqB,GAAQ,EAAK,OACrC,CAEE,GADI,EAAU,EAAS,IAAI,EAAK,GAEhC,CACE,IAAI,EAAkB,EAAQ,gBAE9B,OAAG,GAAU,EAAgB,MACpB,EAAgB,EAAS,GAE/B,GAAU,EAAgB,SACpB,EAAgB,EAAS,KAAM,GAEjC,GACT,CAGA,GADI,EAAY,EAAmB,IAAI,EAAK,GAE1C,OAAO,EAAmB,EAC9B,CAGA,OAAO,GACT,CAEA,IAAI,EAAS,EAAQ,MACjB,EAAS,EAAQ,OAGrB,KAAG,GAAU,EAAM,MAAS,EAAM,MAAS,EAAK,QAC7C,GAAU,EAAO,MAAQ,EAAO,MAAQ,EAAK,QAAhD,CAGA,IAAI,EAGE,EAFN,KADI,EAAU,EAAS,IAAI,EAAK,IAI9B,OADI,EAAY,EAAmB,IAAI,EAAK,IAEnC,EAAmB,GAErB,QAAQ,KAAK,2CAA4C,GAIlE,EAAgB,EAAS,EAAO,EAd8B,CA/EJ,CAY1D,SAAS,IAIP,GADA,EAAY,eAAe,IAAc,EAAK,UAE9C,CACE,IAAI,EAAW,EAAU,IAAI,EAAI,GACjC,GAAG,EACD,OAAO,EAAU,KAAK,EAAS,QACnC,CAEA,IACI,EAAU,IAAI,EAAW,EAAQ,EADlB,MAAN,EAAmB,EAAK,EACe,EAAM,GAE1D,IAAG,EAAK,KAAK,UAAW,GACxB,OAAO,CACT,CAEA,SAAS,EAAgB,EAAS,EAAO,GAEvC,EAAQ,SAAS,EAAO,EAC1B,CAEA,SAAS,EAAmB,GAE1B,QAAQ,KAAK,6BAA8B,GAG3C,aAAa,GACb,EAAuB,EAAK,EAC9B,CAoDF,CACF,CACA,SAAS,WAAY,cAGrB,WAAW,gBAAkB,gBAG7B,OAAO,QAAU,WAEjB,IAAI,QAAU,QAAQ,aAEtB,WAAW,QAAU,QACrB,WAAW,QAAU","file":"/npm/kws-rpc-builder@4.3.22/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/kws-rpc-builder@4.3.22/lib/index.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 * (C) Copyright 2014 Kurento (http://kurento.org/)\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the GNU Lesser General Public License\n * (LGPL) version 2.1 which accompanies this distribution, and is available at\n * http://www.gnu.org/licenses/lgpl-2.1.html\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n */\n\nvar EventEmitter = require('events').EventEmitter;\n\nvar inherits = require('inherits');\n\nvar packers = require('./packers');\nvar Mapper = require('./Mapper');\n\n\nconst BASE_TIMEOUT = 5000;\n\n\nfunction unifyResponseMethods(responseMethods)\n{\n  if(!responseMethods) return {};\n\n  for(var key in responseMethods)\n  {\n    var value = responseMethods[key];\n\n    if(typeof value == 'string')\n      responseMethods[key] =\n      {\n        response: value\n      }\n  };\n\n  return responseMethods;\n};\n\nfunction unifyTransport(transport)\n{\n  if(!transport) return;\n\n  // Transport as a function\n  if(transport instanceof Function)\n    return {send: transport};\n\n  // WebSocket & DataChannel\n  if(transport.send instanceof Function)\n    return transport;\n\n  // Message API (Inter-window & WebWorker)\n  if(transport.postMessage instanceof Function)\n  {\n    transport.send = transport.postMessage;\n    return transport;\n  }\n\n  // Stream API\n  if(transport.write instanceof Function)\n  {\n    transport.send = transport.write;\n    return transport;\n  }\n\n  // Transports that only can receive messages, but not send\n  if(transport.onmessage !== undefined) return;\n  if(transport.pause instanceof Function) return;\n\n  throw new SyntaxError(\"Transport is not a function nor a valid object\");\n};\n\n\n/**\n * Representation of a RPC notification\n *\n * @class\n *\n * @constructor\n *\n * @param {String} method -method of the notification\n * @param params - parameters of the notification\n */\nfunction RpcNotification(method, params)\n{\n  Object.defineProperty(this, 'method', {value: method, enumerable: true});\n  Object.defineProperty(this, 'params', {value: params, enumerable: true});\n};\n\n\n/**\n * @class\n *\n * @constructor\n *\n * @param {object} packer\n *\n * @param {object} [options]\n *\n * @param {object} [transport]\n *\n * @param {Function} [onRequest]\n */\nfunction RpcBuilder(packer, options, transport, onRequest)\n{\n  var self = this;\n\n  if(!packer)\n    throw new SyntaxError('Packer is not defined');\n\n  if(!packer.pack || !packer.unpack)\n    throw new SyntaxError('Packer is invalid');\n\n  var responseMethods = unifyResponseMethods(packer.responseMethods);\n\n\n  if(options instanceof Function)\n  {\n    if(transport != undefined)\n      throw new SyntaxError(\"There can't be parameters after onRequest\");\n\n    onRequest = options;\n    transport = undefined;\n    options   = undefined;\n  };\n\n  if(options && options.send instanceof Function)\n  {\n    if(transport && !(transport instanceof Function))\n      throw new SyntaxError(\"Only a function can be after transport\");\n\n    onRequest = transport;\n    transport = options;\n    options   = undefined;\n  };\n\n  if(transport instanceof Function)\n  {\n    if(onRequest != undefined)\n      throw new SyntaxError(\"There can't be parameters after onRequest\");\n\n    onRequest = transport;\n    transport = undefined;\n  };\n\n  if(transport && transport.send instanceof Function)\n    if(onRequest && !(onRequest instanceof Function))\n      throw new SyntaxError(\"Only a function can be after transport\");\n\n  options = options || {};\n\n\n  EventEmitter.call(this);\n\n  if(onRequest)\n    this.on('request', onRequest);\n\n\n  Object.defineProperty(this, 'peerID', {value: options.peerID});\n\n  var max_retries = options.max_retries || 0;\n\n\n  function transportMessage(event)\n  {\n    self.decode(event.data || event);\n  };\n\n  Object.defineProperty(this, 'transport',\n  {\n    get: function()\n    {\n      return transport;\n    },\n\n    set: function(value)\n    {\n      // Remove listener from old transport\n      if(transport)\n      {\n        // W3C transports\n        if(transport.removeEventListener)\n          transport.removeEventListener('message', transportMessage);\n\n        // Node.js Streams API\n        else if(transport.removeListener)\n          transport.removeListener('data', transportMessage);\n      };\n\n      // Set listener on new transport\n      if(value)\n      {\n        // W3C transports\n        if(value.addEventListener)\n          value.addEventListener('message', transportMessage);\n\n        // Node.js Streams API\n        else if(value.addListener)\n          value.addListener('data', transportMessage);\n      };\n\n      transport = unifyTransport(value);\n    }\n  })\n\n  this.transport = transport;\n\n\n  const request_timeout    = options.request_timeout    || BASE_TIMEOUT;\n  const response_timeout   = options.response_timeout   || BASE_TIMEOUT;\n  const duplicates_timeout = options.duplicates_timeout || BASE_TIMEOUT;\n\n\n  var requestID = 0;\n\n  var requests  = new Mapper();\n  var responses = new Mapper();\n  var processedResponses = new Mapper();\n\n  var message2Key = {};\n\n\n  /**\n   * Store the response to prevent to process duplicate request later\n   */\n  function storeResponse(message, id, dest)\n  {\n    var response =\n    {\n      message: message,\n      /** Timeout to auto-clean old responses */\n      timeout: setTimeout(function()\n      {\n        responses.remove(id, dest);\n      },\n      response_timeout)\n    };\n\n    responses.set(response, id, dest);\n  };\n\n  /**\n   * Store the response to ignore duplicated messages later\n   */\n  function storeProcessedResponse(ack, from)\n  {\n    var timeout = setTimeout(function()\n    {\n      processedResponses.remove(ack, from);\n    },\n    duplicates_timeout);\n\n    processedResponses.set(timeout, ack, from);\n  };\n\n\n  /**\n   * Representation of a RPC request\n   *\n   * @class\n   * @extends RpcNotification\n   *\n   * @constructor\n   *\n   * @param {String} method -method of the notification\n   * @param params - parameters of the notification\n   * @param {Integer} id - identifier of the request\n   * @param [from] - source of the notification\n   */\n  function RpcRequest(method, params, id, from, transport)\n  {\n    RpcNotification.call(this, method, params);\n\n    Object.defineProperty(this, 'transport',\n    {\n      get: function()\n      {\n        return transport;\n      },\n\n      set: function(value)\n      {\n        transport = unifyTransport(value);\n      }\n    })\n\n    var response = responses.get(id, from);\n\n    /**\n     * @constant {Boolean} duplicated\n     */\n    if(!(transport || self.transport))\n      Object.defineProperty(this, 'duplicated',\n      {\n        value: Boolean(response)\n      });\n\n    var responseMethod = responseMethods[method];\n\n    this.pack = packer.pack.bind(packer, this, id)\n\n    /**\n     * Generate a response to this request\n     *\n     * @param {Error} [error]\n     * @param {*} [result]\n     *\n     * @returns {string}\n     */\n    this.reply = function(error, result, transport)\n    {\n      // Fix optional parameters\n      if(error instanceof Function || error && error.send instanceof Function)\n      {\n        if(result != undefined)\n          throw new SyntaxError(\"There can't be parameters after callback\");\n\n        transport = error;\n        result = null;\n        error = undefined;\n      }\n\n      else if(result instanceof Function\n      || result && result.send instanceof Function)\n      {\n        if(transport != undefined)\n          throw new SyntaxError(\"There can't be parameters after callback\");\n\n        transport = result;\n        result = null;\n      };\n\n      transport = unifyTransport(transport);\n\n      // Duplicated request, remove old response timeout\n      if(response)\n        clearTimeout(response.timeout);\n\n      if(from != undefined)\n      {\n        if(error)\n          error.dest = from;\n\n        if(result)\n          result.dest = from;\n      };\n\n      var message;\n\n      // New request or overriden one, create new response with provided data\n      if(error || result != undefined)\n      {\n        if(self.peerID != undefined)\n        {\n          if(error)\n            error.from = self.peerID;\n          else\n            result.from = self.peerID;\n        }\n\n        // Protocol indicates that responses has own request methods\n        if(responseMethod)\n        {\n          if(responseMethod.error == undefined && error)\n            message =\n            {\n              error: error\n            };\n\n          else\n          {\n            var method = error\n                       ? responseMethod.error\n                       : responseMethod.response;\n\n            message =\n            {\n              method: method,\n              params: error || result\n            };\n          }\n        }\n        else\n          message =\n          {\n            error:  error,\n            result: result\n          };\n\n        message = packer.pack(message, id);\n      }\n\n      // Duplicate & not-overriden request, re-send old response\n      else if(response)\n        message = response.message;\n\n      // New empty reply, response null value\n      else\n        message = packer.pack({result: null}, id);\n\n      // Store the response to prevent to process a duplicated request later\n      storeResponse(message, id, from);\n\n      // Return the stored response so it can be directly send back\n      transport = transport || this.transport || self.transport;\n\n      if(transport)\n        return transport.send(message);\n\n      return message;\n    }\n  };\n  inherits(RpcRequest, RpcNotification);\n\n\n  function cancel(message)\n  {\n    var key = message2Key[message];\n    if(!key) return;\n\n    delete message2Key[message];\n\n    var request = requests.pop(key.id, key.dest);\n    if(!request) return;\n\n    clearTimeout(request.timeout);\n\n    // Start duplicated responses timeout\n    storeProcessedResponse(key.id, key.dest);\n  };\n\n  /**\n   * Allow to cancel a request and don't wait for a response\n   *\n   * If `message` is not given, cancel all the request\n   */\n  this.cancel = function(message)\n  {\n    if(message) return cancel(message);\n\n    for(var message in message2Key)\n      cancel(message);\n  };\n\n\n  this.close = function()\n  {\n    // Prevent to receive new messages\n    var transport = self.transport;\n    if(transport && transport.close)\n       transport.close();\n\n    // Request & processed responses\n    this.cancel();\n\n    processedResponses.forEach(clearTimeout);\n\n    // Responses\n    responses.forEach(function(response)\n    {\n      clearTimeout(response.timeout);\n    });\n  };\n\n\n  /**\n   * Generates and encode a JsonRPC 2.0 message\n   *\n   * @param {String} method -method of the notification\n   * @param params - parameters of the notification\n   * @param [dest] - destination of the notification\n   * @param {object} [transport] - transport where to send the message\n   * @param [callback] - function called when a response to this request is\n   *   received. If not defined, a notification will be send instead\n   *\n   * @returns {string} A raw JsonRPC 2.0 request or notification string\n   */\n  this.encode = function(method, params, dest, transport, callback)\n  {\n    // Fix optional parameters\n    if(params instanceof Function)\n    {\n      if(dest != undefined)\n        throw new SyntaxError(\"There can't be parameters after callback\");\n\n      callback  = params;\n      transport = undefined;\n      dest      = undefined;\n      params    = undefined;\n    }\n\n    else if(dest instanceof Function)\n    {\n      if(transport != undefined)\n        throw new SyntaxError(\"There can't be parameters after callback\");\n\n      callback  = dest;\n      transport = undefined;\n      dest      = undefined;\n    }\n\n    else if(transport instanceof Function)\n    {\n      if(callback != undefined)\n        throw new SyntaxError(\"There can't be parameters after callback\");\n\n      callback  = transport;\n      transport = undefined;\n    };\n\n    if(self.peerID != undefined)\n    {\n      params = params || {};\n\n      params.from = self.peerID;\n    };\n\n    if(dest != undefined)\n    {\n      params = params || {};\n\n      params.dest = dest;\n    };\n\n    // Encode message\n    var message =\n    {\n      method: method,\n      params: params\n    };\n\n    if(callback)\n    {\n      var id = requestID++;\n      var retried = 0;\n\n      message = packer.pack(message, id);\n\n      function dispatchCallback(error, result)\n      {\n        self.cancel(message);\n\n        callback(error, result);\n      };\n      \n      var request =\n      {\n        message:         message,\n        callback:        dispatchCallback,\n        responseMethods: responseMethods[method] || {}\n      };\n\n      var request =\n      {\n        message:         message,\n        callback:        dispatchCallback,\n        responseMethods: responseMethods[method] || {}\n      };\n\n      var encode_transport = unifyTransport(transport);\n\n      function sendRequest(transport)\n      {\n        request.timeout = setTimeout(timeout,\n                                     request_timeout*Math.pow(2, retried++));\n        message2Key[message] = {id: id, dest: dest};\n        requests.set(request, id, dest);\n\n        transport = transport || encode_transport || self.transport;\n        if(transport)\n          return transport.send(message);\n\n        return message;\n      };\n\n      function retry(transport)\n      {\n        transport = unifyTransport(transport);\n\n        console.warn(retried+' retry for request message:',message);\n\n        var timeout = processedResponses.pop(id, dest);\n        clearTimeout(timeout);\n\n        return sendRequest(transport);\n      };\n\n      function timeout()\n      {\n        if(retried < max_retries)\n          return retry(transport);\n\n        var error = new Error('Request has timed out');\n            error.request = message;\n\n        error.retry = retry;\n\n        dispatchCallback(error)\n      };\n\n      return sendRequest(transport);\n    };\n\n    // Return the packed message\n    message = packer.pack(message);\n\n    transport = transport || self.transport;\n    if(transport)\n      return transport.send(message);\n\n    return message;\n  };\n\n  /**\n   * Decode and process a JsonRPC 2.0 message\n   *\n   * @param {string} message - string with the content of the message\n   *\n   * @returns {RpcNotification|RpcRequest|undefined} - the representation of the\n   *   notification or the request. If a response was processed, it will return\n   *   `undefined` to notify that it was processed\n   *\n   * @throws {TypeError} - Message is not defined\n   */\n  this.decode = function(message, transport)\n  {\n    if(!message)\n      throw new TypeError(\"Message is not defined\");\n\n    try\n    {\n      message = packer.unpack(message);\n    }\n    catch(e)\n    {\n      // Ignore invalid messages\n      return console.debug(e, message);\n    };\n\n    var id     = message.id;\n    var ack    = message.ack;\n    var method = message.method;\n    var params = message.params || {};\n\n    var from = params.from;\n    var dest = params.dest;\n\n    // Ignore messages send by us\n    if(self.peerID != undefined && from == self.peerID) return;\n\n    // Notification\n    if(id == undefined && ack == undefined)\n    {\n      var notification = new RpcNotification(method, params);\n\n      if(self.emit('request', notification)) return;\n      return notification;\n    };\n\n\n    function processRequest()\n    {\n      // If we have a transport and it's a duplicated request, reply inmediatly\n      transport = unifyTransport(transport) || self.transport;\n      if(transport)\n      {\n        var response = responses.get(id, from);\n        if(response)\n          return transport.send(response.message);\n      };\n\n      var idAck = (id != undefined) ? id : ack;\n      var request = new RpcRequest(method, params, idAck, from, transport);\n\n      if(self.emit('request', request)) return;\n      return request;\n    };\n\n    function processResponse(request, error, result)\n    {\n      request.callback(error, result);\n    };\n\n    function duplicatedResponse(timeout)\n    {\n      console.warn(\"Response already processed\", message);\n\n      // Update duplicated responses timeout\n      clearTimeout(timeout);\n      storeProcessedResponse(ack, from);\n    };\n\n\n    // Request, or response with own method\n    if(method)\n    {\n      // Check if it's a response with own method\n      if(dest == undefined || dest == self.peerID)\n      {\n        var request = requests.get(ack, from);\n        if(request)\n        {\n          var responseMethods = request.responseMethods;\n\n          if(method == responseMethods.error)\n            return processResponse(request, params);\n\n          if(method == responseMethods.response)\n            return processResponse(request, null, params);\n\n          return processRequest();\n        }\n\n        var processed = processedResponses.get(ack, from);\n        if(processed)\n          return duplicatedResponse(processed);\n      }\n\n      // Request\n      return processRequest();\n    };\n\n    var error  = message.error;\n    var result = message.result;\n\n    // Ignore responses not send to us\n    if(error  && error.dest  && error.dest  != self.peerID) return;\n    if(result && result.dest && result.dest != self.peerID) return;\n\n    // Response\n    var request = requests.get(ack, from);\n    if(!request)\n    {\n      var processed = processedResponses.get(ack, from);\n      if(processed)\n        return duplicatedResponse(processed);\n\n      return console.warn(\"No callback was defined for this message\", message);\n    };\n\n    // Process response\n    processResponse(request, error, result);\n  };\n};\ninherits(RpcBuilder, EventEmitter);\n\n\nRpcBuilder.RpcNotification = RpcNotification;\n\n\nmodule.exports = RpcBuilder;\n\nvar clients = require('./clients');\n\nRpcBuilder.clients = clients;\nRpcBuilder.packers = packers;\n"]}