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" ) ;
2017-06-05 18:29:17 +02:00
const keytar = require ( "keytar" ) ;
2017-03-30 00:44:18 +02:00
2017-04-09 17:06:23 +02:00
const lbryio = {
2017-06-08 02:56:52 +02:00
enabled : true ,
2017-06-05 18:29:17 +02:00
_authenticationPromise : null ,
_exchangePromise : null ,
_exchangeLastFetched : null ,
2017-04-17 16:01:33 +02:00
} ;
2017-03-30 00:44:18 +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/" ;
2017-06-05 18:29:17 +02:00
2017-04-17 18:18:33 +02:00
const EXCHANGE _RATE _TIMEOUT = 20 * 60 * 1000 ;
2017-03-30 00:44:18 +02:00
2017-04-17 18:18:33 +02:00
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-06-08 02:56:52 +02:00
return new Promise ( ( resolve , reject ) => {
2017-06-08 23:15:34 +02:00
if ( ! lbryio . enabled && ( resource != "discover" || action != "list" ) ) {
2017-06-08 02:56:52 +02:00
console . log ( _ _ ( "Internal API disabled" ) ) ;
reject ( new Error ( _ _ ( "LBRY internal API is disabled" ) ) ) ;
return ;
}
const xhr = new XMLHttpRequest ( ) ;
xhr . addEventListener ( "error" , function ( event ) {
2017-06-21 14:42:22 +02:00
reject (
new Error ( _ _ ( "Something went wrong making an internal API call." ) )
) ;
2017-06-08 02:56:52 +02:00
} ) ;
xhr . addEventListener ( "timeout" , function ( ) {
reject ( new Error ( _ _ ( "XMLHttpRequest connection timed out" ) ) ) ;
} ) ;
xhr . addEventListener ( "load" , function ( ) {
const response = JSON . parse ( xhr . responseText ) ;
if ( ! response . success ) {
if ( reject ) {
2017-06-05 18:29:17 +02:00
const error = new Error ( response . error ) ;
2017-06-08 02:56:52 +02:00
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 {
resolve ( response . data ) ;
}
} ) ;
2017-06-05 18:29:17 +02:00
lbryio
. getAuthToken ( )
. then ( token => {
const fullParams = { auth _token : token , ... params } ;
if ( method == "get" ) {
2017-06-21 14:42:22 +02:00
xhr . open (
"get" ,
CONNECTION _STRING +
resource +
"/" +
action +
"?" +
querystring . stringify ( fullParams ) ,
true
) ;
2017-06-05 18:29:17 +02:00
xhr . send ( ) ;
} else if ( method == "post" ) {
xhr . open ( "post" , CONNECTION _STRING + resource + "/" + action , true ) ;
2017-06-21 14:42:22 +02:00
xhr . setRequestHeader (
"Content-type" ,
"application/x-www-form-urlencoded"
) ;
2017-06-05 18:29:17 +02:00
xhr . send ( querystring . stringify ( fullParams ) ) ;
} else {
reject ( new Error ( _ _ ( "Invalid method" ) ) ) ;
}
} )
. catch ( reject ) ;
2017-06-08 02:56:52 +02:00
} ) ;
2017-03-30 00:44:18 +02:00
} ;
2017-06-05 18:29:17 +02:00
lbryio . getAuthToken = ( ) => {
return keytar . getPassword ( "LBRY" , "auth_token" ) . then ( token => {
return token ? token . toString ( ) . trim ( ) : null ;
} ) ;
2017-06-06 06:21:55 +02:00
} ;
2017-04-18 21:45:15 +02:00
2017-06-05 18:29:17 +02:00
lbryio . setAuthToken = token => {
2017-06-21 14:42:22 +02:00
return keytar . setPassword (
"LBRY" ,
"auth_token" ,
token ? token . toString ( ) . trim ( ) : null
) ;
2017-06-08 02:56:52 +02:00
} ;
2017-06-05 18:29:17 +02:00
lbryio . getCurrentUser = ( ) => {
return lbryio . call ( "user" , "me" ) ;
2017-06-06 06:21:55 +02:00
} ;
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" ,
has _email : true ,
has _verified _email : true ,
is _reward _approved : false ,
is _reward _eligible : false ,
} ) ;
} ) ;
2017-06-01 01:29:10 +02:00
}
2017-06-05 18:29:17 +02:00
2017-06-01 01:29:10 +02:00
if ( lbryio . _authenticationPromise === null ) {
lbryio . _authenticationPromise = new Promise ( ( resolve , reject ) => {
2017-06-05 18:29:17 +02:00
lbryio
. getAuthToken ( )
. then ( token => {
2017-06-21 14:42:22 +02:00
if ( ! token || token . length > 60 ) {
2017-06-05 18:29:17 +02:00
return false ;
2017-06-08 02:56:52 +02:00
}
2017-06-05 18:29:17 +02:00
// check that token works
return lbryio
. getCurrentUser ( )
2017-06-21 14:42:22 +02:00
. then ( ( ) => {
return true ;
} )
. catch ( ( ) => {
return false ;
} ) ;
2017-06-08 02:56:52 +02:00
} )
2017-06-21 14:42:22 +02:00
. then ( isTokenValid => {
2017-06-05 18:29:17 +02:00
if ( isTokenValid ) {
return ;
}
let app _id ;
return lbry
. status ( )
. then ( status => {
// first try swapping
app _id = status . installation _id ;
2017-06-21 14:42:22 +02:00
return lbryio . call (
"user" ,
"token_swap" ,
{ auth _token : "" , app _id : app _id } ,
"post"
) ;
2017-06-05 18:29:17 +02:00
} )
2017-06-21 14:42:22 +02:00
. catch ( err => {
2017-06-05 18:29:17 +02:00
if ( err . xhr . status == 403 ) {
// cannot swap. either app_id doesn't exist, or app_id already swapped. pretend its the former and create a new user. if we get another error, then its the latter
2017-06-21 14:42:22 +02:00
return lbryio . call (
"user" ,
"new" ,
{ auth _token : "" , language : "en" , app _id : app _id } ,
"post"
) ;
2017-06-05 18:29:17 +02:00
}
throw err ;
} )
. then ( response => {
if ( ! response . auth _token ) {
throw new Error ( _ _ ( "auth_token is missing from response" ) ) ;
}
return lbryio . setAuthToken ( response . auth _token ) ;
} ) ;
} )
. then ( lbryio . getCurrentUser ( ) )
. then ( resolve , reject ) ;
2017-06-08 02:56:52 +02:00
} ) ;
}
2017-06-05 18:29:17 +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-03-30 00:44:18 +02:00
export default lbryio ;