{"version":3,"sources":["jsdelivr-header.js","/npm/mixin-node-rsa@1.0.32/index.js"],"names":[],"mappings":"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","file":"/npm/mixin-node-rsa@1.0.32/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.19.2.\n * Original file: /npm/mixin-node-rsa@1.0.32/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","'use strict';\n\nconst request = require('request');\nconst Uint64LE = require(\"int64-buffer\").Uint64LE;\nconst jwt = require('jsonwebtoken');\nconst crypto = require('crypto');\nconst fs = require('fs');\nconst zlib = require(\"zlib\");\nconst wsreconnect = require('./ws-reconnect');\nconst WebSocket = require('ws');\nconst interval = require('interval-promise');\nconst Account = require('./account');\n\nconst requestHandler = require('./requestHandler');\nconst rfc3339nano = require('rfc3339nano');\n\nlet MIXINNODE = function(opts) {\n  let self = this;\n  self.pullNetworkflag = false;\n  opts = opts || {};\n  self.pin = opts.pin;\n  self.aeskey = opts.aeskey;\n  self.client_id = opts.client_id;\n  self.session_id = opts.session_id;\n  self.timeout = opts.timeout || 3600;\n  if (opts.client_secret)\n    self.client_secret = opts.client_secret;\n  if (opts.share_secret)\n    self.share_secret = opts.share_secret;\n\n  if (typeof opts.privatekey == \"string\") {\n    const cert = fs.readFileSync(opts.privatekey);\n    self.privatekey = cert;\n  } else if (typeof opts.privatekey == \"object\") {\n    self.privatekey = opts.privatekey;\n  }\n  if (!self.pin || !self.aeskey || !self.client_id || !self.session_id || !self.privatekey) {\n    throw (\"pin, aeskey, client_id, session_id, privatekey are require fields\");\n  }\n  self.account = new Account(opts);\n\n  self.encryptPIN = () => {\n    return this.account.encryptCustomPIN(self.pin, self.aeskey);\n  }\n\n  // https://developers.mixin.one/api/h-conversations/create-conversation/\n  // https://github.com/wangshijun/mixin-node-client/blob/f1c22b34c939b694db9cec72db3e941da10ac77e/lib/base.js\n  self.newConversationId = (userId, recipientId) => {\n    userId = userId.toString();\n    recipientId = recipientId.toString();\n    let [minId, maxId] = [userId, recipientId];\n    if (minId > maxId) {\n      [minId, maxId] = [recipientId, userId];\n    }\n    const hash = crypto.createHash('md5');\n    hash.update(minId);\n    hash.update(maxId);\n    const bytes = hash.digest();\n    bytes[6] = (bytes[6] & 0x0f) | 0x30;\n    bytes[8] = (bytes[8] & 0x3f) | 0x80;\n    // eslint-disable-next-line unicorn/prefer-spread\n    const digest = Array.from(bytes, byte => `0${(byte & 0xff).toString(16)}`.slice(-2)).join('');\n    const uuid = `${digest.slice(0, 8)}-${digest.slice(8, 12)}-${digest.slice(12, 16)}-${digest.slice(\n      16,\n      20\n    )}-${digest.slice(20, 32)}`;\n    return uuid;\n  };\n\n  self.transferFromBot = (asset_id, recipient_id, amount, memo) => {\n    return new Promise((resolve, reject) => {\n      const seconds = Math.floor(Date.now() / 1000);\n      const seconds_exp = Math.floor(Date.now() / 1000) + self.timeout;\n      if (!memo)\n        memo = \"\";\n      if (typeof amount == 'number')\n        amount = amount + '';\n      let encrypted_pin = self.encryptPIN();\n      let transfer_json =\n      {\n        asset_id: asset_id,\n        counter_user_id: recipient_id,\n        amount: amount,\n        pin: encrypted_pin,\n        trace_id: self.uuidv4()\n      };\n\n      if (memo != \"\")\n        transfer_json[\"memo\"] = memo;\n      let transfer_json_str = JSON.stringify(transfer_json);\n      let transfer_sig_str = \"POST/transfers\" + transfer_json_str;\n      let transfer_sig_sha256 = crypto.createHash('sha256').update(transfer_sig_str).digest(\"hex\");\n\n      let payload = {\n        uid: self.client_id, //bot account id\n        sid: self.session_id,\n        iat: seconds,\n        exp: seconds_exp,\n        jti: self.uuidv4(),\n        sig: transfer_sig_sha256,\n        scp: 'FULL',\n      };\n      let token = jwt.sign(payload, self.privatekey, { algorithm: 'RS512' });\n\n      let options = {\n        url: 'https://api.mixin.one/transfers',\n        method: \"POST\",\n        body: transfer_json_str,\n        headers: {\n          'Authorization': 'Bearer ' + token,\n          'Content-Type': 'application/json'\n        }\n      }\n      request(options, function(err, httpResponse, body) {\n        requestHandler(err, body, resolve, reject);\n      })\n\n    });\n  }\n\n  self.readAssets = (asset_id) => {\n    return new Promise((resolve, reject) => {\n      const seconds = Math.floor(Date.now() / 1000);\n      const seconds_exp = Math.floor(Date.now() / 1000) + self.timeout;\n      // let encrypted_pin = self.encryptPIN();\n      let transfer_sig_str = \"GET/assets\";\n\n      let url = 'https://api.mixin.one/assets';\n      if (asset_id && asset_id.length == 36) {\n        transfer_sig_str = \"GET/assets/\" + asset_id;\n        url = 'https://api.mixin.one/assets/' + asset_id;\n      }\n      let transfer_sig_sha256 = crypto.createHash('sha256').update(transfer_sig_str).digest(\"hex\");\n\n      let payload = {\n        uid: self.client_id, //bot account id\n        sid: self.session_id,\n        iat: seconds,\n        exp: seconds_exp,\n        jti: self.uuidv4(),\n        sig: transfer_sig_sha256,\n        scp: 'FULL',\n      };\n      let token = jwt.sign(payload, self.privatekey, { algorithm: 'RS512' });\n\n      let options = {\n        url: url,\n        method: \"GET\",\n        headers: {\n          'Authorization': 'Bearer ' + token,\n          'Content-Type': 'application/json'\n        }\n      }\n      request(options, function(err, httpResponse, body) {\n        requestHandler(err, body, resolve, reject);\n      })\n\n    });\n  }\n\n  self.readProfile = (access_token) => {\n    return new Promise((resolve, reject) => {\n      let url = 'https://api.mixin.one/me';\n      let token = \"\";\n      if (!access_token) {\n        const seconds = Math.floor(Date.now() / 1000);\n        const seconds_exp = Math.floor(Date.now() / 1000) + self.timeout;\n        let encrypted_pin = self.encryptPIN();\n        let transfer_sig_str = \"GET/me\";\n        let transfer_sig_sha256 = crypto.createHash('sha256').update(transfer_sig_str).digest(\"hex\");\n\n        let payload = {\n          uid: self.client_id, //bot account id\n          sid: self.session_id,\n          iat: seconds,\n          exp: seconds_exp,\n          jti: self.uuidv4(),\n          sig: transfer_sig_sha256,\n          scp: 'FULL',\n        };\n        token = jwt.sign(payload, self.privatekey, { algorithm: 'RS512' });\n      } else {\n        token = access_token;\n      }\n\n      let options = {\n        url: url,\n        method: \"GET\",\n        headers: {\n          'Authorization': 'Bearer ' + token,\n          'Content-Type': 'application/json'\n        }\n      }\n      request(options, function(err, httpResponse, body) {\n        requestHandler(err, body, resolve, reject);\n      });\n\n    });\n  }\n\n  self.readNetworkSnapshots = (offset, asset, limit, order) => {\n    return new Promise((resolve, reject) => {\n      let _order = \"DESC\";\n      if (order)\n        _order = order;\n\n      let path = `/network/snapshots?limit=${limit}&offset=${offset}&order=${_order}`;\n      if (asset && asset != \"\")\n        path = path + `&asset=${asset}`;\n      let url = \"https://api.mixin.one\" + path;\n      let token = self.tokenGET(path, \"\");\n      let options = {\n        url: url,\n        method: \"GET\",\n        headers: {\n          'Authorization': 'Bearer ' + token,\n          'Content-Type': '0'\n        }\n      }\n      request(options, function(err, httpResponse, body) {\n        requestHandler(err, body, resolve, reject);\n      });\n    });\n  };\n\n  self.readNetworkTransfer = (trace_id) => {\n    return new Promise((resolve, reject) => {\n      let path = `/transfers/trace/${trace_id}`;\n      let url = \"https://api.mixin.one\" + path;\n      let token = self.tokenGET(path, \"\");\n      let options = {\n        url: url,\n        method: \"GET\",\n        headers: {\n          'Authorization': 'Bearer ' + token,\n          'Content-Type': '0'\n        }\n      }\n      request(options, function(err, httpResponse, body) {\n        requestHandler(err, body, resolve, reject);\n      });\n    });\n  };\n\n  self.readNetworkSnapshot = (snapshot_id, view_token) => {\n    return new Promise((resolve, reject) => {\n      let path = `/network/snapshots/${snapshot_id}`;\n      let url = \"https://api.mixin.one\" + path;\n      let token = view_token || self.tokenGET(path, \"\");\n      let options = {\n        url: url,\n        method: \"GET\",\n        headers: {\n          'Authorization': 'Bearer ' + token,\n          'Content-Type': '0'\n        }\n      }\n      request(options, function(err, httpResponse, body) {\n        requestHandler(err, body, resolve, reject);\n      });\n    });\n  };\n\n  self.requestAccessToken = (code) => {\n    return new Promise((resolve, reject) => {\n      let auth_json = {\n        client_id: self.client_id,\n        code: code,\n        client_secret: self.client_secret\n      };\n      let auth_json_str = JSON.stringify(auth_json);\n      let options = {\n        url: 'https://api.mixin.one/oauth/token',\n        method: \"POST\",\n        body: auth_json_str,\n        headers: {\n          'Content-Type': 'application/json'\n        }\n      }\n      request(options, function(err, httpResponse, body) {\n        requestHandler(err, body, resolve, reject);\n      })\n    });\n  }\n\n  self.searchUser = (idOrPhone) => {\n    return new Promise((resolve, reject) => {\n      let path = `/search/${idOrPhone}`;\n      let url = \"https://api.mixin.one\" + path;\n      let token = self.tokenGET(path, \"\");\n      let options = {\n        url: url,\n        method: \"GET\",\n        headers: {\n          'Authorization': 'Bearer ' + token,\n          'Content-Type': '0'\n        }\n      }\n      request(options, function(err, httpResponse, body) {\n        requestHandler(err, body, resolve, reject);\n      });\n    });\n  };\n\n  self.jwtToken = (method, uri, body, opts) => {\n    let transfer_sig_str = method + uri + body;\n    let transfer_sig_sha256 = crypto.createHash('sha256').update(transfer_sig_str).digest(\"hex\");\n\n    const seconds = Math.floor(Date.now() / 1000);\n    let time = new Uint64LE(seconds);\n    let seconds_exp = Math.floor(Date.now() / 1000) + self.timeout;\n    if (opts && opts.timeout)\n      seconds_exp = Math.floor(Date.now() / 1000) + opts.timeout;\n\n    let payload = {\n      uid: self.client_id, //bot account id\n      sid: self.session_id,\n      iat: seconds,\n      exp: seconds_exp,\n      jti: self.uuidv4(),\n      sig: transfer_sig_sha256,\n      scp: 'FULL',\n    };\n    //console.log(payload);\n    let token = jwt.sign(payload, self.privatekey, { algorithm: 'RS512' });\n    return token;\n  }\n\n  self.tokenGET = (uri, body, opts) => {\n    return this.jwtToken(\"GET\", uri, body, opts);\n  }\n\n  self.uuidv4 = () => {\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n      var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\n      return v.toString(16);\n    });\n  }\n\n  self.ws_send = (message) => {\n    return new Promise((resolve, reject) => {\n      try {\n        let buf = new Buffer(JSON.stringify(message), 'utf-8');\n        zlib.gzip(buf, function(_, zippedmsg) {\n          if (self.ws.socket.readyState == WebSocket.OPEN) {\n            self.ws.send(zippedmsg);\n            resolve();\n          } else {\n            reject(\"websocket_not_ready\");\n          }\n        });\n      } catch (err) {\n        reject(err);\n      }\n    });\n  }\n\n  self.send_ACKNOWLEDGE_MESSAGE_RECEIPT = (message_id) => {\n    return new Promise((resolve, reject) => {\n      try {\n        let id = self.uuidv4();\n        let message = {\n          \"id\": id,\n          \"action\": \"ACKNOWLEDGE_MESSAGE_RECEIPT\",\n          \"params\": {\n            \"message_id\": message_id,\n            \"status\": \"READ\"\n          }\n        }\n        self.ws_send(message).then(function() {\n          resolve(id);\n        }).catch(function(err) {\n          reject(err);\n        });\n      } catch (err) {\n        reject(err);\n      }\n    });\n  }\n\n  self.send_LIST_PENDING_MESSAGES = () => {\n    return new Promise((resolve, reject) => {\n      try {\n        let id = self.uuidv4();\n        let message = {\n          \"id\": id,\n          \"action\": \"LIST_PENDING_MESSAGES\"\n        }\n        self.ws_send(message).then(function() {\n          resolve(id);\n        }).catch(function(err) {\n          reject(err);\n        });\n      } catch (err) {\n        reject(err);\n      }\n    });\n  };\n\n  self.send_CREATE_MESSAGE = (opts, msgobj, options) => {\n    return new Promise((resolve, reject) => {\n      options = options || {};\n      try {\n        let message_id = self.uuidv4();\n        let params = { \"conversation_id\": msgobj.data.conversation_id || self.newConversationId(self.client_id, msgobj.data.user_id), \"recipient_id\": msgobj.data.user_id, \"message_id\": message_id, \"category\": opts.category, \"data\": opts.data }\n        let message = { id: self.uuidv4(), \"action\": \"CREATE_MESSAGE\", params: params }\n\n        if (options.http) {\n          const seconds = Math.floor(Date.now() / 1000);\n          const seconds_exp = Math.floor(Date.now() / 1000) + self.timeout;\n          let message_json_str = JSON.stringify([params]);\n          let message_sig_str = \"POST/messages\" + message_json_str;\n          let message_sig_sha256 = crypto.createHash('sha256').update(message_sig_str).digest(\"hex\");\n          let payload = {\n            uid: self.client_id, //bot account id\n            sid: self.session_id,\n            iat: seconds,\n            exp: seconds_exp,\n            jti: self.uuidv4(),\n            sig: message_sig_sha256,\n            scp: 'FULL',\n          };\n          let token = jwt.sign(payload, self.privatekey, { algorithm: 'RS512' });\n          let options = {\n            url: 'https://api.mixin.one/messages',\n            method: \"POST\",\n            body: message_json_str,\n            headers: {\n              'Authorization': 'Bearer ' + token,\n              'Content-Type': 'application/json'\n            }\n          }\n          return request(options, function(err, httpResponse, body) {\n            requestHandler(err, body, resolve, reject);\n          })\n        }\n\n        self.ws_send(message).then(function() {\n          resolve(message_id);\n        }).catch(function(err) {\n          reject(err);\n        });\n      } catch (err) {\n        reject(err);\n      }\n    });\n  };\n\n  self.wsopts = () => {\n    let token = self.tokenGET(\"/\", \"\");\n    let options = {\n      headers: {\n        \"Authorization\": \"Bearer \" + token,\n        \"perMessageDeflate\": false\n      }\n    }\n    return options;\n  }\n\n  self.startws = () => {\n    self.ws = new wsreconnect('wss://blaze.mixin.one/', 'Mixin-Blaze-1', self, {});\n    self.ws.on(\"error\", (event) => {\n      if (self.onError) {\n        self.onError(event);\n      }\n    });\n    self.ws.on(\"closed\", (event) => {\n      if (self.onClosed) {\n        self.onClosed(event);\n      }\n    });\n    self.ws.on(\"reconnect\", () => {\n      if (self.onReconnect) {\n        self.onReconnect();\n      }\n    });\n    self.ws.on(\"connect\", () => {\n      if (self.onConnect) {\n        self.onConnect();\n      }\n    });\n    self.ws.on(\"destroyed\", (event) => {\n      if (self.onDestroyed) {\n        self.onDestroyed(event);\n      }\n    });\n    self.ws.on(\"message\", (data) => {\n      if (self.onMessage) {\n        self.onMessage(data);\n      }\n    });\n    self.ws.start();\n    return self.ws;\n  }\n}\n\nMIXINNODE.prototype.Assets = function(asset_id) {\n  return this.readAssets(asset_id);\n}\n\nMIXINNODE.prototype.readProfile = function(access_token) {\n  return this.readProfile(access_token);\n}\n\nMIXINNODE.prototype.transferFromBot = function() {\n  return this.transferFromBot(asset_id, recipient_id, amount, memo);\n}\nMIXINNODE.prototype.authTokenGET = function(uri, body) {\n  return this.tokenGET(uri, body);\n}\nMIXINNODE.prototype.newuuid = function() {\n  return this.uuidv4();\n}\n\nMIXINNODE.prototype.decode = function(data) {\n  return new Promise((resolve, reject) => {\n    try {\n      zlib.gunzip(data, function(err, dezipped) {\n        let msgobj = JSON.parse(dezipped.toString());\n        resolve(msgobj);\n      })\n    } catch (err) {\n      reject(err);\n    }\n  });\n}\n\nMIXINNODE.prototype.start = function() {\n  return this.startws();\n}\n\nMIXINNODE.prototype.getwsopts = function() {\n  return this.wsopts();\n}\n\nMIXINNODE.prototype.sendText = function(text, msgobj, options) {\n  let opts = {};\n  opts.category = \"PLAIN_TEXT\";\n  opts.data = new Buffer(text).toString('base64');\n  return this.send_CREATE_MESSAGE(opts, msgobj, options);\n}\n\nMIXINNODE.prototype.sendImage = function(base64data, msgobj, options) {\n  let opts = {};\n  opts.category = \"PLAIN_IMAGE\";\n  opts.data = base64data;\n  return this.send_CREATE_MESSAGE(opts, msgobj, options);\n}\n\nMIXINNODE.prototype.sendButton = function(text, msgobj, options) {\n  let opts = {};\n  opts.category = \"APP_BUTTON_GROUP\";\n  opts.data = new Buffer(text).toString('base64');\n  return this.send_CREATE_MESSAGE(opts, msgobj, options);\n}\n\nMIXINNODE.prototype.sendCard = function(text, msgobj, options) {\n  let opts = {};\n  opts.category = \"APP_CARD\";\n  opts.data = new Buffer(text).toString('base64');\n  return this.send_CREATE_MESSAGE(opts, msgobj, options);\n}\n\nMIXINNODE.prototype.sendMsg = function(action, opts) {\n  switch (action) {\n    case \"ACKNOWLEDGE_MESSAGE_RECEIPT\":\n      return this.send_ACKNOWLEDGE_MESSAGE_RECEIPT(opts.message_id);\n    case \"LIST_PENDING_MESSAGES\":\n      return this.send_LIST_PENDING_MESSAGES();\n\n    default:\n      return \"\";\n  }\n}\n\nMIXINNODE.prototype.requestAccessToken = function(code) {\n  return this.requestAccessToken(code);\n}\n\nMIXINNODE.prototype.searchUser = function(idOrPhone) {\n  return this.searchUser(idOrPhone);\n}\n\nMIXINNODE.prototype.readSnapshots = function(offset, asset, limit, order) {\n  return this.readNetworkSnapshots(offset, asset, limit, order);\n}\n\nMIXINNODE.prototype.readTransfer = function(trace_id) {\n  return this.readNetworkTransfer(trace_id);\n}\n\nMIXINNODE.prototype.readSnapshot = function(snapshot_id, view_token) {\n  return this.readNetworkSnapshot(snapshot_id, view_token);\n}\n\nMIXINNODE.prototype.getViewToken = function(uri, opts) {\n  return this.tokenGET(uri, \"\", opts);\n}\n\n\nMIXINNODE.prototype.signJWT = function(payload) {\n  let token = jwt.sign(payload, this.share_secret);\n  return token;\n}\n\nMIXINNODE.prototype.startPullNetwork = function(timeinterval, opts, eventHandler) {\n  this.pullNetworkflag = true;\n  interval(async (iteration, stop) => {\n    if (this.pullNetworkflag == false) {\n      stop()\n    } else {\n\n      let session = {};\n      try {\n        session = JSON.parse(fs.readFileSync('session.json', 'utf8'));\n      } catch (err) {\n        if (opts.offset)\n          session = { offset: offset };\n        else {\n          let current = new Date();\n          session = { offset: current.toISOString() };\n          let json = JSON.stringify(session);\n          fs.writeFileSync('session.json', json, 'utf8');\n        }\n      }\n\n      try {\n        let results = await this.readNetworkSnapshots(\n          rfc3339nano.adjustRfc3339ByNano(session.offset, 1),\n          opts.asset_id, opts.limit, opts.order\n        );\n        results = results.data;\n        for (let i in results) {\n          session.offset = results[i].created_at;\n          if (results[i].user_id) {\n            eventHandler(results[i]);\n          }\n\n          let json = JSON.stringify(session);\n          fs.writeFileSync('session.json', json, 'utf8');\n        }\n      } catch (err) {\n        console.log(err);\n      }\n\n    }\n\n  }, timeinterval);\n}\n\nMIXINNODE.prototype.stopPullNetwork = function() {\n  this.pullNetworkflag = false;\n}\n\nmodule.exports = MIXINNODE;\n"]}