From 76e79886b2d86b19b8eb33406b15d3527e53ccc1 Mon Sep 17 00:00:00 2001 From: Anthony Date: Sat, 12 Jun 2021 21:16:34 +0200 Subject: [PATCH] add comments and begin stripe integration --- src/lbryio.js | 93 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 27 deletions(-) diff --git a/src/lbryio.js b/src/lbryio.js index 38e0c26..c982d77 100644 --- a/src/lbryio.js +++ b/src/lbryio.js @@ -10,6 +10,7 @@ const Lbryio = { CONNECTION_STRING: 'https://api.lbry.com/', }; +// 20 minute exchange rate timeout const EXCHANGE_RATE_TIMEOUT = 20 * 60 * 1000; const INTERNAL_APIS_DOWN = 'internal_apis_down'; @@ -18,43 +19,57 @@ Lbryio.setLocalApi = endpoint => { Lbryio.CONNECTION_STRING = endpoint.replace(/\/*$/, '/'); // exactly one slash at the end; }; +function checkAndParse(response) { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } + + if (response.status === 500) { + return Promise.reject(INTERNAL_APIS_DOWN); + } + + if (response) + 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); + }); +} + +function makeRequest(url, options) { + return fetch(url, options).then(checkAndParse); +} + +/** + * Call a Lbry API method + * + * @param {string} resource - resource value (me/lbc/customer/account/etc.) + * @param {string} action - the subresource (aka for customer: status/link) + * @param {object || string} params - used to build querystring for fetch (default {}) + * @param {string} method - 'get' or 'post' (default - get) + * @returns {string} returns response.data returned by the API + */ Lbryio.call = (resource, action, params = {}, method = 'get') => { + // reject promise if API disabled if (!Lbryio.enabled) { return Promise.reject(new Error(__('LBRY internal API is disabled'))); } + // only allow get or post requests if (!(method === 'get' || method === 'post')) { return Promise.reject(new Error(__('Invalid method'))); } - function checkAndParse(response) { - if (response.status >= 200 && response.status < 300) { - return response.json(); - } - - if (response.status === 500) { - return Promise.reject(INTERNAL_APIS_DOWN); - } - - if (response) - 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); - }); - } - - function makeRequest(url, options) { - return fetch(url, options).then(checkAndParse); - } - + // get auth token and build request to be called via fetch return Lbryio.getAuthToken().then(token => { + // add auth token to params const fullParams = { auth_token: token, ...params }; + // stringify param values Object.keys(fullParams).forEach(key => { const value = fullParams[key]; if (typeof value === 'object') { @@ -62,16 +77,21 @@ Lbryio.call = (resource, action, params = {}, method = 'get') => { } }); + // build querystring for fetch const qs = querystring.stringify(fullParams); + // build url for fetch let url = `${Lbryio.CONNECTION_STRING}${resource}/${action}?${qs}`; + // set method to GET (changed to POST if applicable later) let options = { method: 'GET', }; + // build post request for fetch if (method === 'post') { options = { method: 'POST', + // send as a form encoded url with query string headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, @@ -80,20 +100,29 @@ Lbryio.call = (resource, action, params = {}, method = 'get') => { url = `${Lbryio.CONNECTION_STRING}${resource}/${action}`; } + // make request per url and options and return response.data return makeRequest(url, options).then(response => response.data); }); }; Lbryio.authToken = null; +/** + * Get user auth token, either stored on the window, or via a request to the API + * + * @returns {string} returns user's auth token + */ Lbryio.getAuthToken = () => new Promise(resolve => { + // if authToken already saved on Lbryio object, return it if (Lbryio.authToken) { resolve(Lbryio.authToken); + // if there is an override, use that to get token } else if (Lbryio.overrides.getAuthToken) { Lbryio.overrides.getAuthToken().then(token => { resolve(token); }); + // if the window is already defined, get token from there } else if (typeof window !== 'undefined') { const { store } = window; if (store) { @@ -102,9 +131,10 @@ Lbryio.getAuthToken = () => Lbryio.authToken = token; resolve(token); } - + // if everything whifs, return null resolve(null); } else { + // return null if nothing above worked resolve(null); } }); @@ -235,4 +265,13 @@ Lbryio.setOverride = (methodName, newMethod) => { Lbryio.overrides[methodName] = newMethod; }; +function getCustomerStatus() { + const response = Lbryio.call('account', 'status', {}, 'post'); + + console.log(response); +} + +setTimeout(() => { + getCustomerStatus(); +}, 1000 * 5); export default Lbryio;