{"version":3,"sources":["jsdelivr-header.js","/npm/pokemap@1.3.6/index.js"],"names":[],"mappings":"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","file":"/npm/pokemap@1.3.6/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.19.2.\n * Original file: /npm/pokemap@1.3.6/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\nvar express = require('express');\nvar JWT = require('jsonwebtoken');\nvar PokemonGo = require('pokemon-go-node-api');\nvar bodyParser = require('body-parser');\nvar crypto = require('crypto');\n\nrequire('./lib/pokeio-hotfix').fix(PokemonGo);\n\nmodule.exports.create = function (options) {\n\nvar app = express();\nvar keypair = options.keypair;\nvar secret = crypto.pbkdf2Sync(keypair.privateKeyPem, '', 1, 16, 'sha256');\nvar iv = Buffer.alloc(16); // all zeros\n\nfunction createDemoToken(expIn) {\n  var cipher = crypto.createCipheriv('aes128', secret, iv);\n  var localToken = JWT.sign(\n    { exp: Math.round(new Date(Date.now() + (expIn * 1000)) / 1000)\n\n    , username: 'demo'\n    , password: cipher.update('demo', 'utf8', 'base64') + cipher.final('base64')\n    , provider: 'demo'\n\n    , accessToken: '---'\n    , accessTokenExpires: '---'\n    , apiEndpoint: '---'\n    }\n  , keypair.privateKeyPem\n  , { algorithm: 'RS256'}\n  );\n\n  return localToken;\n}\n\nvar demoToken = createDemoToken((365 * 24 * 60 * 60));\n\nfunction postLogin(req, res) {\n  if (\n      'demo' === req.body.username\n    || 'demo' === req.body.password\n    || 'demo' === req.body.provider\n    || 'user' === req.body.username\n    || 'password' === req.body.password\n  ) {\n    var expIn = (365 * 24 * 60 * 60);\n    var localToken = createDemoToken(expIn);\n    res.send({ access_token: localToken, expires_in: expIn });\n    return;\n  }\n\n  var pokeio = new PokemonGo.Pokeio();\n\n  // location = { latitude, longitude, altitude, type(coords|name), name }\n  // provider = ptc | google\n  //pokeio.init(req.body.username, req.body.password, req.body.location, req.body.provider, function (err) {\n  pokeio.Login(\n    req.body.username\n  , req.body.password\n  , req.body.provider\n  , function (err/*, { username, password, provider, accessToken, apiEndpoint }*/) {\n    // Note: stores accessToken as self.playerInfo.accessToken\n    if (err) {\n      res.send({ error: { message: err.toString() } });\n      return;\n    }\n\n    // TODO use JWT and database\n    //var expIn = (15 * 60);\n    var expIn = (365 * 24 * 60 * 60);\n    var expAt = new Date(Date.now() + (expIn * 1000)).valueOf();\n    var session = PokemonGo.serialize(pokeio);\n    var cipher = crypto.createCipheriv('aes128', secret, iv);\n\n    if (!session.accessToken) {\n      console.log('LOGIN session ERROR:');\n      console.log(session);\n\n      res.send({ error: { message: \"Login failed. Servers may be unavailable or login may be invalide.\" } });\n      return;\n    }\n\n    if (/null/.test(session.apiEndpoint)) {\n      console.log('LOGIN session ERROR:');\n      console.log(session);\n\n      res.send({ error: { message: \"API Endpoint servers are not currently available. Try again later.\" } });\n      return;\n    }\n\n    var localToken = JWT.sign(\n      { exp: Math.round(expAt / 1000)\n\n      , username: req.body.username\n      , password: cipher.update(req.body.password, 'utf8', 'base64') + cipher.final('base64')\n      , provider: req.body.provider\n\n      , accessToken: session.accessToken\n      , accessTokenExpires: session.accessTokenExpires\n      , apiEndpoint: session.apiEndpoint\n      }\n    , keypair.privateKeyPem\n    , { algorithm: 'RS256'}\n    );\n\n    res.send({ access_token: localToken, expires_in: expIn });\n  });\n}\n\nfunction mockData(loc) {\n  var data = JSON.parse(JSON.stringify(require('./utils/demo.json')));\n  var ms = Date.now();\n\n  loc.lat = parseFloat(loc.latitude.toFixed(6), 10);\n  loc.lng = parseFloat(loc.longitude.toFixed(6), 10);\n\n  data.pokemons = data.pokemons.map(function (pokemon) {\n    pokemon.latitude += loc.latitude;\n    pokemon.longitude += loc.longitude;\n    pokemon.disappear_time += ms;\n\n    return pokemon;\n  }).filter(function () {\n    if (Math.round(Math.random() * 100) % 10) {\n      return true;\n      //pokemon.disappear_time -= (15 * );\n    }\n    return false;\n  });\n  data.gyms.forEach(function (gym) {\n    gym.latitude = parseFloat((gym.latitude + loc.lat).toFixed(6), 10);\n    gym.longitude = parseFloat((gym.longitude + loc.lng).toFixed(6), 10);\n  });\n  data.pokestops.forEach(function (gym) {\n    gym.latitude = parseFloat((gym.latitude + loc.lat).toFixed(6), 10);\n    gym.longitude = parseFloat((gym.longitude + loc.lng).toFixed(6), 10);\n    gym.lure_expiration = gym.lure_expiration && (gym.lure_expiration + ms) || null;\n  });\n\n  return data;\n}\n\nfunction getNearby(pokeio, cb) {\n  pokeio.Heartbeat(function (err, hb) {\n    var pokemons = [];\n    var pokestops = [];\n    var gyms = [];\n\n    if (err) {\n      console.error('ERROR: Heartbeat');\n      console.error(err);\n      cb({ error: { message: err.toString() } });\n      return;\n    }\n\n    /*\n    console.log('');\n    console.log('DEBUG hb');\n    console.log(hb);\n    */\n\n    // Described at ./node_modules/pokemon-go-node-api/pokemon.proto\n    hb.cells.forEach(function (cell) {\n      // TODO insert into database since this is longstanding\n      cell.Fort.forEach(function (fort) {\n        if (null === fort.FortType || 0 === fort.FortType) {\n          // it's a gym!\n          gyms.push({\n            gym_id: fort.FortId\n          , gym_points: fort.GymPoints\n          , enabled: fort.Enabled\n          , guard_pokemon_id: fort.GuardPokemonId\n          , guard_pokemon_level: fort.GuardPokemonLevel\n          , last_modified: parseInt(fort.LastModifiedMs\n              && fort.LastModifiedMs.toString() || 0, 10) || 0\n          , latitude: fort.Latitude\n          , longitude: fort.Longitude\n          , team_id: fort.Team\n          });\n\n          console.log('DEBUG gym');\n          console.log(fort);\n          console.log(gyms[gyms.length - 1]);\n        }\n        else if (1 === fort.FortType) {\n          // it's a pokestop!\n          pokestops.push({\n            pokestop_id: fort.FortId\n          , active_pokemon_id: fort.LureInfo\n              && fort.LureInfo.ActivePokemonId || null\n          , enabled: fort.Enabled\n          , last_modified: parseInt(fort.LastModifiedMs\n              && fort.LastModifiedMs.toString() || 0, 10) || 0\n          , latitude: fort.Latitude\n          , longitude: fort.Longitude\n          , lure_expiration: parseInt(fort.LureInfo\n              && fort.LureInfo.LureExpiresTimestampMs\n              && fort.LureInfo.LureExpiresTimestampMs.toString() || 0, 10) || 0\n          });\n        }\n        else {\n          console.log('Unknown Fort Type:');\n          console.log(fort);\n        }\n      });\n      cell.MapPokemon.forEach(function (pokemon) {\n\n        var exp = pokemon.ExpirationTimeMs; //.toUnsigned(); // TODO convert to int more exactly\n        var id = Buffer.alloc(8); // pokemon.EncounterId;        // ??? how to convert from ProtoLong to base64? // also NearbyPokemon[i].EncounterId\n        var l = pokemon.EncounterId.toUnsigned();\n\n        /*\n        console.log('DEBUG pokemon.EncounterId');\n        console.log(pokemon.EncounterId.toString(10));\n        console.log(pokemon.EncounterId.high);\n        console.log(pokemon.EncounterId.low);\n        */\n\n        // TODO do we need to check os.endianness()?\n        // https://github.com/dcodeIO/long.js/issues/34#issuecomment-234544371\n        // https://github.com/Daplie/node-pokemap/issues/12\n        id.writeInt32BE(l.high, 0);\n        id.writeInt32BE(l.low, 4);\n\n        pokemons.push({\n          disappear_time: exp.toNumber()\n        //, encounter_id: null\n        , encounter_id: id.toString('base64') // this is probably still wrong\n        , latitude: parseFloat(pokemon.Latitude.toString(), 10)\n        , longitude: parseFloat(pokemon.Longitude.toString(), 10)\n        , pokemon_id: pokemon.PokedexTypeId // also NearbyPokemon[i].PokedexNumber\n        , pokemon_name: (pokeio.pokemonlist[pokemon.PokedexTypeId - 1]||{}).name\n        , spawnpoint_id: pokemon.SpawnpointId\n        });\n      });\n    });\n\n    cb(null, {\n      pokemons: pokemons\n    , pokestops: pokestops\n    , gyms: gyms\n    });\n  });\n}\n\nfunction getData(req, res) {\n  // TODO handle updates\n  // query = { location, pokestops, gyms, pokemons }\n\n  // TODO check expAt\n  var creds = req.sess;\n  var pokeio;\n\n  if (!req.query.latitude || !req.query.longitude) {\n    res.send({ error: { message: \"missing latitude or longitude\" } });\n    return;\n  }\n\n  // TODO allow named coords\n  // var geocoder = require('geocoder');\n  // geocoder.reverseGeocode(lat, lng, function (err, data) { ... });\n  // geocoder.geocode(locationName, function (err, data) { ... });\n\n  creds.latitude = parseFloat(req.query.latitude || req.query.lat, 10) || creds.latitude;\n  creds.longitude = parseFloat(req.query.longitude || req.query.lng || req.query.lon, 10) || creds.longitude;\n  creds.altitude = parseFloat(req.query.altitude || req.query.alt, 10) || 0;\n\n  if ('demo' === req.sess.username) {\n    res.send(mockData(req.sess));\n    return;\n  }\n\n  console.log(creds);\n  pokeio = PokemonGo.deserialize(creds);\n  console.log(pokeio.playerInfo);\n  /*\n  console.log(\"DEBUG\");\n  console.log(creds);\n  console.log(PokemonGo.deserialize.toString());\n  console.log(pokeio);\n  */\n  getNearby(pokeio, function (err, results) {\n    if (err) {\n      res.send(err);\n    }\n    else {\n      res.send(results);\n    }\n  });\n}\n\nfunction getLoc(req, res) {\n  res.send({\n    latitude: req.sess.latitude\n  , longitude: req.sess.longitude\n  });\n}\n\nfunction postLoc(req, res) {\n  //var expIn = 15 * 60;\n  var localToken;\n\n  req.sess.latitude = parseFloat(req.query.lat, 10);\n  req.sess.longitude = parseFloat(req.query.lng, 10);\n  //req.sess.exp = new Date(Date.now() + (expIn * 1000));\n\n  localToken = JWT.sign(req.sess, keypair.privateKeyPem, { algorithm: 'RS256'});\n\n  res.send({ success: true, access_token: localToken, expires_in: 15 * 60 });\n}\n\nfunction attachSession(req, res, next) {\n  var accessToken = (req.headers.authorization||'').replace(/(Bearer|Token|JWT) /ig, '');\n\n  if ('demo' === accessToken) {\n    accessToken = demoToken;\n  }\n\n  if (accessToken) {\n    try {\n      req.sess = JWT.verify(accessToken, keypair.publicKeyPem, { algorithms: [ 'RS256' ] });\n    } catch(e) {\n      console.error(e);\n    }\n  }\n\n  next();\n}\n\nfunction requireSession(req, res, next) {\n  if (!req.sess) {\n    res.send({ error: { message: \"unrecognized access token, try again\" } });\n    return;\n  }\n\n  next();\n}\n\napp.use('/api/com.pokemon.go/login', bodyParser.json());\napp.post('/api/com.pokemon.go/login', postLogin);\n\napp.use('/', attachSession);\n\napp.get('/api/com.pokemon.go/nearby', requireSession, getData);\napp.get('/raw_data', requireSession, getData);\n\n// Get / Set session data (pretty useless, on the whole)\napp.get('/loc', requireSession, getLoc);\napp.post('/next_loc', requireSession, postLoc);\n//app.post('/pokemon', getData);\n\nreturn app;\n\n};\n"]}