2021-12-31 09:04:13 +05:00
import { EV , EVENTS } from "../common" ;
2022-01-18 12:00:57 +05:00
import { getServerNameFromHost } from "./constants" ;
import { extractHostname } from "./hostname" ;
2021-12-31 09:04:13 +05:00
2020-12-16 12:06:25 +05:00
function get ( url , token ) {
return request ( url , token , "GET" ) ;
}
function deleteRequest ( url , token ) {
return request ( url , token , "DELETE" ) ;
}
function patch ( url , data , token ) {
2021-10-26 09:13:18 +05:00
return bodyRequest ( url , data , token , "PATCH" ) ;
2020-12-16 12:06:25 +05:00
}
2021-06-13 10:00:24 +05:00
patch . json = function ( url , data , token ) {
2021-10-26 09:13:18 +05:00
return bodyRequest ( url , data , token , "PATCH" , "application/json" ) ;
2021-06-13 10:00:24 +05:00
} ;
2020-12-16 12:06:25 +05:00
function post ( url , data , token ) {
2021-10-26 09:13:18 +05:00
return bodyRequest ( url , data , token , "POST" ) ;
2020-12-16 12:06:25 +05:00
}
post . json = function ( url , data , token ) {
2021-10-26 09:13:18 +05:00
return bodyRequest ( url , data , token , "POST" , "application/json" ) ;
2020-12-16 12:06:25 +05:00
} ;
2021-01-03 12:43:53 +05:00
export default {
get ,
post ,
delete : deleteRequest ,
patch ,
} ;
2021-10-26 09:13:18 +05:00
function transformer ( data , type ) {
2020-12-23 11:28:38 +05:00
if ( ! data ) return ;
2021-10-26 09:13:18 +05:00
if ( type === "application/json" ) return JSON . stringify ( data ) ;
2020-12-16 12:06:25 +05:00
else {
return Object . entries ( data )
2022-03-11 22:49:24 +05:00
. map ( ( [ key , value ] ) =>
value ? ` ${ encodeURIComponent ( key ) } = ${ encodeURIComponent ( value ) } ` : ""
2020-12-16 12:06:25 +05:00
)
. join ( "&" ) ;
}
}
2021-12-31 09:04:13 +05:00
/ * *
*
* @ param { Response } response
* @ returns
* /
2020-12-16 12:06:25 +05:00
async function handleResponse ( response ) {
const contentType = response . headers . get ( "content-type" ) ;
if ( contentType && contentType . includes ( "application/json" ) ) {
const json = await response . json ( ) ;
if ( response . ok ) {
return json ;
}
2022-03-11 22:49:24 +05:00
throw new RequestError ( errorTransformer ( json ) ) ;
2020-12-16 12:06:25 +05:00
} else {
2021-01-03 12:33:40 +05:00
if ( response . status === 429 ) throw new Error ( "You are being rate limited." ) ;
2020-12-16 12:06:25 +05:00
if ( response . ok ) return await response . text ( ) ;
2022-01-07 13:58:06 +05:00
else if ( response . status === 401 ) {
EV . publish ( EVENTS . userUnauthorized , response . url ) ;
throw new Error ( "Unauthorized." ) ;
} else
2020-12-16 12:06:25 +05:00
throw new Error (
` Request failed with status code: ${ response . status } ${ response . statusText } . `
) ;
}
}
async function request ( url , token , method ) {
return handleResponse (
2022-01-18 12:00:57 +05:00
await fetchWrapped ( url , {
2020-12-16 12:06:25 +05:00
method ,
2020-12-16 13:23:14 +05:00
headers : getAuthorizationHeader ( token ) ,
2020-12-16 12:06:25 +05:00
} )
) ;
}
2021-10-26 09:13:18 +05:00
async function bodyRequest (
url ,
data ,
token ,
method ,
contentType = "application/x-www-form-urlencoded"
) {
2020-12-16 12:06:25 +05:00
return handleResponse (
2022-01-18 12:00:57 +05:00
await fetchWrapped ( url , {
2020-12-16 12:06:25 +05:00
method ,
2021-10-26 09:13:18 +05:00
body : transformer ( data , contentType ) ,
2020-12-16 12:06:25 +05:00
headers : {
2020-12-16 13:23:14 +05:00
... getAuthorizationHeader ( token ) ,
2021-10-26 09:13:18 +05:00
"Content-Type" : contentType ,
2020-12-16 12:06:25 +05:00
} ,
} )
) ;
}
2020-12-16 13:23:14 +05:00
function getAuthorizationHeader ( token ) {
return token ? { Authorization : "Bearer " + token } : { } ;
}
2021-01-03 12:43:53 +05:00
function errorTransformer ( errorJson ) {
2022-03-11 22:49:24 +05:00
let errorMessage = "Unknown error." ;
let errorCode = "unknown" ;
2021-01-03 12:43:53 +05:00
if ( ! errorJson . error && ! errorJson . errors && ! errorJson . error _description )
2022-03-11 22:49:24 +05:00
return { description : errorMessage , code : errorCode , data : { } } ;
const { error , error _description , errors , data } = errorJson ;
2021-01-03 12:43:53 +05:00
if ( errors ) {
2022-03-11 22:49:24 +05:00
errorMessage = errors . join ( "\n" ) ;
2021-01-03 12:43:53 +05:00
}
2022-03-17 22:56:10 +05:00
outer : switch ( error ) {
2021-01-03 12:43:53 +05:00
case "invalid_grant" : {
switch ( error _description ) {
case "invalid_username_or_password" :
2022-03-11 22:49:24 +05:00
errorMessage = "Username or password incorrect." ;
errorCode = error _description ;
2022-03-17 22:56:10 +05:00
break outer ;
2021-01-03 12:43:53 +05:00
default :
2022-03-11 22:49:24 +05:00
errorMessage = error _description || error ;
errorCode = error || "invalid_grant" ;
2022-03-17 22:56:10 +05:00
console . log ( errorMessage , errorCode ) ;
break outer ;
2021-01-03 12:43:53 +05:00
}
}
2021-01-03 15:45:14 +05:00
default :
2022-03-11 22:49:24 +05:00
errorMessage = error _description || "An unknown error occured." ;
errorCode = error ;
break ;
2021-01-03 12:43:53 +05:00
}
2022-03-11 22:49:24 +05:00
return {
description : errorMessage ,
code : errorCode ,
data : data ? JSON . parse ( data ) : undefined ,
} ;
2021-01-03 12:43:53 +05:00
}
2021-12-25 12:27:23 +05:00
2022-01-18 12:00:57 +05:00
/ * *
*
* @ param { RequestInfo } input
* @ param { RequestInit } init
* /
async function fetchWrapped ( input , init ) {
try {
const response = await fetch ( input , init ) ;
return response ;
} catch ( e ) {
const host = extractHostname ( input ) ;
const serverName = getServerNameFromHost ( host ) ;
if ( serverName )
throw new Error (
` ${ serverName } is not responding. Please check your internet connection. If the problem persists, feel free email us at support@streetwriters.co. (Reference error: ${ e . message } ) `
) ;
throw e ;
}
}
2022-03-11 22:49:24 +05:00
class RequestError extends Error {
constructor ( error ) {
super ( error . description ) ;
this . code = error . code ;
this . data = error . data ;
}
}