207 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			207 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								(function (exports) {
							 | 
						||
| 
								 | 
							
								  'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var DaplieApi;
							 | 
						||
| 
								 | 
							
								  var Oauth3 = (exports.OAUTH3 || require('./oauth3'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function realGet(conf, account, id, url) {
							 | 
						||
| 
								 | 
							
								    id = id || Math.random().toString();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (conf.promisesMap[id]) {
							 | 
						||
| 
								 | 
							
								      return conf.promisesMap[id];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    conf.promisesMap[id] = Oauth3.request({
							 | 
						||
| 
								 | 
							
								      url: url
							 | 
						||
| 
								 | 
							
								    , method: 'GET'
							 | 
						||
| 
								 | 
							
								    , headers: { 'Authorization': 'Bearer ' + account.token }
							 | 
						||
| 
								 | 
							
								    }).then(function (resp) {
							 | 
						||
| 
								 | 
							
								      delete conf.promisesMap[id];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (!resp.data) {
							 | 
						||
| 
								 | 
							
								        // This seems to happen on abort...
							 | 
						||
| 
								 | 
							
								        return Oauth3.PromiseA.reject("no data returned, the request may have been aborted");
							 | 
						||
| 
								 | 
							
								        //window.alert("[SANITY FAIL] '" + url + "' returned nothing (not even an error)");
							 | 
						||
| 
								 | 
							
								        //return;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (resp.data.error) {
							 | 
						||
| 
								 | 
							
								        console.error('[ERROR]', url);
							 | 
						||
| 
								 | 
							
								        console.error(resp.data);
							 | 
						||
| 
								 | 
							
								        window.alert("[DEVELOPER ERROR] '" + url + "' returned an error (is the url correct? did you check login first?)");
							 | 
						||
| 
								 | 
							
								        return Oauth3.PromiseA.reject("[DEVELOPER ERROR] '" + url + "' returned an error (is the url correct? did you check login first?)");
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return resp.data;
							 | 
						||
| 
								 | 
							
								    }, function (err) {
							 | 
						||
| 
								 | 
							
								      delete conf.promisesMap[id];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return Oauth3.PromiseA.reject(err);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return conf.promisesMap[id];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  function promiseApiCall(conf, account, id, url, opts) {
							 | 
						||
| 
								 | 
							
								    opts = opts || {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function fetch() {
							 | 
						||
| 
								 | 
							
								      return new Oauth3.PromiseA(function (resolve, reject) {
							 | 
						||
| 
								 | 
							
								        var kotoken = setTimeout(function () {
							 | 
						||
| 
								 | 
							
								          if (opts.tried) {
							 | 
						||
| 
								 | 
							
								            reject(new Error("timed out (twice) when attempting to get data"));
							 | 
						||
| 
								 | 
							
								            return;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          opts.tried = true;
							 | 
						||
| 
								 | 
							
								          return promiseApiCall(account, id, url, opts).then(resolve, reject);
							 | 
						||
| 
								 | 
							
								        }, opts.tried && 16000 || 8000);
							 | 
						||
| 
								 | 
							
								        //opts.tried && 16000 || 8000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        realGet(conf, account, id, url).then(function (data) {
							 | 
						||
| 
								 | 
							
								          clearTimeout(kotoken);
							 | 
						||
| 
								 | 
							
								          resolve(data);
							 | 
						||
| 
								 | 
							
								        }, function (err) {
							 | 
						||
| 
								 | 
							
								          clearTimeout(kotoken);
							 | 
						||
| 
								 | 
							
								          reject(err);
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!id) {
							 | 
						||
| 
								 | 
							
								      return fetch();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return conf.cache.read(id, fetch, opts).then(function (data) {
							 | 
						||
| 
								 | 
							
								      // TODO, just data.value (after bugfix)
							 | 
						||
| 
								 | 
							
								      return data.value && data.value.value || data.value;
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // TODO wrap with promises so that if a call is made before a prior call finishes,
							 | 
						||
| 
								 | 
							
								  // it's just one call
							 | 
						||
| 
								 | 
							
								  DaplieApi = {
							 | 
						||
| 
								 | 
							
								    create: function create(conf) {
							 | 
						||
| 
								 | 
							
								      // conf = { config, cache, session }
							 | 
						||
| 
								 | 
							
								      conf.promisesMap = {};
							 | 
						||
| 
								 | 
							
								      var myInstance = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      myInstance.accountsWithProfiles = function () {
							 | 
						||
| 
								 | 
							
								        var args = Array.prototype.slice.call(arguments);
							 | 
						||
| 
								 | 
							
								        args.unshift(conf);
							 | 
						||
| 
								 | 
							
								        return DaplieApi.accountsWithProfiles.apply(null, args);
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								      myInstance.guessGender = DaplieApi.guessGender;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      Object.keys(DaplieApi.api).forEach(function (key) {
							 | 
						||
| 
								 | 
							
								        DaplieApi[key] = DaplieApi.api[key];
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      Object.keys(DaplieApi.api).forEach(function (key) {
							 | 
						||
| 
								 | 
							
								        myInstance[key] = function () {
							 | 
						||
| 
								 | 
							
								          var args = Array.prototype.slice.call(arguments);
							 | 
						||
| 
								 | 
							
								          args.unshift(conf);
							 | 
						||
| 
								 | 
							
								          return DaplieApi.api[key].apply(null, args);
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return myInstance;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  , accountsWithProfiles: function accountsWithProfiles(conf, accounts) {
							 | 
						||
| 
								 | 
							
								      // TODO conf.session.get()
							 | 
						||
| 
								 | 
							
								      var session = conf.session._conf.session;
							 | 
						||
| 
								 | 
							
								      var promises = [];
							 | 
						||
| 
								 | 
							
								      accounts = accounts || [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      session.accounts.forEach(function (account) {
							 | 
						||
| 
								 | 
							
								        account = conf.session.cloneAccount(account);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        promises.push(DaplieApi.api.profile(conf, account).then(function (profile) {
							 | 
						||
| 
								 | 
							
								          // TODO get a slim profile?
							 | 
						||
| 
								 | 
							
								          account.profile = profile;
							 | 
						||
| 
								 | 
							
								          accounts.push(account);
							 | 
						||
| 
								 | 
							
								        }));
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return Oauth3.PromiseA.all(promises).then(function () {
							 | 
						||
| 
								 | 
							
								        // get the most recently added account as the first in the list
							 | 
						||
| 
								 | 
							
								        // (they should already be sorted this way)
							 | 
						||
| 
								 | 
							
								        accounts.sort(function (a, b) {
							 | 
						||
| 
								 | 
							
								          return new Date(b.addedAt).valueOf() - new Date(a.addedAt).valueOf();
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return accounts;
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  DaplieApi.api = {
							 | 
						||
| 
								 | 
							
								    create: function (conf, account) {
							 | 
						||
| 
								 | 
							
								      var accountInstance = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      account = account || conf.session.selectAccount();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      Object.keys(DaplieApi.api).forEach(function (key) {
							 | 
						||
| 
								 | 
							
								        accountInstance[key] = DaplieApi.api[key];
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      Object.keys(DaplieApi.api).forEach(function (key) {
							 | 
						||
| 
								 | 
							
								        accountInstance[key] = function () {
							 | 
						||
| 
								 | 
							
								          var args = Array.prototype.slice.call(arguments);
							 | 
						||
| 
								 | 
							
								          args.unshift(account);
							 | 
						||
| 
								 | 
							
								          args.unshift(conf);
							 | 
						||
| 
								 | 
							
								          return DaplieApi.api[key].apply(null, args);
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return accountInstance;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  , raw: function (conf, account, rawUrl, params, opts) {
							 | 
						||
| 
								 | 
							
								      params = params || {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (!rawUrl) {
							 | 
						||
| 
								 | 
							
								        throw new Error("no rawUrl provided");
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      Object.keys(params).forEach(function (key) {
							 | 
						||
| 
								 | 
							
								        var val = params[key];
							 | 
						||
| 
								 | 
							
								        rawUrl = rawUrl.replace(':' + key, encodeURIComponent(val));
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      //rawUrl = rawUrl.replace(':account_id' + key, encodeURIComponent(val));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      var url = conf.config.apiBaseUri + conf.config.apiPrefix
							 | 
						||
| 
								 | 
							
								        + '/' + conf.session.getId(account) + rawUrl;
							 | 
						||
| 
								 | 
							
								      var id = url;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return promiseApiCall(
							 | 
						||
| 
								 | 
							
								        conf
							 | 
						||
| 
								 | 
							
								      , account
							 | 
						||
| 
								 | 
							
								      , id
							 | 
						||
| 
								 | 
							
								      , url
							 | 
						||
| 
								 | 
							
								      , opts
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  //, me: function (conf, account, opts)
							 | 
						||
| 
								 | 
							
								  , profile: function (conf, account, opts) {
							 | 
						||
| 
								 | 
							
								      // NOTE: account may also be a session object with an accountId and token
							 | 
						||
| 
								 | 
							
								      var id = conf.session.getId(account) + '.me';
							 | 
						||
| 
								 | 
							
								      var url = conf.config.apiBaseUri + conf.config.apiPrefix
							 | 
						||
| 
								 | 
							
								        + '/accounts/' + conf.session.getId(account) + '/me';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return promiseApiCall(
							 | 
						||
| 
								 | 
							
								        conf
							 | 
						||
| 
								 | 
							
								      , account
							 | 
						||
| 
								 | 
							
								      , id
							 | 
						||
| 
								 | 
							
								      , url
							 | 
						||
| 
								 | 
							
								      , opts
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  exports.DaplieApi = DaplieApi.DaplieApi = DaplieApi;
							 | 
						||
| 
								 | 
							
								  if ('undefined' !== typeof module) {
							 | 
						||
| 
								 | 
							
								    module.exports = DaplieApi;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}('undefined' !== typeof exports ? exports : window));
							 |