{"version":3,"sources":["jsdelivr-header.js","/npm/node-xmpp-caps@0.0.2/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;ACCA,aAEA,IAAI,OAAS,QAAQ,UACjB,QAAU,QAAQ,OAAO,QAE7B,SAAS,aAAa,EAAO,GAC3B,EAAM,MAAK,SAAS,EAAG,GACrB,OAAG,EAAE,GAAY,EAAE,IACT,EAEP,EAAE,GAAY,EAAE,GACV,EAEF,CACT,GACF,CAEA,SAAS,eAAe,GACtB,aAAa,EAAK,YAClB,aAAa,EAAK,QAClB,aAAa,EAAK,OACpB,CASA,SAAS,KAAK,EAAM,GAGlB,GAFA,KAAK,MAAQ,GAAQ,SAAS,cAEb,UAAd,KAAK,KACN,MAAM,IAAI,MAAM,2DAGlB,KAAK,KAAO,EACZ,KAAK,WAAa,GAClB,KAAK,SAAW,EAClB,CAwGA,SAAS,cAAc,GACrB,IACI,EAAO,IAAI,KADJ,EAAM,MAAM,KAAK,MAAM,KAAK,IAEnC,EAAa,EAAM,YAAY,YAC/B,EAAW,EAAM,YAAY,WASjC,OAPA,EAAW,SAAQ,SAAS,GAC1B,EAAK,YAAY,EAAG,MAAM,SAAU,EAAG,MAAM,KAAM,EAAG,MAAM,KAAM,EAAG,MAAM,KAC7E,IACA,EAAS,SAAQ,SAAS,GACxB,EAAK,WAAW,EAAQ,MAAM,IAChC,IAEO,CACT,CA1GA,KAAK,UAAU,YAAc,SAAS,EAAU,EAAM,EAAM,GAQ1D,OAPA,KAAK,WAAW,KAAK,CACnB,SAAU,EACV,KAAM,EACN,KAAM,EACN,KAAM,IAGD,IACT,EASA,KAAK,UAAU,WAAa,SAAS,GAGnC,OAFA,KAAK,SAAS,KAAK,GAEZ,IACT,EAMA,KAAK,UAAU,oBAAsB,WACnC,IAAI,EAAM,GAEV,eAAe,KAAK,YACpB,KAAK,SAAS,OAEd,KAAK,WAAW,SAAQ,SAAS,GAC/B,GAAO,EAAG,SAAW,IAAM,EAAG,KAAO,KAClC,EAAG,MAAQ,IAAM,KAAO,EAAG,MAAQ,IACtC,GAAO,GACT,IACA,GAAO,KAAK,SAAS,KAAK,KAC1B,GAAO,IAEP,IAAI,EAAM,OAAO,WAAW,QAG5B,OAFA,EAAI,OAAO,GACX,EAAM,EAAI,OAAO,UAAU,UAE7B,EAOA,KAAK,UAAU,WAAa,WAC1B,OAAO,IAAI,QAAQ,IAAK,CACtB,MAAO,kCACP,KAAM,KAAK,KACX,KAAM,KAAK,KACX,IAAK,KAAK,uBAEd,EAOA,KAAK,UAAU,YAAc,WAC3B,IAAI,EAAK,IAAI,QAAQ,QAAS,CAC5B,MAAO,wCACP,KAAM,KAAK,KAAO,IAAM,KAAK,wBAY/B,OATA,KAAK,WAAW,SAAQ,SAAS,GAC/B,EAAG,EAAE,WAAY,GAAI,IACvB,IACA,KAAK,SAAS,SAAQ,SAAS,GAC7B,EAAG,EAAE,UAAW,CACd,IAAK,IACJ,IACL,IAEO,CACT,EAyBA,OAAO,QAAU,CACf,KAAM,KACN,cAAe","file":"/npm/node-xmpp-caps@0.0.2/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/node-xmpp-caps@0.0.2/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 * XEP-0115 Entity capabilities implementation\n *\n * @author Michael Weibel <michael.weibel@gmail.com>\n * @copyright Mila AG\n * @license MIT\n */\n'use strict';\n\nvar crypto = require('crypto')\n  , Element = require('ltx').Element;\n\nfunction sortProperty(array, property) {\n  array.sort(function(a, b) {\n    if(a[property] > b[property]) {\n      return -1;\n    }\n    if(a[property] < b[property]) {\n      return 1;\n    }\n    return 0;\n  });\n}\n\nfunction sortIdentities(ids) {\n  sortProperty(ids, 'category');\n  sortProperty(ids, 'type');\n  sortProperty(ids, 'lang');\n}\n\n/**\n * Capabilities\n *\n * @param {String} node Software identifier\n * @param {String} [hash=sha-1] Hash to generate the version string (only sha-1 supported as of now)\n * @constructor\n */\nfunction Caps(node, hash) {\n  this.hash = (hash || 'sha-1').toLowerCase();\n\n  if(this.hash !== 'sha-1') {\n    throw new Error('Invalid argument provided for hash. Only sha-1 suported');\n  }\n\n  this.node = node;\n  this.identities = [];\n  this.features = [];\n}\n\n/**\n * Add an identity\n *\n * @param {String} category\n * @param {String} type\n * @param {String} [name]\n * @param {String} [lang]\n *\n * @returns {Caps}\n */\nCaps.prototype.addIdentity = function(category, type, name, lang) {\n  this.identities.push({\n    category: category,\n    type: type,\n    lang: lang,\n    name: name\n  });\n\n  return this;\n};\n\n/**\n * Add supported feature\n *\n * @param {String} name Feature name (aka 'var')\n *\n * @returns {Caps}\n */\nCaps.prototype.addFeature = function(name) {\n  this.features.push(name);\n\n  return this;\n};\n\n/**\n * Generates the version hash\n * @returns {String}\n */\nCaps.prototype.generateVersionHash = function() {\n  var str = '';\n\n  sortIdentities(this.identities);\n  this.features.sort();\n\n  this.identities.forEach(function(id) {\n    str += id.category + '/' + id.type + '/' +\n      (id.lang || '') + '/' + (id.name || '');\n    str += '<';\n  });\n  str += this.features.join('<');\n  str += '<';\n\n  var ver = crypto.createHash('sha1');\n  ver.update(str);\n  ver = ver.digest('base64').toString();\n  return ver;\n};\n\n/**\n * Creates a 'c' node to be used in presence stanzas.\n *\n * @returns {Object}\n */\nCaps.prototype.toCapsNode = function() {\n  return new Element('c', {\n    xmlns: 'http://jabber.org/protocol/caps',\n    hash: this.hash,\n    node: this.node,\n    ver: this.generateVersionHash()\n  });\n};\n\n/**\n * Generates a disco#info query node from the identities and features we got.\n *\n * @returns {Element}\n */\nCaps.prototype.toQueryNode = function() {\n  var el = new Element('query', {\n    xmlns: 'http://jabber.org/protocol/disco#info',\n    node: this.node + '#' + this.generateVersionHash()\n  });\n\n  this.identities.forEach(function(id) {\n    el.c('identity', id).up();\n  });\n  this.features.forEach(function(name) {\n    el.c('feature', {\n      var: name\n    }).up();\n  });\n\n  return el;\n};\n\n/**\n * Creates a {Caps} from an XML node\n *\n * @param {Object} node\n *\n * @returns {Caps}\n */\nfunction fromQueryNode(query) {\n  var node = query.attrs.node.split('#')[0];\n  var caps = new Caps(node);\n  var identities = query.getChildren('identity');\n  var features = query.getChildren('feature');\n\n  identities.forEach(function(id) {\n    caps.addIdentity(id.attrs.category, id.attrs.type, id.attrs.name, id.attrs.lang);\n  });\n  features.forEach(function(feature) {\n    caps.addFeature(feature.attrs.var);\n  });\n\n  return caps;\n}\n\nmodule.exports = {\n  Caps: Caps,\n  fromQueryNode: fromQueryNode\n};\n"]}