| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | const config = require('config'),	  async  = require('async'),	  logger = require('./logger'),	  cache  = require('./cache');const client = config.get("apis.spotify.client");const secret = config.get("apis.spotify.secret");const OAuth2 = require('oauth').OAuth2;const SpotifyOauth = new OAuth2(	client,	secret, 	'https://accounts.spotify.com/', 	null,	'api/token',	null);let apiResults = {	access_token: "",	token_type: "",	expires_in: 0,	expires_at: 0,	scope: "",};let initialized = false;let lockdown = false;let lib = {	init: (cb) => {		async.waterfall([			(next) => {				cache.hget("api", "spotify", next, true);			},			(data, next) => {				if (data) apiResults = data;				next();			}		], (err) => {			if (lockdown) return this._lockdown();			if (err) {				err = utils.getError(err);				cb(err);			} else {				initialized = true;				cb();			}		});	},	getToken: () => {		return new Promise((resolve, reject) => {			if (Date.now() > apiResults.expires_at) {				lib.requestToken(() => {					resolve(apiResults.access_token);				});			} else resolve(apiResults.access_token);		});	},	requestToken: (cb) => {		async.waterfall([			(next) => {				logger.info("SPOTIFY_REQUEST_TOKEN", "Requesting new Spotify token.");				SpotifyOauth.getOAuthAccessToken(					'',					{ 'grant_type': 'client_credentials' },					next				);			},			(access_token, refresh_token, results, next) => {				apiResults = results;				apiResults.expires_at = Date.now() + (results.expires_in * 1000);				cache.hset("api", "spotify", apiResults, next, true);			}		], () => {			cb();		});	},	_lockdown: () => {		lockdown = true;	}};module.exports = lib;
 |