playbasis
Version:
Playbasis Javascript SDK
300 lines (176 loc) • 4.78 kB
JavaScript
;
module.exports=function(Playbasis){
var helpers=Playbasis.helpers;
var http=Playbasis.http={};
var OperationalError=Playbasis.Promise.OperationalError;
var _priv={};
_priv.isRelateToInternetConnectionIssue=function(errorMsg){
if(errorMsg.search("XHR error")>-1||errorMsg.search("Failed to fetch")>-1){
return true;
}else
{
return false;
}
};
http.getJsonAsync=function(url)
{
return new Playbasis.Promise(function(resolve,reject){
var lib=url.search('https')!=-1?require('https'):require('http');
var dataChunks=[];
var request=lib.get(url,function(response){
if(response.statusCode!=200){
var error=new OperationalError("Failed to load page, status code: "+response.statusCode);
error.code=response.statusCode;
error.isApiLevel=false;
return reject(error);
}
response.on('data',function(chunk){
dataChunks.push(chunk);
});
response.on('end',function(){
var d=dataChunks.join('');
if(d==null){
return reject(new OperationalError("Failed on api response. Response is null"));
}
var json=null;
try{
json=JSON.parse(d);
}
catch(e){
return reject(new OperationalError("Failed on parsing JSON response message. Error: "+e.message));
}
var errorCode=parseInt(json.error_code);
if(errorCode==0){
return resolve(json);
}else
{
var error=new OperationalError("Failed on response message. Error code: "+errorCode+" with "+json.message);
error.code=errorCode;
error.isApiLevel=true;
return reject(error);
}
});
response.on('error',function(e){return reject(new OperationalError(e.message));});
});
request.on('error',function(e){
if(_priv.isRelateToInternetConnectionIssue(e.message)){
var error=new OperationalError("Request error. "+e.message);
error.code=Playbasis.const.errorCode.internetConnectionIssue;
return reject(error);
}else
{
return reject(new OperationalError("Request error. "+e.message));
}
});
});
};
http.postJsonAsync=function(url,postDataKvp)
{
return new Playbasis.Promise(function(resolve,reject){
var lib=null;
var isHttps=true;
if(url.search('https')!=-1){
lib=require('https');
isHttps=true;
}else
{
lib=require('http');
isHttps=false;
}
var encodedDataParams="";
if(postDataKvp!=null){
var keys=Object.keys(postDataKvp);
var count=keys.length;
for(var i=0;i<count;i++)
{
var key=keys[i];
var value=postDataKvp[keys[i]];
if(key!=null&&value!=null){
if(i!=0){
encodedDataParams+="&";
}
encodedDataParams+=encodeURIComponent(key)+"="+encodeURIComponent(value);
}
}
}
var noPrefixUrl=isHttps?url.substring(8):url.substring(7);
var firstSlashPos=noPrefixUrl.indexOf("/");
var baseUrl=noPrefixUrl.substring(0,firstSlashPos);
var pathUrl="/"+noPrefixUrl.substring(firstSlashPos+1);
var postOptions={
hostname:baseUrl,
path:pathUrl,
port:isHttps?443:80,
method:'POST',
headers:{
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':Buffer.byteLength(encodedDataParams)}};
var dataChunks=[];
var request=lib.request(postOptions,function(response){
if(response.statusCode!=200){
var error=new OperationalError("Failed to load page, status code: "+response.statusCode);
error.code=response.statusCode;
error.isApiLevel=false;
return reject(error);
}
response.setEncoding('utf8');
response.on('data',function(chunk){
dataChunks.push(chunk);
});
response.on('end',function(){
var d=dataChunks.join('');
if(d==null){
return reject(new OperationalError("Failed on api response. Response is null"));
}
var json=null;
try{
json=JSON.parse(d);
}
catch(e){
return reject(new OperationalError("Failed on parsing JSON response message. Error: "+e.message));
}
var errorCode=parseInt(json.error_code);
if(errorCode==0){
return resolve(json);
}else
{
if(errorCode==900||errorCode==902){
http.postJsonAsync(helpers.createApiUrl("Auth"),{api_key:Playbasis.env.global.apiKey,api_secret:Playbasis.env.global.apiSecret}).
then(function(result){
Playbasis.env.global.token=result.response.token;
postDataKvp.token=Playbasis.env.global.token;
http.postJsonAsync(url,postDataKvp).
then(function(_r){
return resolve(_r);
},function(_e){
return reject(_e);
});
},function(e){
return reject(e);
});
}else
{
var error=new OperationalError("Failed on response message. Error code: "+errorCode+" with "+json.message);
error.code=errorCode;
error.isApiLevel=true;
return reject(error);
}
}
});
response.on('error',function(e){return reject(new OperationalError(e.message));});
});
request.on('error',function(e){
if(_priv.isRelateToInternetConnectionIssue(e.message)){
var error=new OperationalError("Request error. "+e.message);
error.code=Playbasis.const.errorCode.internetConnectionIssue;
return reject(error);
}else
{
return reject(new OperationalError("Request error. "+e.message));
}
});
request.write(encodedDataParams);
request.end();
});
};
};