UNPKG

playbasis

Version:
300 lines (176 loc) 4.78 kB
'use strict'; 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(); }); }; };