lbry-desktop/ui/js/lbryio.js

163 lines
5.1 KiB
JavaScript
Raw Normal View History

2017-04-10 14:32:40 +02:00
import {getLocal, getSession, setSession, setLocal} from './utils.js';
2017-04-09 17:06:23 +02:00
import lbry from './lbry.js';
const querystring = require('querystring');
2017-04-09 17:06:23 +02:00
const lbryio = {
_accessToken: getLocal('accessToken'),
_authenticationPromise: null,
_user : null,
2017-05-19 18:17:19 +02:00
enabled: true
2017-04-17 16:01:33 +02:00
};
2017-05-25 02:10:36 +02:00
2017-05-11 19:46:41 +02:00
const CONNECTION_STRING = process.env.LBRY_APP_API_URL ?
2017-05-25 02:10:36 +02:00
process.env.LBRY_APP_API_URL.replace(/\/*$/,'/') : // exactly one slash at the end
'https://api.lbry.io/'
const EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000;
2017-05-12 20:36:44 +02:00
lbryio._exchangePromise = null;
lbryio._exchangeLastFetched = null;
lbryio.getExchangeRates = function() {
2017-05-12 20:36:44 +02:00
if (!lbryio._exchangeLastFetched || Date.now() - lbryio._exchangeLastFetched > EXCHANGE_RATE_TIMEOUT) {
lbryio._exchangePromise = new Promise((resolve, reject) => {
lbryio.call('lbc', 'exchange_rate', {}, 'get', true).then(({lbc_usd, lbc_btc, btc_usd}) => {
const rates = {lbc_usd, lbc_btc, btc_usd};
resolve(rates);
2017-05-12 20:36:44 +02:00
}).catch(reject);
});
lbryio._exchangeLastFetched = Date.now();
}
return lbryio._exchangePromise;
}
lbryio.call = function(resource, action, params={}, method='get', evenIfDisabled=false) { // evenIfDisabled is just for development, when we may have some calls working and some not
return new Promise((resolve, reject) => {
if (!lbryio.enabled && !evenIfDisabled && (resource != 'discover' || action != 'list')) {
2017-05-26 22:26:06 +02:00
console.log(__("Internal API disabled"));
reject(new Error(__("LBRY internal API is disabled")))
return
}
const xhr = new XMLHttpRequest;
2017-04-01 08:54:56 +02:00
2017-04-09 17:06:23 +02:00
xhr.addEventListener('error', function (event) {
2017-05-26 22:26:06 +02:00
reject(new Error(__("Something went wrong making an internal API call.")));
});
xhr.addEventListener('timeout', function() {
2017-05-26 22:26:06 +02:00
reject(new Error(__('XMLHttpRequest connection timed out')));
});
xhr.addEventListener('load', function() {
const response = JSON.parse(xhr.responseText);
if (!response.success) {
if (reject) {
2017-04-18 21:45:15 +02:00
let error = new Error(response.error);
error.xhr = xhr;
reject(error);
} else {
document.dispatchEvent(new CustomEvent('unhandledError', {
detail: {
connectionString: connectionString,
method: action,
params: params,
message: response.error.message,
... response.error.data ? {data: response.error.data} : {},
}
}));
}
} else {
2017-03-31 01:00:33 +02:00
resolve(response.data);
}
});
2017-04-02 11:55:24 +02:00
// For social media auth:
//const accessToken = localStorage.getItem('accessToken');
//const fullParams = {...params, ... accessToken ? {access_token: accessToken} : {}};
// Temp app ID based auth:
2017-04-18 21:45:15 +02:00
const fullParams = {app_id: lbryio.getAccessToken(), ...params};
2017-04-02 11:55:24 +02:00
2017-03-31 01:00:33 +02:00
if (method == 'get') {
2017-04-02 11:55:24 +02:00
xhr.open('get', CONNECTION_STRING + resource + '/' + action + '?' + querystring.stringify(fullParams), true);
2017-03-31 01:00:33 +02:00
xhr.send();
} else if (method == 'post') {
xhr.open('post', CONNECTION_STRING + resource + '/' + action, true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
2017-04-02 11:55:24 +02:00
xhr.send(querystring.stringify(fullParams));
2017-05-11 19:46:41 +02:00
} else {
2017-05-26 22:26:06 +02:00
reject(new Error(__("Invalid method")));
}
});
};
2017-04-18 21:45:15 +02:00
lbryio.getAccessToken = () => {
return getLocal('accessToken');
}
2017-04-09 17:06:23 +02:00
lbryio.setAccessToken = (token) => {
setLocal('accessToken', token)
}
2017-04-10 14:32:40 +02:00
lbryio.authenticate = function() {
if (!lbryio.enabled) {
return new Promise((resolve, reject) => {
resolve({
2017-05-11 19:46:41 +02:00
id: 1,
has_verified_email: true
})
})
}
2017-04-09 17:06:23 +02:00
if (lbryio._authenticationPromise === null) {
lbryio._authenticationPromise = new Promise((resolve, reject) => {
2017-04-17 22:45:51 +02:00
lbry.status().then((response) => {
2017-04-09 17:06:23 +02:00
2017-04-17 22:45:51 +02:00
let installation_id = response.installation_id;
2017-04-09 17:06:23 +02:00
function setCurrentUser() {
lbryio.call('user', 'me').then((data) => {
lbryio.user = data
resolve(data)
}).catch(function(err) {
lbryio.setAccessToken(null);
2017-04-10 14:32:40 +02:00
if (!getSession('reloadedOnFailedAuth')) {
setSession('reloadedOnFailedAuth', true)
window.location.reload();
} else {
reject(err);
}
2017-04-09 17:06:23 +02:00
})
}
2017-04-18 21:45:15 +02:00
if (!lbryio.getAccessToken()) {
2017-04-09 17:06:23 +02:00
lbryio.call('user', 'new', {
language: 'en',
app_id: installation_id,
}, 'post').then(function(responseData) {
2017-05-11 19:46:41 +02:00
if (!responseData.id) {
2017-05-26 22:26:06 +02:00
reject(new Error(__("Received invalid authentication response.")));
2017-04-09 17:06:23 +02:00
}
lbryio.setAccessToken(installation_id)
setCurrentUser()
}).catch(function(error) {
/*
until we have better error code format, assume all errors are duplicate application id
if we're wrong, this will be caught by later attempts to make a valid call
*/
lbryio.setAccessToken(installation_id)
setCurrentUser()
})
} else {
setCurrentUser()
}
}).catch(reject);
});
}
return lbryio._authenticationPromise;
}
export default lbryio;