UNPKG

@darwino/darwino

Version:

A set of Javascript classes and utilities

204 lines (188 loc) 5.53 kB
/*!COPYRIGHT HEADER! - CONFIDENTIAL * * Darwino Inc Confidential. * * (c) Copyright Darwino Inc. 2014-2016. * * Notice: The information contained in the source code for these files is the property * of Darwino Inc. which, with its licensors, if any, owns all the intellectual property * rights, including all copyright rights thereto. Such information may only be used * for debugging, troubleshooting and informational purposes. All other uses of this information, * including any production or commercial uses, are prohibited. */ import Utils from "./Utils" import DEV_OPTIONS from "./dev"; export function makeUrl(url,parts,params,useQueryParams) { // Add the URL parts if(parts && parts.length) { let p = ""; for(let i=0; i<parts.length; i++) { let part = parts[i].toString(); if(useQueryParams) { if(part.indexOf('/')>=0) { params["$$"+i] = part; part = "$$"+i; } } p += "/" + encodeURIComponent(part); } url = Utils.removeTrailingSep(url) + p; } // Add the query string if(params) { let qs = ""; for(let pa in params) { let v = params[pa].toString(); qs += (qs ? '&' : "?") + encodeURIComponent(pa) + (v ? ('=' + encodeURIComponent(v)) : ""); } url = Utils.removeTrailingSep(url) + qs; } return url; }; function convertEmpty(xhr) { return null; } function convertText(xhr) { return xhr.responseText; } function convertJson(xhr) { return Utils.fromJson(xhr.responseText); } function convertXml(xhr) { return Utils.parseXml(xhr.responseText); } function findConvert(xhr) { let ct = xhr.getResponseHeader('content-type'); if(ct=='application/json') { return convertJson; } if(ct=='application/xml') { return convertXml; } return convertText; } // TODO: use fetch instead? export default class JsonHttpClient { constructor(url) { this.USE_HTTP_OVERRIDE = false; this.async = true; this._url = url; this._useQueryParams = false; } setQueryParams(queryParams) { this._useQueryParams = queryParams; } isError(status,xhr) { return status<200 || status>299; } getBaseUrl() { return this._url; } _makeUrl(parts,params) { return makeUrl(this._url,parts,params,this._useQueryParams); } _ajax(method,parts,params,contentType,content,cb,convert,mime) { // Calculate if the request should be async let async = this.async; if(cb && cb.async!==undefined) { async = cb.async; } // Return a Promise is async and there is no cb if(async && !cb) { let _this = this; return new Promise(function(resolve,reject){ _this._ajax(method,parts,params,contentType,content,{success:resolve,failure:reject},convert,mime); }); } let client = this; let headers = {}; if(this.USE_HTTP_OVERRIDE && (method=="PUT" || method=="DELETE")) { headers["x-http-method-override"] = method; method = "POST"; } let url = this._makeUrl(parts,params); let xhr = new XMLHttpRequest(); if(DEV_OPTIONS.credentials=="include") xhr.withCredentials = true xhr.open(method,url,async); xhr.onreadystatechange = function() { // http://xhr.spec.whatwg.org/#dom-xmlhttprequest-readystate if (xhr.readyState == 4 && cb) { if(client.isError(xhr.status,xhr)) { if(cb.failure) { cb.failure("Error "+xhr.status+" while executing asynchronous request, "+method+", "+url,findConvert(xhr)(xhr),xhr); } } else { let val = (convert||findConvert(xhr))(xhr); if(Utils.isArray(val)) { let meta = xhr.getResponseHeader("X-MetaData"); if(meta) { val._meta = meta; } } (cb.success||cb)(val,xhr); } } }; if(mime) { xhr.overrideMimeType(mime); } if(content) { if(contentType) { xhr.setRequestHeader("Content-Type", contentType); } xhr.send(content); } else { xhr.send(); } if(!async) { // Synchronized return if(client.isError(xhr.status,xhr)) { if(!cb || !cb.failure) { throw new Error("Error "+xhr.status+" while executing synchronous request, "+method+", "+url); } } else { let val = (convert||findConvert(xhr))(xhr); if(Utils.isArray(val)) { let meta = xhr.getResponseHeader("X-MetaData"); if(meta) { val._meta = meta; } } return val; } } } getAsEmpty(parts,params,cb) { return this._ajax('GET',parts,params,null,null,cb,convertEmpty); } getAsText(parts,params,cb) { return this._ajax('GET',parts,params,null,null,cb,convertText); } getAsJson(parts,params,cb) { return this._ajax('GET',parts,params,null,null,cb,convertJson); } getAsXml(parts,params,cb) { return this._ajax('GET',parts,params,null,null,cb,convertXml); } getAsBinaryString(parts,params,cb) { return this._ajax('GET',parts,params,null,null,cb,convertText,'text\/plain; charset=x-user-defined') } deleteAsEmpty(parts,params,cb) { return this._ajax('DELETE',parts,params,null,null,cb,convertEmpty); } deleteAsJson(parts,params,cb) { return this._ajax('DELETE',parts,params,null,null,cb,convertJson); } putJsonAsJson(parts,params,content,cb) { return this._ajax('PUT',parts,params,'application/json',Utils.toJson(content),cb,convertJson); } putEmptyAsJson(parts,params,cb) { return this._ajax('PUT',parts,params,null,null,cb,convertJson); } postJsonAsEmpty(parts,params,content,cb) { return this._ajax('POST',parts,params,'application/json',Utils.toJson(content),cb,convertEmpty); } postJsonAsJson(parts,params,content,cb) { return this._ajax('POST',parts,params,'application/json',Utils.toJson(content),cb,convertJson); } }