lbry-desktop/src/renderer/lbryio.js

183 lines
4.8 KiB
JavaScript
Raw Normal View History

2017-06-08 02:56:52 +02:00
import lbry from "./lbry.js";
2017-04-09 17:06:23 +02:00
2017-06-08 02:56:52 +02:00
const querystring = require("querystring");
const { ipcRenderer } = require("electron");
2017-04-09 17:06:23 +02:00
const lbryio = {
2017-06-08 02:56:52 +02:00
enabled: true,
_authenticationPromise: null,
_exchangePromise: null,
_exchangeLastFetched: null,
2017-04-17 16:01:33 +02:00
};
2017-06-06 06:21:55 +02:00
const CONNECTION_STRING = process.env.LBRY_APP_API_URL
2017-06-08 02:56:52 +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;
lbryio.getExchangeRates = function() {
2017-06-21 14:42:22 +02:00
if (
!lbryio._exchangeLastFetched ||
Date.now() - lbryio._exchangeLastFetched > EXCHANGE_RATE_TIMEOUT
) {
2017-06-08 02:56:52 +02:00
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);
})
.catch(reject);
});
lbryio._exchangeLastFetched = Date.now();
}
return lbryio._exchangePromise;
2017-06-06 06:21:55 +02:00
};
2017-06-08 23:15:34 +02:00
lbryio.call = function(resource, action, params = {}, method = "get") {
2017-10-27 21:37:05 +02:00
if (!lbryio.enabled) {
console.log(__("Internal API disabled"));
return Promise.reject(new Error(__("LBRY internal API is disabled")));
}
2017-06-08 02:56:52 +02:00
if (!(method == "get" || method == "post")) {
return Promise.reject(new Error(__("Invalid method")));
}
2017-06-08 02:56:52 +02:00
2017-11-10 15:55:30 +01:00
function checkAndParse(response) {
if (response.status >= 200 && response.status < 300) {
2017-11-10 15:55:30 +01:00
return response.json();
}
2017-12-13 22:36:30 +01:00
return response.json().then(json => {
let error;
if (json.error) {
error = new Error(json.error);
} else {
error = new Error("Unknown API error signature");
}
error.response = response; // this is primarily a hack used in actions/user.js
return Promise.reject(error);
});
}
2017-06-08 02:56:52 +02:00
function makeRequest(url, options) {
2017-11-10 15:55:30 +01:00
return fetch(url, options).then(checkAndParse);
}
return lbryio.getAuthToken().then(token => {
const fullParams = { auth_token: token, ...params };
const qs = querystring.stringify(fullParams);
let url = `${CONNECTION_STRING}${resource}/${action}?${qs}`;
let options = {
method: "GET",
};
if (method == "post") {
options = {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: qs,
};
url = `${CONNECTION_STRING}${resource}/${action}`;
}
2017-06-08 02:56:52 +02:00
return makeRequest(url, options).then(response => response.data);
2017-06-08 02:56:52 +02:00
});
};
lbryio._authToken = null;
2017-12-13 22:36:30 +01:00
lbryio.getAuthToken = () =>
new Promise((resolve, reject) => {
if (lbryio._authToken) {
resolve(lbryio._authToken);
} else {
ipcRenderer.once("auth-token-response", (event, token) => {
lbryio._authToken = token;
return resolve(token);
});
ipcRenderer.send("get-auth-token");
}
});
2017-04-18 21:45:15 +02:00
lbryio.setAuthToken = token => {
lbryio._authToken = token ? token.toString().trim() : null;
ipcRenderer.send("set-auth-token", token);
2017-06-08 02:56:52 +02:00
};
2017-12-13 22:36:30 +01:00
lbryio.getCurrentUser = () => lbryio.call("user", "me");
2017-04-09 17:06:23 +02:00
2017-04-10 14:32:40 +02:00
lbryio.authenticate = function() {
2017-06-01 01:29:10 +02:00
if (!lbryio.enabled) {
return new Promise((resolve, reject) => {
resolve({
id: 1,
2017-06-08 02:56:52 +02:00
language: "en",
2017-07-20 21:03:01 +02:00
primary_email: "disabled@lbry.io",
2017-06-08 02:56:52 +02:00
has_verified_email: true,
is_identity_verified: true,
2017-06-08 02:56:52 +02:00
is_reward_approved: false,
});
});
2017-06-01 01:29:10 +02:00
}
2017-06-01 01:29:10 +02:00
if (lbryio._authenticationPromise === null) {
lbryio._authenticationPromise = new Promise((resolve, reject) => {
lbryio
.getAuthToken()
.then(token => {
2017-06-21 14:42:22 +02:00
if (!token || token.length > 60) {
return false;
2017-06-08 02:56:52 +02:00
}
// check that token works
return lbryio
.getCurrentUser()
2017-12-13 22:36:30 +01:00
.then(() => true)
.catch(() => false);
2017-06-08 02:56:52 +02:00
})
2017-06-21 14:42:22 +02:00
.then(isTokenValid => {
if (isTokenValid) {
return;
}
return lbry
.status()
2017-12-13 22:36:30 +01:00
.then(status =>
lbryio.call(
2017-06-21 14:42:22 +02:00
"user",
2017-08-24 21:07:16 +02:00
"new",
{
auth_token: "",
language: "en",
app_id: status.installation_id,
},
2017-06-21 14:42:22 +02:00
"post"
2017-12-13 22:36:30 +01:00
)
)
.then(response => {
if (!response.auth_token) {
throw new Error(__("auth_token is missing from response"));
}
return lbryio.setAuthToken(response.auth_token);
});
})
2017-06-22 00:49:23 +02:00
.then(lbryio.getCurrentUser)
.then(resolve, reject);
2017-06-08 02:56:52 +02:00
});
}
2017-06-08 02:56:52 +02:00
return lbryio._authenticationPromise;
2017-06-06 06:21:55 +02:00
};
2017-04-09 17:06:23 +02:00
2017-12-13 22:36:30 +01:00
lbryio.getStripeToken = () =>
CONNECTION_STRING.startsWith("http://localhost:")
? "pk_test_NoL1JWL7i1ipfhVId5KfDZgo"
: "pk_live_e8M4dRNnCCbmpZzduEUZBgJO";
export default lbryio;