From 6ac7f3c8fa049ff8bb7ef54255d30437c2420617 Mon Sep 17 00:00:00 2001 From: Francisco Sanchez Date: Fri, 24 Jun 2016 19:54:22 +0200 Subject: [PATCH 1/2] implement extra callbacks in request --- dist/corbel.js | 14 +++++++++++++- dist/corbel.min.js | 6 +++--- dist/corbel.with-polyfills.js | 14 +++++++++++++- src/request.js | 14 ++++++++++++-- src/services.js | 2 +- 5 files changed, 42 insertions(+), 8 deletions(-) diff --git a/dist/corbel.js b/dist/corbel.js index 8b4436f..1f8cced 100644 --- a/dist/corbel.js +++ b/dist/corbel.js @@ -1508,6 +1508,7 @@ method: options.method || request.method.GET, url: options.url, headers: typeof options.headers === 'object' ? options.headers : {}, + callbackExtras: options.extras, callbackSuccess: options.success && typeof options.success === 'function' ? options.success : undefined, callbackError: options.error && typeof options.error === 'function' ? options.error : undefined, responseType: options.responseType, @@ -1796,6 +1797,16 @@ }.bind(this); + if (params.callbackExtras) { + if (params.callbackExtras.requestCallback) { + params.callbackExtras.requestCallback(httpReq); + } + if (params.callbackExtras.progressCallback) { + httpReq.upload.onprogress = function(event) { + params.callbackExtras.progressCallback(event); + }; + } + } if (params.data) { httpReq.send(params.data); @@ -1803,6 +1814,7 @@ //IE fix, send nothing (not null or undefined) httpReq.send(); } + }; return request; @@ -2048,7 +2060,7 @@ params = this._addAuthorization(params); - return corbel.utils.pick(params, ['url', 'dataType', 'contentType', 'method', 'headers', 'data', 'dataFilter', 'responseType', 'withCredentials', 'success', 'error']); + return corbel.utils.pick(params, ['url', 'dataType', 'contentType', 'method', 'headers', 'data', 'dataFilter', 'responseType', 'withCredentials', 'success', 'error', 'extras']); }, /** diff --git a/dist/corbel.min.js b/dist/corbel.min.js index 2165a3c..4964309 100644 --- a/dist/corbel.min.js +++ b/dist/corbel.min.js @@ -1,3 +1,3 @@ -!function(root,factory){"use strict";"function"==typeof define&&define.amd?define([],function(){return factory(root)}):"undefined"!=typeof module&&module.exports?module.exports=factory.call(root,root,process||void 0):void 0!==root&&(root.corbel=factory(root))}(this,function(root,process){"use strict";function Config(config){config=config||{},this.config={},corbel.utils.extend(this.config,config)}var corbel={};!function(){function CorbelDriver(config,events){events&&"object"==typeof events?this._events=corbel.utils.clone(events):this._events={},this.guid=corbel.utils.guid(),this.config=corbel.Config.create(config),this.iam=corbel.Iam.create(this),this.resources=corbel.Resources.create(this),this.assets=corbel.Assets.create(this),this.oauth=corbel.Oauth.create(this),this.notifications=corbel.Notifications.create(this),this.ec=corbel.Ec.create(this),this.evci=corbel.Evci.create(this),this.borrow=corbel.Borrow.create(this),this.composr=corbel.CompoSR.create(this),this.scheduler=corbel.Scheduler.create(this),this.webfs=corbel.Webfs.create(this),this.domain=corbel.Domain.create(this)}CorbelDriver.prototype.clone=function(){return new CorbelDriver(this.config.getConfig(),this._events)},CorbelDriver.prototype.addEventListener=function(name,fn){if("function"!=typeof fn)throw new Error("corbel:error:invalid:type");this._events[name]=this._events[name]||[],-1===this._events[name].indexOf(fn)&&this._events[name].push(fn)},CorbelDriver.prototype.removeEventListener=function(name,fn){if(this._events[name]){var index=this._events[name].indexOf(fn);-1!==index&&this._events[name].splice(index,1)}},CorbelDriver.prototype.dispatch=function(name,options){this._events[name]&&this._events[name].length&&this._events[name].forEach(function(fn){fn(options)})},CorbelDriver.prototype.on=CorbelDriver.prototype.addEventListener,CorbelDriver.prototype.off=CorbelDriver.prototype.removeEventListener,CorbelDriver.prototype.trigger=CorbelDriver.prototype.dispatch,corbel.CorbelDriver=CorbelDriver,corbel.getDriver=function(config){if(config=config||{},!config.urlBase)throw new Error("error:undefined:urlbase");return new CorbelDriver(config)}}(),function(){var utils=corbel.utils={};return utils.extend=function(obj){return Array.prototype.slice.call(arguments,1).forEach(function(source){if(source)for(var prop in source)obj[prop]=source[prop]}),obj},utils.inherit=function(prototypeProperties,staticProperties){var child,parent=this;child=prototypeProperties&&prototypeProperties.hasOwnProperty("constructor")?prototypeProperties.constructor:function(){return parent.apply(this,arguments)},utils.extend(child,parent,staticProperties);var Surrogate=function(){this.constructor=child};return Surrogate.prototype=parent.prototype,child.prototype=new Surrogate,prototypeProperties&&utils.extend(child.prototype,prototypeProperties),child.__super__=parent.prototype,child},utils.guid=function(){function s4(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return s4()+s4()+"-"+s4()+"-"+s4()+"-"+s4()+"-"+s4()+s4()+s4()},utils.reload=function(){void 0!==window&&window.location.reload()},utils.param=function(obj){var str=[];for(var p in obj)obj.hasOwnProperty(p)&&str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p]));return str.join("&")},utils.toURLEncoded=function(obj){var str=[];for(var p in obj)obj.hasOwnProperty(p)&&str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p]));return str.join("&")},utils.serializeParams=function(params){function getJsonEncodedStringify(param){return encodeURIComponent(JSON.stringify(param))}function queryObjectToString(params,key){var query,result="";params.queryDomain=params.queryDomain||"api",result+=params.queryDomain+":"+key+"=";try{return query="string"==typeof params[key]?JSON.parse(params[key]):JSON.parse(JSON.stringify(params[key])),result+=getJsonEncodedStringify(query)}catch(e){return result+params[key]}}var result="";if(void 0===params||null===params)return result;if(!(params instanceof Object)&&"object"!=typeof params)throw new Error("expected params to be an Object type, but got "+typeof params);return params.aggregation&&(result="api:aggregation="+getJsonEncodedStringify(params.aggregation)),params.query&&(params.queryDomain=params.queryDomain||"api",result+=result?"&":"",result+=queryObjectToString(params,"query")),params.queries&¶ms.queries.forEach(function(query){result+=result?"&":"",result+=queryObjectToString(query,"query")}),params.condition&&(params.queryDomain=params.queryDomain||"api",result+=result?"&":"",result+=queryObjectToString(params,"condition")),params.conditions&¶ms.conditions.forEach(function(condition){result+=result?"&":"",result+=queryObjectToString(condition,"condition")}),params.search&&(result+=result?"&":"",result+="api:search=",result+=params.search instanceof Object?getJsonEncodedStringify(params.search):encodeURIComponent(params.search),params.hasOwnProperty("indexFieldsOnly")&&(result+="&api:indexFieldsOnly="+getJsonEncodedStringify(params.indexFieldsOnly))),params.distinct&&(result+=result?"&":"",result+="api:distinct="+encodeURIComponent(params.distinct instanceof Array?params.distinct.join(","):params.distinct)),params.sort&&(result+=result?"&":"",result+="api:sort="+getJsonEncodedStringify(params.sort)),params.pagination&&((params.pagination.page||0===params.pagination.page)&&(result+=result?"&":"",result+="api:page="+params.pagination.page),(params.pagination.pageSize||0===params.pagination.pageSize)&&(result+=result?"&":"",result+="api:pageSize="+params.pagination.pageSize)),params.customQueryParams&&Object.keys(params.customQueryParams).forEach(function(param){result+=result?"&":"",result+=param+"="+encodeURIComponent(params.customQueryParams[param])}),result},utils.defaults=function(destiny,defaults){return Object.keys(defaults).forEach(function(key){"undefined"==typeof destiny[key]&&(destiny[key]=defaults[key])}),destiny},utils.pick=function(object,keys){var destiny={};return keys.forEach(function(key){destiny[key]=object[key]}),destiny},utils.clone=function clone(item){if(!item)return item;var result,types=[Number,String,Boolean];if(types.forEach(function(type){item instanceof type&&(result=type(item))}),"undefined"==typeof result)if("[object Array]"===Object.prototype.toString.call(item))result=[],item.forEach(function(child,index){result[index]=clone(child)});else if("object"==typeof item)if(item.nodeType&&"function"==typeof item.cloneNode)result=item.cloneNode(!0);else if(item.prototype)result=item;else if(item instanceof Date)result=new Date(item);else{result={};for(var i in item)result[i]=clone(item[i])}else result=item;return result},utils.keysToLowerCase=function(obj){if(void 0===obj||null===obj)return obj;for(var key,keys=Object.keys(obj),n=keys.length,newobj={};n--;)key=keys[n],newobj[key.toLowerCase()]=obj[key];return newobj},utils.isJSON=function(string){try{JSON.parse(string)}catch(e){return!1}return!0},utils.isStream=function(data){return!(!data.pipe||"function"!=typeof data.pipe)},utils.arrayToObject=function(array){var object={};return array.map(function(element,index){object[index]=element}),object},utils.copyArray=function(list){for(var newList=new Array(list.length),i=list.length;i--;)newList[i]=list[i];return newList},utils.dataURItoBlob=function(dataURI){var serialize;serialize=corbel.Config.isNode||!root.atob?require("base-64").decode:root.atob;var BlobBuilder,BlobConstructor;corbel.Config.isBrowser&&(BlobBuilder=window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,BlobConstructor=window.Blob);for(var byteString=serialize(dataURI.split(",")[1]),mimeString=dataURI.split(",")[0].split(":")[1].split(";")[0],arrayBuffer=new ArrayBuffer(byteString.length),_ia=new Uint8Array(arrayBuffer),i=0;imaxDelay)throw new Error("error:client-time:delay");return delay};return maxDelay=1e3*(maxDelay||MAX_TIME_DELTA),corbel.request.send({url:driver.config.getCurrentEndpoint("iam").replace(/v\d.\d\//,"")+"version",method:corbel.request.method.OPTIONS}).then(function(response){return checkDelay(response)})["catch"](function(error){if(0===error.data.length)throw new Error("error:server:not-available");throw error})},utils}(),function(){corbel.validate={},corbel.validate.values=function(keys,obj){var that=this;return keys.forEach(function(key){that.value(key,obj[key])}),!0},corbel.validate.value=function(key,value){return this.isDefined(value,key+" value is mandatory and cannot be undefined")},corbel.validate.isDefined=function(value,message){var isUndefined=void 0===value;if(isUndefined&&message)throw new Error(message);return!isUndefined},corbel.validate.failIfIsDefined=function(value,message){var isDefined=void 0!==value;if(isDefined&&message)throw new Error(message);return!isDefined},corbel.validate.isNotNull=function(value,message){var isNull=null===value;if(isNull&&message)throw new Error(message);return!isNull},corbel.validate.isValue=function(value,message){return this.isDefined(value,message)&&this.isNotNull(value,message)},corbel.validate.isObject=function(obj){return"object"==typeof obj},corbel.validate.isGreaterThan=function(value,greaterThan,message){var gt=this.isValue(value)&&value>greaterThan;if(!gt&&message)throw new Error(message);return gt},corbel.validate.isGreaterThanOrEqual=function(value,isGreaterThanOrEqual,message){var gte=this.isValue(value)&&value>=isGreaterThanOrEqual;if(!gte&&message)throw new Error(message);return gte}}(),function(){return corbel.Object=function(){return this},corbel.Object.inherit=corbel.utils.inherit,corbel.Object}(),function(){corbel.cryptography=function(){function b64_hmac_sha256(k,d){return rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k),str2rstr_utf8(d)))}function rstr_hmac_sha256(key,data){var bkey=rstr2binb(key);bkey.length>16&&(bkey=binb_sha256(bkey,8*key.length));for(var ipad=Array(16),opad=Array(16),i=0;16>i;i++)ipad[i]=909522486^bkey[i],opad[i]=1549556828^bkey[i];var hash=binb_sha256(ipad.concat(rstr2binb(data)),512+8*data.length);return binb2rstr(binb_sha256(opad.concat(hash),768))}function rstr2b64(input){try{}catch(e){b64pad=""}for(var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",output="",len=input.length,i=0;len>i;i+=3)for(var triplet=input.charCodeAt(i)<<16|(len>i+1?input.charCodeAt(i+1)<<8:0)|(len>i+2?input.charCodeAt(i+2):0),j=0;4>j;j++)output+=8*i+6*j>8*input.length?b64pad:tab.charAt(triplet>>>6*(3-j)&63);return output}function str2rstr_utf8(input){for(var x,y,output="",i=-1;++i=55296&&56319>=x&&y>=56320&&57343>=y&&(x=65536+((1023&x)<<10)+(1023&y),i++),127>=x?output+=String.fromCharCode(x):2047>=x?output+=String.fromCharCode(192|x>>>6&31,128|63&x):65535>=x?output+=String.fromCharCode(224|x>>>12&15,128|x>>>6&63,128|63&x):2097151>=x&&(output+=String.fromCharCode(240|x>>>18&7,128|x>>>12&63,128|x>>>6&63,128|63&x));return output}function rstr2binb(input){for(var output=Array(input.length>>2),i=0;i>5]|=(255&input.charCodeAt(i/8))<<24-i%32;return output}function binb2rstr(input){for(var output="",i=0;i<32*input.length;i+=8)output+=String.fromCharCode(input[i>>5]>>>24-i%32&255);return output}function sha256_S(X,n){return X>>>n|X<<32-n}function sha256_R(X,n){return X>>>n}function sha256_Ch(x,y,z){return x&y^~x&z}function sha256_Maj(x,y,z){return x&y^x&z^y&z}function sha256_Sigma0256(x){return sha256_S(x,2)^sha256_S(x,13)^sha256_S(x,22)}function sha256_Sigma1256(x){return sha256_S(x,6)^sha256_S(x,11)^sha256_S(x,25)}function sha256_Gamma0256(x){return sha256_S(x,7)^sha256_S(x,18)^sha256_R(x,3)}function sha256_Gamma1256(x){return sha256_S(x,17)^sha256_S(x,19)^sha256_R(x,10)}function binb_sha256(m,l){var a,b,c,d,e,f,g,h,i,j,T1,T2,HASH=new Array(1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225),W=new Array(64);for(m[l>>5]|=128<<24-l%32,m[(l+64>>9<<4)+15]=l,i=0;ij;j++)16>j?W[j]=m[j+i]:W[j]=safe_add(safe_add(safe_add(sha256_Gamma1256(W[j-2]),W[j-7]),sha256_Gamma0256(W[j-15])),W[j-16]),T1=safe_add(safe_add(safe_add(safe_add(h,sha256_Sigma1256(e)),sha256_Ch(e,f,g)),sha256_K[j]),W[j]),T2=safe_add(sha256_Sigma0256(a),sha256_Maj(a,b,c)),h=g,g=f,f=e,e=safe_add(d,T1),d=c,c=b,b=a,a=safe_add(T1,T2);HASH[0]=safe_add(a,HASH[0]),HASH[1]=safe_add(b,HASH[1]),HASH[2]=safe_add(c,HASH[2]),HASH[3]=safe_add(d,HASH[3]),HASH[4]=safe_add(e,HASH[4]),HASH[5]=safe_add(f,HASH[5]),HASH[6]=safe_add(g,HASH[6]),HASH[7]=safe_add(h,HASH[7])}return HASH}function safe_add(x,y){var lsw=(65535&x)+(65535&y),msw=(x>>16)+(y>>16)+(lsw>>16);return msw<<16|65535&lsw}function b64tob64u(s){return s=s.replace(/\=/g,""),s=s.replace(/\+/g,"-"),s=s.replace(/\//g,"_")}var b64pad="",sha256_K=new Array(1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998);return{rstr2b64:rstr2b64,str2rstr_utf8:str2rstr_utf8,b64_hmac_sha256:b64_hmac_sha256,b64tob64u:b64tob64u}}()}(),function(){var jwt=corbel.jwt={EXPIRATION:3500,ALGORITHM:"HS256",TYP:"JWT",VERSION:"1.0.0",generate:function(claims,secret,alg){if(claims=claims||{},claims.exp=claims.exp||jwt._generateExp(),!claims.iss)throw new Error("jwt:undefined:iss");if(!claims.aud)throw new Error("jwt:undefined:aud");return jwt._generate(claims,secret,alg)},_generate:function(claims,secret,alg){alg=alg||jwt.ALGORITHM;var claimsKeys=["iss","aud","exp","scope","prn","version","refresh_token","request_domain","basic_auth.username","basic_auth.password","device_id"],finalClaims={};claimsKeys.forEach(function(key){claims[key]&&(finalClaims[key]=claims[key])}),corbel.utils.extend(finalClaims,claims),Array.isArray(finalClaims.scope)&&(finalClaims.scope=finalClaims.scope.join(" "));var bAlg=corbel.cryptography.rstr2b64(corbel.cryptography.str2rstr_utf8(JSON.stringify({typ:jwt.TYP,alg:alg}))),bClaims=corbel.cryptography.rstr2b64(corbel.cryptography.str2rstr_utf8(JSON.stringify(finalClaims))),segment=bAlg+"."+bClaims,assertion=corbel.cryptography.b64tob64u(corbel.cryptography.b64_hmac_sha256(secret,segment));return segment+"."+assertion},_generateExp:function(){return Math.round((new Date).getTime()/1e3)+jwt.EXPIRATION},decode:function(assertion){var serialize;serialize=corbel.Config.isNode||!root.atob?require("base-64").decode:root.atob;var decoded=assertion.split(".");try{decoded[0]=JSON.parse(serialize(decoded[0]))}catch(e){decoded[0]=!1}try{decoded[1]=JSON.parse(serialize(decoded[1]))}catch(e){decoded[1]=!1}if(!decoded[0]&&!decoded[1])throw new Error("corbel:jwt:decode:invalid_assertion");return decoded[0]=decoded[0]||{},decoded[1]=decoded[1]||{},Object.keys(decoded[1]).forEach(function(key){decoded[0][key]=decoded[1][key]}),decoded[0]}};return jwt}(),function(){function doRequest(module,params,resolver){corbel.Config.isBrowser?request._browserAjax.call(module,params,resolver):request._nodeAjax.call(module,params,resolver)}var request=corbel.request={method:{GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE",OPTIONS:"OPTIONS",PATCH:"PATCH",HEAD:"HEAD"}};request.serializeHandlers={json:function(data,cb){cb("string"!=typeof data?JSON.stringify(data):data)},"form-urlencoded":function(data,cb){cb(corbel.utils.toURLEncoded(data))},dataURI:function(data,cb){cb(corbel.Config.isNode?corbel.utils.toURLEncoded(data):corbel.utils.dataURItoBlob(data))},blob:function(data,cb){if(data instanceof ArrayBuffer)throw new Error("ArrayBuffer is not supported, please use Blob");cb(data)},stream:function(data,cb){if(data instanceof ArrayBuffer)throw new Error("ArrayBuffer is not supported, please use Blob, File, Stream or ArrayBufferView");cb(data)}},request.serialize=function(data,contentType,cb){var contentTypeSerializable=Object.keys(request.serializeHandlers).filter(function(type){return-1!==contentType.indexOf(type)?type:void 0});contentTypeSerializable.length>0?request.serializeHandlers[contentTypeSerializable[0]](data,cb):cb(data)},request.parseHandlers={json:function(data){return data=data||"{}","string"==typeof data&&(data=JSON.parse(data)),data}},request.parse=function(data,responseType,dataType){var parsed;return Object.keys(request.parseHandlers).forEach(function(type){responseType&&-1!==responseType.indexOf(type)&&(parsed=request.parseHandlers[type](data,dataType))}),parsed=parsed||data},request.send=function(options,driver){options=options||{};var module=this;if(!options.url)throw new Error("undefined:url");if("string"!=typeof options.url)throw new Error("invalid:url",options.url);options.withCredentials="boolean"==typeof options.withCredentials?options.withCredentials:!0;var params={method:options.method||request.method.GET,url:options.url,headers:"object"==typeof options.headers?options.headers:{},callbackSuccess:options.success&&"function"==typeof options.success?options.success:void 0,callbackError:options.error&&"function"==typeof options.error?options.error:void 0,responseType:options.responseType,withCredentials:options.withCredentials,useCookies:options.useCookies||!1};params=rewriteRequestToPostIfUrlLengthIsTooLarge(options,params),params.headers["content-type"]=options.contentType||"application/json";var resolver,dataMethods=[request.method.PUT,request.method.POST,request.method.PATCH],promise=new Promise(function(resolve,reject){resolver={resolve:resolve,reject:reject},driver&&driver.trigger("request",params)});return-1!==dataMethods.indexOf(params.method)?request.serialize(options.data,params.headers["content-type"],function(serialized){params.data=serialized,doRequest(module,params,resolver)}):doRequest(module,params,resolver),promise};var xhrSuccessStatus={0:200,1223:204},processResponse=function(response,resolver,callbackSuccess,callbackError){var promiseResponse,statusCode=xhrSuccessStatus[response.status]||response.status,statusType=Number(response.status.toString()[0]),data=response.response,headers=corbel.utils.keysToLowerCase(response.headers);if(3>=statusType&&!response.error)response.response&&(data=request.parse(response.response,response.responseType,response.dataType)),callbackSuccess&&callbackSuccess.call(this,data,statusCode,response.responseObject,headers),promiseResponse={data:data,status:statusCode,headers:headers},promiseResponse[response.responseObjectType]=response.responseObject,resolver.resolve(promiseResponse);else{var disconnected=response.error&&0===response.status;statusCode=disconnected?0:statusCode,callbackError&&callbackError.call(this,response.error,statusCode,response.responseObject,headers),response.response&&(data=request.parse(response.response,response.responseType,response.dataType)),promiseResponse={data:data,status:statusCode,error:response.error,headers:headers},promiseResponse[response.responseObjectType]=response.responseObject,resolver.reject(promiseResponse)}},rewriteRequestToPostIfUrlLengthIsTooLarge=function(options,params){var AUTOMATIC_HTTP_METHOD_OVERRIDE=corbel.Config.AUTOMATIC_HTTP_METHOD_OVERRIDE||!0,HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN=corbel.Config.HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN||2048;if(AUTOMATIC_HTTP_METHOD_OVERRIDE&¶ms.method===request.method.GET&¶ms.url.length>HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN){var url=params.url.split("?");params.method=request.method.POST,params.headers["X-HTTP-Method-Override"]=request.method.GET,params.url=url[0],options.data=encodeUrlToForm(url[1]),options.contentType="application/x-www-form-urlencoded"}return params},encodeUrlToForm=function(url){var form={};return url.split("&").forEach(function(formEntry){var formPair=formEntry.split("=");form[formPair[0]]=formPair[1]}),form};return request._getNodeRequestAjax=function(params){var requestAjax=require("request");return request.isCrossDomain(params.url)&¶ms.withCredentials&¶ms.useCookies&&(requestAjax=requestAjax.defaults({jar:!0})),requestAjax},request._getNodeRequestCallback=function(context,params,resolver){return function(error,response,body){var responseType,status;error?(responseType=void 0,status=0):(responseType=response.responseType||response.headers["content-type"],status=response.statusCode),processResponse.call(context,{responseObject:response,dataType:params.dataType,responseType:responseType,response:body,status:status,headers:response?response.headers:{},responseObjectType:"response",error:error},resolver,params.callbackSuccess,params.callbackError)}},request._nodeAjax=function(params,resolver){var requestAjax=request._getNodeRequestAjax(params),requestOptions={method:params.method,url:params.url,headers:params.headers},data=params.data||"",callbackRequest=request._getNodeRequestCallback(this,params,resolver);corbel.utils.isStream(data)?data.pipe(requestAjax(requestOptions,callbackRequest)):(requestOptions.body=data,requestAjax(requestOptions,callbackRequest))},request.isCrossDomain=function(url){return!(!url||"string"!=typeof url||-1===url.indexOf("http"))},request._parseResponseHeaders=function(headerStr){var headers={};if(!headerStr)return headers;for(var headerPairs=headerStr.split("\r\n"),i=0;i0){var key=headerPair.substring(0,index),val=headerPair.substring(index+2);headers[key]=val}}return headers},request._browserAjax=function(params,resolver){var httpReq=new XMLHttpRequest;httpReq.open(params.method,params.url,!0),request.isCrossDomain(params.url)&¶ms.withCredentials&&(httpReq.withCredentials=!0);for(var header in params.headers)params.headers.hasOwnProperty(header)&&httpReq.setRequestHeader(header,params.headers[header]);httpReq.responseType=params.responseType||httpReq.responseType,httpReq.onload=function(xhr){xhr=xhr||httpReq,xhr=xhr.target||xhr,processResponse.call(this,{responseObject:xhr,dataType:xhr.dataType,responseType:xhr.responseType||xhr.getResponseHeader("content-type"),response:xhr.response||xhr.responseText,status:xhr.status,headers:request._parseResponseHeaders(xhr.getAllResponseHeaders()),responseObjectType:"xhr",error:xhr.error},resolver,params.callbackSuccess,params.callbackError)}.bind(this),httpReq.onerror=function(xhr){xhr=xhr||httpReq,xhr=xhr.target||xhr;var error=xhr.error?xhr.error:!0;processResponse.call(this,{responseObject:xhr,dataType:xhr.dataType,responseType:xhr.responseType||xhr.getResponseHeader("content-type"),response:xhr.response||xhr.responseText,status:xhr.status,responseObjectType:"xhr",error:error},resolver,params.callbackSuccess,params.callbackError)}.bind(this),params.data?httpReq.send(params.data):httpReq.send()},request}(),function(){var Services=corbel.Services=corbel.Object.inherit({constructor:function(driver){this.driver=driver},request:function(args){this.driver.trigger("service:request:before",args);var that=this;return this._requestWithRetries(args).then(function(response){return that.driver.trigger("service:request:after",response),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),response})["catch"](function(error){throw that.driver.trigger("service:request:after",error),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),error})},_requestWithRetries:function(args){var that=this,maxRetries=corbel.Services._UNAUTHORIZED_MAX_RETRIES,requestParameters=that._buildParams(args);return that._doRequest(requestParameters)["catch"](function(response){var retries=that.driver.config.get(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0);if(maxRetries>retries&&response.status===corbel.Services._UNAUTHORIZED_STATUS_CODE)return that._refreshToken().then(function(){return that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,retries+1),that._requestWithRetries(args)["catch"](function(retryResponse){throw response=retryResponse})})["catch"](function(){throw response});throw response})},_doRequest:function(params){var that=this;return corbel.request.send(params,that.driver).then(function(response){return that.driver.config.set(corbel.Services._FORCE_UPDATE_STATUS,0),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),response})["catch"](function(response){if(response.status===corbel.Services._FORCE_UPDATE_STATUS_CODE&&response.textStatus===corbel.Services._FORCE_UPDATE_TEXT){var retries=that.driver.config.get(corbel.Services._FORCE_UPDATE_STATUS,0);throw retries0&&(query=queries.join("&"))}return query},_buildUri:corbel.CompoSR._buildUri})}(),function(){return corbel.Webfs=corbel.Object.inherit({constructor:function(driver){this.driver=driver},webfs:function(id){return new corbel.Webfs.WebfsBuilder(this.driver,id)}},{moduleName:"webfs",defaultPort:8096,defaultDomain:"unauthenticated",domain:"domain",create:function(driver){return new corbel.Webfs(driver)}}),corbel.Webfs}(),function(){var WebfsBuilder=corbel.Webfs.WebfsBuilder=corbel.Services.inherit({constructor:function(driver,id){this.driver=driver,this.id=id},get:function(params){corbel.validate.value("id",this.id);var options=params?corbel.utils.clone(params):{},args=corbel.utils.extend(options,{url:this._buildUriWithDomain(this.id),method:corbel.request.method.GET,query:params?corbel.utils.serializeParams(params):null});return this.request(args)},"delete":function(){corbel.validate.value("id",this.id);var args={url:this._buildUriWithDomain(this.id),method:corbel.request.method.DELETE};return this.request(args)},_buildUri:function(id){var urlBase=this.driver.config.getCurrentEndpoint(corbel.Webfs.moduleName,this._buildPort(this.driver.config));return urlBase+id},_buildUriWithDomain:function(id){var urlBase=this.driver.config.getCurrentEndpoint(corbel.Webfs.moduleName,this._buildPort(this.driver.config)),domain=this.driver.config.get(corbel.Webfs.domain,corbel.Webfs.defaultDomain),customDomain=this.driver.config.get(corbel.Domain.CUSTOM_DOMAIN,domain);this.driver.config.set(corbel.Domain.CUSTOM_DOMAIN,void 0);var uriWithDomain=urlBase+customDomain+"/path";return id&&(uriWithDomain+="/"+id),uriWithDomain},_buildPort:function(config){return config.get("webfsPort",null)||corbel.Webfs.defaultPort}},{moduleName:"webfs",create:function(driver){return new corbel.Webfs.WebfsBuilder(driver)}});return WebfsBuilder}(),function(){return corbel.Domain=corbel.Object.inherit({constructor:function(driver){return this.driver=driver,function(id){return driver.config.set(corbel.Domain.CUSTOM_DOMAIN,id),driver}}},{moduleName:"domain",CUSTOM_DOMAIN:"customDomain",create:function(driver){return new corbel.Domain(driver)}}),corbel.Domain}(),corbel}); \ No newline at end of file +!function(root,factory){"use strict";"function"==typeof define&&define.amd?define([],function(){return factory(root)}):"undefined"!=typeof module&&module.exports?module.exports=factory.call(root,root,process||void 0):void 0!==root&&(root.corbel=factory(root))}(this,function(root,process){"use strict";function Config(config){config=config||{},this.config={},corbel.utils.extend(this.config,config)}var corbel={};!function(){function CorbelDriver(config,events){events&&"object"==typeof events?this._events=corbel.utils.clone(events):this._events={},this.guid=corbel.utils.guid(),this.config=corbel.Config.create(config),this.iam=corbel.Iam.create(this),this.resources=corbel.Resources.create(this),this.assets=corbel.Assets.create(this),this.oauth=corbel.Oauth.create(this),this.notifications=corbel.Notifications.create(this),this.ec=corbel.Ec.create(this),this.evci=corbel.Evci.create(this),this.borrow=corbel.Borrow.create(this),this.composr=corbel.CompoSR.create(this),this.scheduler=corbel.Scheduler.create(this),this.webfs=corbel.Webfs.create(this),this.domain=corbel.Domain.create(this)}CorbelDriver.prototype.clone=function(){return new CorbelDriver(this.config.getConfig(),this._events)},CorbelDriver.prototype.addEventListener=function(name,fn){if("function"!=typeof fn)throw new Error("corbel:error:invalid:type");this._events[name]=this._events[name]||[],-1===this._events[name].indexOf(fn)&&this._events[name].push(fn)},CorbelDriver.prototype.removeEventListener=function(name,fn){if(this._events[name]){var index=this._events[name].indexOf(fn);-1!==index&&this._events[name].splice(index,1)}},CorbelDriver.prototype.dispatch=function(name,options){this._events[name]&&this._events[name].length&&this._events[name].forEach(function(fn){fn(options)})},CorbelDriver.prototype.on=CorbelDriver.prototype.addEventListener,CorbelDriver.prototype.off=CorbelDriver.prototype.removeEventListener,CorbelDriver.prototype.trigger=CorbelDriver.prototype.dispatch,corbel.CorbelDriver=CorbelDriver,corbel.getDriver=function(config){if(config=config||{},!config.urlBase)throw new Error("error:undefined:urlbase");return new CorbelDriver(config)}}(),function(){var utils=corbel.utils={};return utils.extend=function(obj){return Array.prototype.slice.call(arguments,1).forEach(function(source){if(source)for(var prop in source)obj[prop]=source[prop]}),obj},utils.inherit=function(prototypeProperties,staticProperties){var child,parent=this;child=prototypeProperties&&prototypeProperties.hasOwnProperty("constructor")?prototypeProperties.constructor:function(){return parent.apply(this,arguments)},utils.extend(child,parent,staticProperties);var Surrogate=function(){this.constructor=child};return Surrogate.prototype=parent.prototype,child.prototype=new Surrogate,prototypeProperties&&utils.extend(child.prototype,prototypeProperties),child.__super__=parent.prototype,child},utils.guid=function(){function s4(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return s4()+s4()+"-"+s4()+"-"+s4()+"-"+s4()+"-"+s4()+s4()+s4()},utils.reload=function(){void 0!==window&&window.location.reload()},utils.param=function(obj){var str=[];for(var p in obj)obj.hasOwnProperty(p)&&str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p]));return str.join("&")},utils.toURLEncoded=function(obj){var str=[];for(var p in obj)obj.hasOwnProperty(p)&&str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p]));return str.join("&")},utils.serializeParams=function(params){function getJsonEncodedStringify(param){return encodeURIComponent(JSON.stringify(param))}function queryObjectToString(params,key){var query,result="";params.queryDomain=params.queryDomain||"api",result+=params.queryDomain+":"+key+"=";try{return query="string"==typeof params[key]?JSON.parse(params[key]):JSON.parse(JSON.stringify(params[key])),result+=getJsonEncodedStringify(query)}catch(e){return result+params[key]}}var result="";if(void 0===params||null===params)return result;if(!(params instanceof Object)&&"object"!=typeof params)throw new Error("expected params to be an Object type, but got "+typeof params);return params.aggregation&&(result="api:aggregation="+getJsonEncodedStringify(params.aggregation)),params.query&&(params.queryDomain=params.queryDomain||"api",result+=result?"&":"",result+=queryObjectToString(params,"query")),params.queries&¶ms.queries.forEach(function(query){result+=result?"&":"",result+=queryObjectToString(query,"query")}),params.condition&&(params.queryDomain=params.queryDomain||"api",result+=result?"&":"",result+=queryObjectToString(params,"condition")),params.conditions&¶ms.conditions.forEach(function(condition){result+=result?"&":"",result+=queryObjectToString(condition,"condition")}),params.search&&(result+=result?"&":"",result+="api:search=",result+=params.search instanceof Object?getJsonEncodedStringify(params.search):encodeURIComponent(params.search),params.hasOwnProperty("indexFieldsOnly")&&(result+="&api:indexFieldsOnly="+getJsonEncodedStringify(params.indexFieldsOnly))),params.distinct&&(result+=result?"&":"",result+="api:distinct="+encodeURIComponent(params.distinct instanceof Array?params.distinct.join(","):params.distinct)),params.sort&&(result+=result?"&":"",result+="api:sort="+getJsonEncodedStringify(params.sort)),params.pagination&&((params.pagination.page||0===params.pagination.page)&&(result+=result?"&":"",result+="api:page="+params.pagination.page),(params.pagination.pageSize||0===params.pagination.pageSize)&&(result+=result?"&":"",result+="api:pageSize="+params.pagination.pageSize)),params.customQueryParams&&Object.keys(params.customQueryParams).forEach(function(param){result+=result?"&":"",result+=param+"="+encodeURIComponent(params.customQueryParams[param])}),result},utils.defaults=function(destiny,defaults){return Object.keys(defaults).forEach(function(key){"undefined"==typeof destiny[key]&&(destiny[key]=defaults[key])}),destiny},utils.pick=function(object,keys){var destiny={};return keys.forEach(function(key){destiny[key]=object[key]}),destiny},utils.clone=function clone(item){if(!item)return item;var result,types=[Number,String,Boolean];if(types.forEach(function(type){item instanceof type&&(result=type(item))}),"undefined"==typeof result)if("[object Array]"===Object.prototype.toString.call(item))result=[],item.forEach(function(child,index){result[index]=clone(child)});else if("object"==typeof item)if(item.nodeType&&"function"==typeof item.cloneNode)result=item.cloneNode(!0);else if(item.prototype)result=item;else if(item instanceof Date)result=new Date(item);else{result={};for(var i in item)result[i]=clone(item[i])}else result=item;return result},utils.keysToLowerCase=function(obj){if(void 0===obj||null===obj)return obj;for(var key,keys=Object.keys(obj),n=keys.length,newobj={};n--;)key=keys[n],newobj[key.toLowerCase()]=obj[key];return newobj},utils.isJSON=function(string){try{JSON.parse(string)}catch(e){return!1}return!0},utils.isStream=function(data){return!(!data.pipe||"function"!=typeof data.pipe)},utils.arrayToObject=function(array){var object={};return array.map(function(element,index){object[index]=element}),object},utils.copyArray=function(list){for(var newList=new Array(list.length),i=list.length;i--;)newList[i]=list[i];return newList},utils.dataURItoBlob=function(dataURI){var serialize;serialize=corbel.Config.isNode||!root.atob?require("base-64").decode:root.atob;var BlobBuilder,BlobConstructor;corbel.Config.isBrowser&&(BlobBuilder=window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,BlobConstructor=window.Blob);for(var byteString=serialize(dataURI.split(",")[1]),mimeString=dataURI.split(",")[0].split(":")[1].split(";")[0],arrayBuffer=new ArrayBuffer(byteString.length),_ia=new Uint8Array(arrayBuffer),i=0;imaxDelay)throw new Error("error:client-time:delay");return delay};return maxDelay=1e3*(maxDelay||MAX_TIME_DELTA),corbel.request.send({url:driver.config.getCurrentEndpoint("iam").replace(/v\d.\d\//,"")+"version",method:corbel.request.method.OPTIONS}).then(function(response){return checkDelay(response)})["catch"](function(error){if(0===error.data.length)throw new Error("error:server:not-available");throw error})},utils}(),function(){corbel.validate={},corbel.validate.values=function(keys,obj){var that=this;return keys.forEach(function(key){that.value(key,obj[key])}),!0},corbel.validate.value=function(key,value){return this.isDefined(value,key+" value is mandatory and cannot be undefined")},corbel.validate.isDefined=function(value,message){var isUndefined=void 0===value;if(isUndefined&&message)throw new Error(message);return!isUndefined},corbel.validate.failIfIsDefined=function(value,message){var isDefined=void 0!==value;if(isDefined&&message)throw new Error(message);return!isDefined},corbel.validate.isNotNull=function(value,message){var isNull=null===value;if(isNull&&message)throw new Error(message);return!isNull},corbel.validate.isValue=function(value,message){return this.isDefined(value,message)&&this.isNotNull(value,message)},corbel.validate.isObject=function(obj){return"object"==typeof obj},corbel.validate.isGreaterThan=function(value,greaterThan,message){var gt=this.isValue(value)&&value>greaterThan;if(!gt&&message)throw new Error(message);return gt},corbel.validate.isGreaterThanOrEqual=function(value,isGreaterThanOrEqual,message){var gte=this.isValue(value)&&value>=isGreaterThanOrEqual;if(!gte&&message)throw new Error(message);return gte}}(),function(){return corbel.Object=function(){return this},corbel.Object.inherit=corbel.utils.inherit,corbel.Object}(),function(){corbel.cryptography=function(){function b64_hmac_sha256(k,d){return rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k),str2rstr_utf8(d)))}function rstr_hmac_sha256(key,data){var bkey=rstr2binb(key);bkey.length>16&&(bkey=binb_sha256(bkey,8*key.length));for(var ipad=Array(16),opad=Array(16),i=0;16>i;i++)ipad[i]=909522486^bkey[i],opad[i]=1549556828^bkey[i];var hash=binb_sha256(ipad.concat(rstr2binb(data)),512+8*data.length);return binb2rstr(binb_sha256(opad.concat(hash),768))}function rstr2b64(input){try{}catch(e){b64pad=""}for(var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",output="",len=input.length,i=0;len>i;i+=3)for(var triplet=input.charCodeAt(i)<<16|(len>i+1?input.charCodeAt(i+1)<<8:0)|(len>i+2?input.charCodeAt(i+2):0),j=0;4>j;j++)output+=8*i+6*j>8*input.length?b64pad:tab.charAt(triplet>>>6*(3-j)&63);return output}function str2rstr_utf8(input){for(var x,y,output="",i=-1;++i=55296&&56319>=x&&y>=56320&&57343>=y&&(x=65536+((1023&x)<<10)+(1023&y),i++),127>=x?output+=String.fromCharCode(x):2047>=x?output+=String.fromCharCode(192|x>>>6&31,128|63&x):65535>=x?output+=String.fromCharCode(224|x>>>12&15,128|x>>>6&63,128|63&x):2097151>=x&&(output+=String.fromCharCode(240|x>>>18&7,128|x>>>12&63,128|x>>>6&63,128|63&x));return output}function rstr2binb(input){for(var output=Array(input.length>>2),i=0;i>5]|=(255&input.charCodeAt(i/8))<<24-i%32;return output}function binb2rstr(input){for(var output="",i=0;i<32*input.length;i+=8)output+=String.fromCharCode(input[i>>5]>>>24-i%32&255);return output}function sha256_S(X,n){return X>>>n|X<<32-n}function sha256_R(X,n){return X>>>n}function sha256_Ch(x,y,z){return x&y^~x&z}function sha256_Maj(x,y,z){return x&y^x&z^y&z}function sha256_Sigma0256(x){return sha256_S(x,2)^sha256_S(x,13)^sha256_S(x,22)}function sha256_Sigma1256(x){return sha256_S(x,6)^sha256_S(x,11)^sha256_S(x,25)}function sha256_Gamma0256(x){return sha256_S(x,7)^sha256_S(x,18)^sha256_R(x,3)}function sha256_Gamma1256(x){return sha256_S(x,17)^sha256_S(x,19)^sha256_R(x,10)}function binb_sha256(m,l){var a,b,c,d,e,f,g,h,i,j,T1,T2,HASH=new Array(1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225),W=new Array(64);for(m[l>>5]|=128<<24-l%32,m[(l+64>>9<<4)+15]=l,i=0;ij;j++)16>j?W[j]=m[j+i]:W[j]=safe_add(safe_add(safe_add(sha256_Gamma1256(W[j-2]),W[j-7]),sha256_Gamma0256(W[j-15])),W[j-16]),T1=safe_add(safe_add(safe_add(safe_add(h,sha256_Sigma1256(e)),sha256_Ch(e,f,g)),sha256_K[j]),W[j]),T2=safe_add(sha256_Sigma0256(a),sha256_Maj(a,b,c)),h=g,g=f,f=e,e=safe_add(d,T1),d=c,c=b,b=a,a=safe_add(T1,T2);HASH[0]=safe_add(a,HASH[0]),HASH[1]=safe_add(b,HASH[1]),HASH[2]=safe_add(c,HASH[2]),HASH[3]=safe_add(d,HASH[3]),HASH[4]=safe_add(e,HASH[4]),HASH[5]=safe_add(f,HASH[5]),HASH[6]=safe_add(g,HASH[6]),HASH[7]=safe_add(h,HASH[7])}return HASH}function safe_add(x,y){var lsw=(65535&x)+(65535&y),msw=(x>>16)+(y>>16)+(lsw>>16);return msw<<16|65535&lsw}function b64tob64u(s){return s=s.replace(/\=/g,""),s=s.replace(/\+/g,"-"),s=s.replace(/\//g,"_")}var b64pad="",sha256_K=new Array(1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998);return{rstr2b64:rstr2b64,str2rstr_utf8:str2rstr_utf8,b64_hmac_sha256:b64_hmac_sha256,b64tob64u:b64tob64u}}()}(),function(){var jwt=corbel.jwt={EXPIRATION:3500,ALGORITHM:"HS256",TYP:"JWT",VERSION:"1.0.0",generate:function(claims,secret,alg){if(claims=claims||{},claims.exp=claims.exp||jwt._generateExp(),!claims.iss)throw new Error("jwt:undefined:iss");if(!claims.aud)throw new Error("jwt:undefined:aud");return jwt._generate(claims,secret,alg)},_generate:function(claims,secret,alg){alg=alg||jwt.ALGORITHM;var claimsKeys=["iss","aud","exp","scope","prn","version","refresh_token","request_domain","basic_auth.username","basic_auth.password","device_id"],finalClaims={};claimsKeys.forEach(function(key){claims[key]&&(finalClaims[key]=claims[key])}),corbel.utils.extend(finalClaims,claims),Array.isArray(finalClaims.scope)&&(finalClaims.scope=finalClaims.scope.join(" "));var bAlg=corbel.cryptography.rstr2b64(corbel.cryptography.str2rstr_utf8(JSON.stringify({typ:jwt.TYP,alg:alg}))),bClaims=corbel.cryptography.rstr2b64(corbel.cryptography.str2rstr_utf8(JSON.stringify(finalClaims))),segment=bAlg+"."+bClaims,assertion=corbel.cryptography.b64tob64u(corbel.cryptography.b64_hmac_sha256(secret,segment));return segment+"."+assertion},_generateExp:function(){return Math.round((new Date).getTime()/1e3)+jwt.EXPIRATION},decode:function(assertion){var serialize;serialize=corbel.Config.isNode||!root.atob?require("base-64").decode:root.atob;var decoded=assertion.split(".");try{decoded[0]=JSON.parse(serialize(decoded[0]))}catch(e){decoded[0]=!1}try{decoded[1]=JSON.parse(serialize(decoded[1]))}catch(e){decoded[1]=!1}if(!decoded[0]&&!decoded[1])throw new Error("corbel:jwt:decode:invalid_assertion");return decoded[0]=decoded[0]||{},decoded[1]=decoded[1]||{},Object.keys(decoded[1]).forEach(function(key){decoded[0][key]=decoded[1][key]}),decoded[0]}};return jwt}(),function(){function doRequest(module,params,resolver){corbel.Config.isBrowser?request._browserAjax.call(module,params,resolver):request._nodeAjax.call(module,params,resolver)}var request=corbel.request={method:{GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE",OPTIONS:"OPTIONS",PATCH:"PATCH",HEAD:"HEAD"}};request.serializeHandlers={json:function(data,cb){cb("string"!=typeof data?JSON.stringify(data):data)},"form-urlencoded":function(data,cb){cb(corbel.utils.toURLEncoded(data))},dataURI:function(data,cb){cb(corbel.Config.isNode?corbel.utils.toURLEncoded(data):corbel.utils.dataURItoBlob(data))},blob:function(data,cb){if(data instanceof ArrayBuffer)throw new Error("ArrayBuffer is not supported, please use Blob");cb(data)},stream:function(data,cb){if(data instanceof ArrayBuffer)throw new Error("ArrayBuffer is not supported, please use Blob, File, Stream or ArrayBufferView");cb(data)}},request.serialize=function(data,contentType,cb){var contentTypeSerializable=Object.keys(request.serializeHandlers).filter(function(type){return-1!==contentType.indexOf(type)?type:void 0});contentTypeSerializable.length>0?request.serializeHandlers[contentTypeSerializable[0]](data,cb):cb(data)},request.parseHandlers={json:function(data){return data=data||"{}","string"==typeof data&&(data=JSON.parse(data)),data}},request.parse=function(data,responseType,dataType){var parsed;return Object.keys(request.parseHandlers).forEach(function(type){responseType&&-1!==responseType.indexOf(type)&&(parsed=request.parseHandlers[type](data,dataType))}),parsed=parsed||data},request.send=function(options,driver){options=options||{};var module=this;if(!options.url)throw new Error("undefined:url");if("string"!=typeof options.url)throw new Error("invalid:url",options.url);options.withCredentials="boolean"==typeof options.withCredentials?options.withCredentials:!0;var params={method:options.method||request.method.GET,url:options.url,headers:"object"==typeof options.headers?options.headers:{},callbackExtras:options.extras,callbackSuccess:options.success&&"function"==typeof options.success?options.success:void 0,callbackError:options.error&&"function"==typeof options.error?options.error:void 0,responseType:options.responseType,withCredentials:options.withCredentials,useCookies:options.useCookies||!1};params=rewriteRequestToPostIfUrlLengthIsTooLarge(options,params),params.headers["content-type"]=options.contentType||"application/json";var resolver,dataMethods=[request.method.PUT,request.method.POST,request.method.PATCH],promise=new Promise(function(resolve,reject){resolver={resolve:resolve,reject:reject},driver&&driver.trigger("request",params)});return-1!==dataMethods.indexOf(params.method)?request.serialize(options.data,params.headers["content-type"],function(serialized){params.data=serialized,doRequest(module,params,resolver)}):doRequest(module,params,resolver),promise};var xhrSuccessStatus={0:200,1223:204},processResponse=function(response,resolver,callbackSuccess,callbackError){var promiseResponse,statusCode=xhrSuccessStatus[response.status]||response.status,statusType=Number(response.status.toString()[0]),data=response.response,headers=corbel.utils.keysToLowerCase(response.headers);if(3>=statusType&&!response.error)response.response&&(data=request.parse(response.response,response.responseType,response.dataType)),callbackSuccess&&callbackSuccess.call(this,data,statusCode,response.responseObject,headers),promiseResponse={data:data,status:statusCode,headers:headers},promiseResponse[response.responseObjectType]=response.responseObject,resolver.resolve(promiseResponse);else{var disconnected=response.error&&0===response.status;statusCode=disconnected?0:statusCode,callbackError&&callbackError.call(this,response.error,statusCode,response.responseObject,headers),response.response&&(data=request.parse(response.response,response.responseType,response.dataType)),promiseResponse={data:data,status:statusCode,error:response.error,headers:headers},promiseResponse[response.responseObjectType]=response.responseObject,resolver.reject(promiseResponse)}},rewriteRequestToPostIfUrlLengthIsTooLarge=function(options,params){var AUTOMATIC_HTTP_METHOD_OVERRIDE=corbel.Config.AUTOMATIC_HTTP_METHOD_OVERRIDE||!0,HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN=corbel.Config.HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN||2048;if(AUTOMATIC_HTTP_METHOD_OVERRIDE&¶ms.method===request.method.GET&¶ms.url.length>HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN){var url=params.url.split("?");params.method=request.method.POST,params.headers["X-HTTP-Method-Override"]=request.method.GET,params.url=url[0],options.data=encodeUrlToForm(url[1]),options.contentType="application/x-www-form-urlencoded"}return params},encodeUrlToForm=function(url){var form={};return url.split("&").forEach(function(formEntry){var formPair=formEntry.split("=");form[formPair[0]]=formPair[1]}),form};return request._getNodeRequestAjax=function(params){var requestAjax=require("request");return request.isCrossDomain(params.url)&¶ms.withCredentials&¶ms.useCookies&&(requestAjax=requestAjax.defaults({jar:!0})),requestAjax},request._getNodeRequestCallback=function(context,params,resolver){return function(error,response,body){var responseType,status;error?(responseType=void 0,status=0):(responseType=response.responseType||response.headers["content-type"],status=response.statusCode),processResponse.call(context,{responseObject:response,dataType:params.dataType,responseType:responseType,response:body,status:status,headers:response?response.headers:{},responseObjectType:"response",error:error},resolver,params.callbackSuccess,params.callbackError)}},request._nodeAjax=function(params,resolver){var requestAjax=request._getNodeRequestAjax(params),requestOptions={method:params.method,url:params.url,headers:params.headers},data=params.data||"",callbackRequest=request._getNodeRequestCallback(this,params,resolver);corbel.utils.isStream(data)?data.pipe(requestAjax(requestOptions,callbackRequest)):(requestOptions.body=data,requestAjax(requestOptions,callbackRequest))},request.isCrossDomain=function(url){return!(!url||"string"!=typeof url||-1===url.indexOf("http"))},request._parseResponseHeaders=function(headerStr){var headers={};if(!headerStr)return headers;for(var headerPairs=headerStr.split("\r\n"),i=0;i0){var key=headerPair.substring(0,index),val=headerPair.substring(index+2);headers[key]=val}}return headers},request._browserAjax=function(params,resolver){var httpReq=new XMLHttpRequest;httpReq.open(params.method,params.url,!0),request.isCrossDomain(params.url)&¶ms.withCredentials&&(httpReq.withCredentials=!0);for(var header in params.headers)params.headers.hasOwnProperty(header)&&httpReq.setRequestHeader(header,params.headers[header]);httpReq.responseType=params.responseType||httpReq.responseType,httpReq.onload=function(xhr){xhr=xhr||httpReq,xhr=xhr.target||xhr,processResponse.call(this,{responseObject:xhr,dataType:xhr.dataType,responseType:xhr.responseType||xhr.getResponseHeader("content-type"),response:xhr.response||xhr.responseText,status:xhr.status,headers:request._parseResponseHeaders(xhr.getAllResponseHeaders()),responseObjectType:"xhr",error:xhr.error},resolver,params.callbackSuccess,params.callbackError)}.bind(this),httpReq.onerror=function(xhr){xhr=xhr||httpReq,xhr=xhr.target||xhr;var error=xhr.error?xhr.error:!0;processResponse.call(this,{responseObject:xhr,dataType:xhr.dataType,responseType:xhr.responseType||xhr.getResponseHeader("content-type"),response:xhr.response||xhr.responseText,status:xhr.status,responseObjectType:"xhr",error:error},resolver,params.callbackSuccess,params.callbackError)}.bind(this),params.callbackExtras&&(params.callbackExtras.requestCallback&¶ms.callbackExtras.requestCallback(httpReq),params.callbackExtras.progressCallback&&(httpReq.upload.onprogress=function(event){params.callbackExtras.progressCallback(event)})),params.data?httpReq.send(params.data):httpReq.send()},request}(),function(){var Services=corbel.Services=corbel.Object.inherit({constructor:function(driver){this.driver=driver},request:function(args){this.driver.trigger("service:request:before",args);var that=this;return this._requestWithRetries(args).then(function(response){return that.driver.trigger("service:request:after",response),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),response})["catch"](function(error){throw that.driver.trigger("service:request:after",error),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),error})},_requestWithRetries:function(args){var that=this,maxRetries=corbel.Services._UNAUTHORIZED_MAX_RETRIES,requestParameters=that._buildParams(args);return that._doRequest(requestParameters)["catch"](function(response){var retries=that.driver.config.get(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0);if(maxRetries>retries&&response.status===corbel.Services._UNAUTHORIZED_STATUS_CODE)return that._refreshToken().then(function(){return that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,retries+1),that._requestWithRetries(args)["catch"](function(retryResponse){throw response=retryResponse})})["catch"](function(){throw response});throw response})},_doRequest:function(params){var that=this;return corbel.request.send(params,that.driver).then(function(response){return that.driver.config.set(corbel.Services._FORCE_UPDATE_STATUS,0),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),response})["catch"](function(response){if(response.status===corbel.Services._FORCE_UPDATE_STATUS_CODE&&response.textStatus===corbel.Services._FORCE_UPDATE_TEXT){var retries=that.driver.config.get(corbel.Services._FORCE_UPDATE_STATUS,0);throw retries0&&(query=queries.join("&"))}return query},_buildUri:corbel.CompoSR._buildUri})}(),function(){return corbel.Webfs=corbel.Object.inherit({constructor:function(driver){this.driver=driver},webfs:function(id){return new corbel.Webfs.WebfsBuilder(this.driver,id)}},{moduleName:"webfs",defaultPort:8096,defaultDomain:"unauthenticated",domain:"domain",create:function(driver){return new corbel.Webfs(driver)}}),corbel.Webfs}(),function(){var WebfsBuilder=corbel.Webfs.WebfsBuilder=corbel.Services.inherit({constructor:function(driver,id){this.driver=driver,this.id=id},get:function(params){corbel.validate.value("id",this.id);var options=params?corbel.utils.clone(params):{},args=corbel.utils.extend(options,{url:this._buildUriWithDomain(this.id),method:corbel.request.method.GET,query:params?corbel.utils.serializeParams(params):null});return this.request(args)},"delete":function(){corbel.validate.value("id",this.id);var args={url:this._buildUriWithDomain(this.id),method:corbel.request.method.DELETE};return this.request(args)},_buildUri:function(id){var urlBase=this.driver.config.getCurrentEndpoint(corbel.Webfs.moduleName,this._buildPort(this.driver.config));return urlBase+id},_buildUriWithDomain:function(id){var urlBase=this.driver.config.getCurrentEndpoint(corbel.Webfs.moduleName,this._buildPort(this.driver.config)),domain=this.driver.config.get(corbel.Webfs.domain,corbel.Webfs.defaultDomain),customDomain=this.driver.config.get(corbel.Domain.CUSTOM_DOMAIN,domain);this.driver.config.set(corbel.Domain.CUSTOM_DOMAIN,void 0);var uriWithDomain=urlBase+customDomain+"/path";return id&&(uriWithDomain+="/"+id),uriWithDomain},_buildPort:function(config){return config.get("webfsPort",null)||corbel.Webfs.defaultPort}},{moduleName:"webfs",create:function(driver){return new corbel.Webfs.WebfsBuilder(driver)}});return WebfsBuilder}(),function(){return corbel.Domain=corbel.Object.inherit({constructor:function(driver){return this.driver=driver,function(id){return driver.config.set(corbel.Domain.CUSTOM_DOMAIN,id),driver}}},{moduleName:"domain",CUSTOM_DOMAIN:"customDomain",create:function(driver){return new corbel.Domain(driver)}}),corbel.Domain}(),corbel}); \ No newline at end of file diff --git a/dist/corbel.with-polyfills.js b/dist/corbel.with-polyfills.js index eb41e1b..bf58f0c 100644 --- a/dist/corbel.with-polyfills.js +++ b/dist/corbel.with-polyfills.js @@ -2504,6 +2504,7 @@ method: options.method || request.method.GET, url: options.url, headers: typeof options.headers === 'object' ? options.headers : {}, + callbackExtras: options.extras, callbackSuccess: options.success && typeof options.success === 'function' ? options.success : undefined, callbackError: options.error && typeof options.error === 'function' ? options.error : undefined, responseType: options.responseType, @@ -2792,6 +2793,16 @@ }.bind(this); + if (params.callbackExtras) { + if (params.callbackExtras.requestCallback) { + params.callbackExtras.requestCallback(httpReq); + } + if (params.callbackExtras.progressCallback) { + httpReq.upload.onprogress = function(event) { + params.callbackExtras.progressCallback(event); + }; + } + } if (params.data) { httpReq.send(params.data); @@ -2799,6 +2810,7 @@ //IE fix, send nothing (not null or undefined) httpReq.send(); } + }; return request; @@ -3044,7 +3056,7 @@ params = this._addAuthorization(params); - return corbel.utils.pick(params, ['url', 'dataType', 'contentType', 'method', 'headers', 'data', 'dataFilter', 'responseType', 'withCredentials', 'success', 'error']); + return corbel.utils.pick(params, ['url', 'dataType', 'contentType', 'method', 'headers', 'data', 'dataFilter', 'responseType', 'withCredentials', 'success', 'error', 'extras']); }, /** diff --git a/src/request.js b/src/request.js index 077aaca..56125c5 100644 --- a/src/request.js +++ b/src/request.js @@ -220,7 +220,7 @@ throw new Error('undefined:url'); } - if (typeof(options.url) !== 'string') { + if (typeof (options.url) !== 'string') { throw new Error('invalid:url', options.url); } @@ -230,6 +230,7 @@ method: options.method || request.method.GET, url: options.url, headers: typeof options.headers === 'object' ? options.headers : {}, + callbackExtras: options.extras, callbackSuccess: options.success && typeof options.success === 'function' ? options.success : undefined, callbackError: options.error && typeof options.error === 'function' ? options.error : undefined, responseType: options.responseType, @@ -430,7 +431,7 @@ * @return {Boolean} */ request.isCrossDomain = function (url) { - if (url && typeof(url) === 'string' && url.indexOf('http') !== -1) { + if (url && typeof (url) === 'string' && url.indexOf('http') !== -1) { return true; } else { return false; @@ -518,6 +519,14 @@ }.bind(this); + if (params.callbackExtras) { + if (params.callbackExtras.requestCallback) { + params.callbackExtras.requestCallback(httpReq); + } + if (params.callbackExtras.progressCallback) { + httpReq.upload.onprogress = params.callbackExtras.progressCallback; + } + } if (params.data) { httpReq.send(params.data); @@ -525,6 +534,7 @@ //IE fix, send nothing (not null or undefined) httpReq.send(); } + }; return request; diff --git a/src/services.js b/src/services.js index 6191199..f011ff0 100644 --- a/src/services.js +++ b/src/services.js @@ -239,7 +239,7 @@ params = this._addAuthorization(params); - return corbel.utils.pick(params, ['url', 'dataType', 'contentType', 'method', 'headers', 'data', 'dataFilter', 'responseType', 'withCredentials', 'success', 'error']); + return corbel.utils.pick(params, ['url', 'dataType', 'contentType', 'method', 'headers', 'data', 'dataFilter', 'responseType', 'withCredentials', 'success', 'error', 'extras']); }, /** From 3b0363201eff19aae9c38cc52aacef424023fb41 Mon Sep 17 00:00:00 2001 From: Francisco Sanchez Date: Fri, 24 Jun 2016 19:57:11 +0200 Subject: [PATCH 2/2] implement extra callbacks in request --- dist/corbel.js | 4 +--- dist/corbel.min.js | 4 ++-- dist/corbel.with-polyfills.js | 4 +--- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/dist/corbel.js b/dist/corbel.js index 1f8cced..a27e0e4 100644 --- a/dist/corbel.js +++ b/dist/corbel.js @@ -1802,9 +1802,7 @@ params.callbackExtras.requestCallback(httpReq); } if (params.callbackExtras.progressCallback) { - httpReq.upload.onprogress = function(event) { - params.callbackExtras.progressCallback(event); - }; + httpReq.upload.onprogress = params.callbackExtras.progressCallback; } } diff --git a/dist/corbel.min.js b/dist/corbel.min.js index 4964309..44bc9f5 100644 --- a/dist/corbel.min.js +++ b/dist/corbel.min.js @@ -1,3 +1,3 @@ -!function(root,factory){"use strict";"function"==typeof define&&define.amd?define([],function(){return factory(root)}):"undefined"!=typeof module&&module.exports?module.exports=factory.call(root,root,process||void 0):void 0!==root&&(root.corbel=factory(root))}(this,function(root,process){"use strict";function Config(config){config=config||{},this.config={},corbel.utils.extend(this.config,config)}var corbel={};!function(){function CorbelDriver(config,events){events&&"object"==typeof events?this._events=corbel.utils.clone(events):this._events={},this.guid=corbel.utils.guid(),this.config=corbel.Config.create(config),this.iam=corbel.Iam.create(this),this.resources=corbel.Resources.create(this),this.assets=corbel.Assets.create(this),this.oauth=corbel.Oauth.create(this),this.notifications=corbel.Notifications.create(this),this.ec=corbel.Ec.create(this),this.evci=corbel.Evci.create(this),this.borrow=corbel.Borrow.create(this),this.composr=corbel.CompoSR.create(this),this.scheduler=corbel.Scheduler.create(this),this.webfs=corbel.Webfs.create(this),this.domain=corbel.Domain.create(this)}CorbelDriver.prototype.clone=function(){return new CorbelDriver(this.config.getConfig(),this._events)},CorbelDriver.prototype.addEventListener=function(name,fn){if("function"!=typeof fn)throw new Error("corbel:error:invalid:type");this._events[name]=this._events[name]||[],-1===this._events[name].indexOf(fn)&&this._events[name].push(fn)},CorbelDriver.prototype.removeEventListener=function(name,fn){if(this._events[name]){var index=this._events[name].indexOf(fn);-1!==index&&this._events[name].splice(index,1)}},CorbelDriver.prototype.dispatch=function(name,options){this._events[name]&&this._events[name].length&&this._events[name].forEach(function(fn){fn(options)})},CorbelDriver.prototype.on=CorbelDriver.prototype.addEventListener,CorbelDriver.prototype.off=CorbelDriver.prototype.removeEventListener,CorbelDriver.prototype.trigger=CorbelDriver.prototype.dispatch,corbel.CorbelDriver=CorbelDriver,corbel.getDriver=function(config){if(config=config||{},!config.urlBase)throw new Error("error:undefined:urlbase");return new CorbelDriver(config)}}(),function(){var utils=corbel.utils={};return utils.extend=function(obj){return Array.prototype.slice.call(arguments,1).forEach(function(source){if(source)for(var prop in source)obj[prop]=source[prop]}),obj},utils.inherit=function(prototypeProperties,staticProperties){var child,parent=this;child=prototypeProperties&&prototypeProperties.hasOwnProperty("constructor")?prototypeProperties.constructor:function(){return parent.apply(this,arguments)},utils.extend(child,parent,staticProperties);var Surrogate=function(){this.constructor=child};return Surrogate.prototype=parent.prototype,child.prototype=new Surrogate,prototypeProperties&&utils.extend(child.prototype,prototypeProperties),child.__super__=parent.prototype,child},utils.guid=function(){function s4(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)}return s4()+s4()+"-"+s4()+"-"+s4()+"-"+s4()+"-"+s4()+s4()+s4()},utils.reload=function(){void 0!==window&&window.location.reload()},utils.param=function(obj){var str=[];for(var p in obj)obj.hasOwnProperty(p)&&str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p]));return str.join("&")},utils.toURLEncoded=function(obj){var str=[];for(var p in obj)obj.hasOwnProperty(p)&&str.push(encodeURIComponent(p)+"="+encodeURIComponent(obj[p]));return str.join("&")},utils.serializeParams=function(params){function getJsonEncodedStringify(param){return encodeURIComponent(JSON.stringify(param))}function queryObjectToString(params,key){var query,result="";params.queryDomain=params.queryDomain||"api",result+=params.queryDomain+":"+key+"=";try{return query="string"==typeof params[key]?JSON.parse(params[key]):JSON.parse(JSON.stringify(params[key])),result+=getJsonEncodedStringify(query)}catch(e){return result+params[key]}}var result="";if(void 0===params||null===params)return result;if(!(params instanceof Object)&&"object"!=typeof params)throw new Error("expected params to be an Object type, but got "+typeof params);return params.aggregation&&(result="api:aggregation="+getJsonEncodedStringify(params.aggregation)),params.query&&(params.queryDomain=params.queryDomain||"api",result+=result?"&":"",result+=queryObjectToString(params,"query")),params.queries&¶ms.queries.forEach(function(query){result+=result?"&":"",result+=queryObjectToString(query,"query")}),params.condition&&(params.queryDomain=params.queryDomain||"api",result+=result?"&":"",result+=queryObjectToString(params,"condition")),params.conditions&¶ms.conditions.forEach(function(condition){result+=result?"&":"",result+=queryObjectToString(condition,"condition")}),params.search&&(result+=result?"&":"",result+="api:search=",result+=params.search instanceof Object?getJsonEncodedStringify(params.search):encodeURIComponent(params.search),params.hasOwnProperty("indexFieldsOnly")&&(result+="&api:indexFieldsOnly="+getJsonEncodedStringify(params.indexFieldsOnly))),params.distinct&&(result+=result?"&":"",result+="api:distinct="+encodeURIComponent(params.distinct instanceof Array?params.distinct.join(","):params.distinct)),params.sort&&(result+=result?"&":"",result+="api:sort="+getJsonEncodedStringify(params.sort)),params.pagination&&((params.pagination.page||0===params.pagination.page)&&(result+=result?"&":"",result+="api:page="+params.pagination.page),(params.pagination.pageSize||0===params.pagination.pageSize)&&(result+=result?"&":"",result+="api:pageSize="+params.pagination.pageSize)),params.customQueryParams&&Object.keys(params.customQueryParams).forEach(function(param){result+=result?"&":"",result+=param+"="+encodeURIComponent(params.customQueryParams[param])}),result},utils.defaults=function(destiny,defaults){return Object.keys(defaults).forEach(function(key){"undefined"==typeof destiny[key]&&(destiny[key]=defaults[key])}),destiny},utils.pick=function(object,keys){var destiny={};return keys.forEach(function(key){destiny[key]=object[key]}),destiny},utils.clone=function clone(item){if(!item)return item;var result,types=[Number,String,Boolean];if(types.forEach(function(type){item instanceof type&&(result=type(item))}),"undefined"==typeof result)if("[object Array]"===Object.prototype.toString.call(item))result=[],item.forEach(function(child,index){result[index]=clone(child)});else if("object"==typeof item)if(item.nodeType&&"function"==typeof item.cloneNode)result=item.cloneNode(!0);else if(item.prototype)result=item;else if(item instanceof Date)result=new Date(item);else{result={};for(var i in item)result[i]=clone(item[i])}else result=item;return result},utils.keysToLowerCase=function(obj){if(void 0===obj||null===obj)return obj;for(var key,keys=Object.keys(obj),n=keys.length,newobj={};n--;)key=keys[n],newobj[key.toLowerCase()]=obj[key];return newobj},utils.isJSON=function(string){try{JSON.parse(string)}catch(e){return!1}return!0},utils.isStream=function(data){return!(!data.pipe||"function"!=typeof data.pipe)},utils.arrayToObject=function(array){var object={};return array.map(function(element,index){object[index]=element}),object},utils.copyArray=function(list){for(var newList=new Array(list.length),i=list.length;i--;)newList[i]=list[i];return newList},utils.dataURItoBlob=function(dataURI){var serialize;serialize=corbel.Config.isNode||!root.atob?require("base-64").decode:root.atob;var BlobBuilder,BlobConstructor;corbel.Config.isBrowser&&(BlobBuilder=window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,BlobConstructor=window.Blob);for(var byteString=serialize(dataURI.split(",")[1]),mimeString=dataURI.split(",")[0].split(":")[1].split(";")[0],arrayBuffer=new ArrayBuffer(byteString.length),_ia=new Uint8Array(arrayBuffer),i=0;imaxDelay)throw new Error("error:client-time:delay");return delay};return maxDelay=1e3*(maxDelay||MAX_TIME_DELTA),corbel.request.send({url:driver.config.getCurrentEndpoint("iam").replace(/v\d.\d\//,"")+"version",method:corbel.request.method.OPTIONS}).then(function(response){return checkDelay(response)})["catch"](function(error){if(0===error.data.length)throw new Error("error:server:not-available");throw error})},utils}(),function(){corbel.validate={},corbel.validate.values=function(keys,obj){var that=this;return keys.forEach(function(key){that.value(key,obj[key])}),!0},corbel.validate.value=function(key,value){return this.isDefined(value,key+" value is mandatory and cannot be undefined")},corbel.validate.isDefined=function(value,message){var isUndefined=void 0===value;if(isUndefined&&message)throw new Error(message);return!isUndefined},corbel.validate.failIfIsDefined=function(value,message){var isDefined=void 0!==value;if(isDefined&&message)throw new Error(message);return!isDefined},corbel.validate.isNotNull=function(value,message){var isNull=null===value;if(isNull&&message)throw new Error(message);return!isNull},corbel.validate.isValue=function(value,message){return this.isDefined(value,message)&&this.isNotNull(value,message)},corbel.validate.isObject=function(obj){return"object"==typeof obj},corbel.validate.isGreaterThan=function(value,greaterThan,message){var gt=this.isValue(value)&&value>greaterThan;if(!gt&&message)throw new Error(message);return gt},corbel.validate.isGreaterThanOrEqual=function(value,isGreaterThanOrEqual,message){var gte=this.isValue(value)&&value>=isGreaterThanOrEqual;if(!gte&&message)throw new Error(message);return gte}}(),function(){return corbel.Object=function(){return this},corbel.Object.inherit=corbel.utils.inherit,corbel.Object}(),function(){corbel.cryptography=function(){function b64_hmac_sha256(k,d){return rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k),str2rstr_utf8(d)))}function rstr_hmac_sha256(key,data){var bkey=rstr2binb(key);bkey.length>16&&(bkey=binb_sha256(bkey,8*key.length));for(var ipad=Array(16),opad=Array(16),i=0;16>i;i++)ipad[i]=909522486^bkey[i],opad[i]=1549556828^bkey[i];var hash=binb_sha256(ipad.concat(rstr2binb(data)),512+8*data.length);return binb2rstr(binb_sha256(opad.concat(hash),768))}function rstr2b64(input){try{}catch(e){b64pad=""}for(var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",output="",len=input.length,i=0;len>i;i+=3)for(var triplet=input.charCodeAt(i)<<16|(len>i+1?input.charCodeAt(i+1)<<8:0)|(len>i+2?input.charCodeAt(i+2):0),j=0;4>j;j++)output+=8*i+6*j>8*input.length?b64pad:tab.charAt(triplet>>>6*(3-j)&63);return output}function str2rstr_utf8(input){for(var x,y,output="",i=-1;++i=55296&&56319>=x&&y>=56320&&57343>=y&&(x=65536+((1023&x)<<10)+(1023&y),i++),127>=x?output+=String.fromCharCode(x):2047>=x?output+=String.fromCharCode(192|x>>>6&31,128|63&x):65535>=x?output+=String.fromCharCode(224|x>>>12&15,128|x>>>6&63,128|63&x):2097151>=x&&(output+=String.fromCharCode(240|x>>>18&7,128|x>>>12&63,128|x>>>6&63,128|63&x));return output}function rstr2binb(input){for(var output=Array(input.length>>2),i=0;i>5]|=(255&input.charCodeAt(i/8))<<24-i%32;return output}function binb2rstr(input){for(var output="",i=0;i<32*input.length;i+=8)output+=String.fromCharCode(input[i>>5]>>>24-i%32&255);return output}function sha256_S(X,n){return X>>>n|X<<32-n}function sha256_R(X,n){return X>>>n}function sha256_Ch(x,y,z){return x&y^~x&z}function sha256_Maj(x,y,z){return x&y^x&z^y&z}function sha256_Sigma0256(x){return sha256_S(x,2)^sha256_S(x,13)^sha256_S(x,22)}function sha256_Sigma1256(x){return sha256_S(x,6)^sha256_S(x,11)^sha256_S(x,25)}function sha256_Gamma0256(x){return sha256_S(x,7)^sha256_S(x,18)^sha256_R(x,3)}function sha256_Gamma1256(x){return sha256_S(x,17)^sha256_S(x,19)^sha256_R(x,10)}function binb_sha256(m,l){var a,b,c,d,e,f,g,h,i,j,T1,T2,HASH=new Array(1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225),W=new Array(64);for(m[l>>5]|=128<<24-l%32,m[(l+64>>9<<4)+15]=l,i=0;ij;j++)16>j?W[j]=m[j+i]:W[j]=safe_add(safe_add(safe_add(sha256_Gamma1256(W[j-2]),W[j-7]),sha256_Gamma0256(W[j-15])),W[j-16]),T1=safe_add(safe_add(safe_add(safe_add(h,sha256_Sigma1256(e)),sha256_Ch(e,f,g)),sha256_K[j]),W[j]),T2=safe_add(sha256_Sigma0256(a),sha256_Maj(a,b,c)),h=g,g=f,f=e,e=safe_add(d,T1),d=c,c=b,b=a,a=safe_add(T1,T2);HASH[0]=safe_add(a,HASH[0]),HASH[1]=safe_add(b,HASH[1]),HASH[2]=safe_add(c,HASH[2]),HASH[3]=safe_add(d,HASH[3]),HASH[4]=safe_add(e,HASH[4]),HASH[5]=safe_add(f,HASH[5]),HASH[6]=safe_add(g,HASH[6]),HASH[7]=safe_add(h,HASH[7])}return HASH}function safe_add(x,y){var lsw=(65535&x)+(65535&y),msw=(x>>16)+(y>>16)+(lsw>>16);return msw<<16|65535&lsw}function b64tob64u(s){return s=s.replace(/\=/g,""),s=s.replace(/\+/g,"-"),s=s.replace(/\//g,"_")}var b64pad="",sha256_K=new Array(1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998);return{rstr2b64:rstr2b64,str2rstr_utf8:str2rstr_utf8,b64_hmac_sha256:b64_hmac_sha256,b64tob64u:b64tob64u}}()}(),function(){var jwt=corbel.jwt={EXPIRATION:3500,ALGORITHM:"HS256",TYP:"JWT",VERSION:"1.0.0",generate:function(claims,secret,alg){if(claims=claims||{},claims.exp=claims.exp||jwt._generateExp(),!claims.iss)throw new Error("jwt:undefined:iss");if(!claims.aud)throw new Error("jwt:undefined:aud");return jwt._generate(claims,secret,alg)},_generate:function(claims,secret,alg){alg=alg||jwt.ALGORITHM;var claimsKeys=["iss","aud","exp","scope","prn","version","refresh_token","request_domain","basic_auth.username","basic_auth.password","device_id"],finalClaims={};claimsKeys.forEach(function(key){claims[key]&&(finalClaims[key]=claims[key])}),corbel.utils.extend(finalClaims,claims),Array.isArray(finalClaims.scope)&&(finalClaims.scope=finalClaims.scope.join(" "));var bAlg=corbel.cryptography.rstr2b64(corbel.cryptography.str2rstr_utf8(JSON.stringify({typ:jwt.TYP,alg:alg}))),bClaims=corbel.cryptography.rstr2b64(corbel.cryptography.str2rstr_utf8(JSON.stringify(finalClaims))),segment=bAlg+"."+bClaims,assertion=corbel.cryptography.b64tob64u(corbel.cryptography.b64_hmac_sha256(secret,segment));return segment+"."+assertion},_generateExp:function(){return Math.round((new Date).getTime()/1e3)+jwt.EXPIRATION},decode:function(assertion){var serialize;serialize=corbel.Config.isNode||!root.atob?require("base-64").decode:root.atob;var decoded=assertion.split(".");try{decoded[0]=JSON.parse(serialize(decoded[0]))}catch(e){decoded[0]=!1}try{decoded[1]=JSON.parse(serialize(decoded[1]))}catch(e){decoded[1]=!1}if(!decoded[0]&&!decoded[1])throw new Error("corbel:jwt:decode:invalid_assertion");return decoded[0]=decoded[0]||{},decoded[1]=decoded[1]||{},Object.keys(decoded[1]).forEach(function(key){decoded[0][key]=decoded[1][key]}),decoded[0]}};return jwt}(),function(){function doRequest(module,params,resolver){corbel.Config.isBrowser?request._browserAjax.call(module,params,resolver):request._nodeAjax.call(module,params,resolver)}var request=corbel.request={method:{GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE",OPTIONS:"OPTIONS",PATCH:"PATCH",HEAD:"HEAD"}};request.serializeHandlers={json:function(data,cb){cb("string"!=typeof data?JSON.stringify(data):data)},"form-urlencoded":function(data,cb){cb(corbel.utils.toURLEncoded(data))},dataURI:function(data,cb){cb(corbel.Config.isNode?corbel.utils.toURLEncoded(data):corbel.utils.dataURItoBlob(data))},blob:function(data,cb){if(data instanceof ArrayBuffer)throw new Error("ArrayBuffer is not supported, please use Blob");cb(data)},stream:function(data,cb){if(data instanceof ArrayBuffer)throw new Error("ArrayBuffer is not supported, please use Blob, File, Stream or ArrayBufferView");cb(data)}},request.serialize=function(data,contentType,cb){var contentTypeSerializable=Object.keys(request.serializeHandlers).filter(function(type){return-1!==contentType.indexOf(type)?type:void 0});contentTypeSerializable.length>0?request.serializeHandlers[contentTypeSerializable[0]](data,cb):cb(data)},request.parseHandlers={json:function(data){return data=data||"{}","string"==typeof data&&(data=JSON.parse(data)),data}},request.parse=function(data,responseType,dataType){var parsed;return Object.keys(request.parseHandlers).forEach(function(type){responseType&&-1!==responseType.indexOf(type)&&(parsed=request.parseHandlers[type](data,dataType))}),parsed=parsed||data},request.send=function(options,driver){options=options||{};var module=this;if(!options.url)throw new Error("undefined:url");if("string"!=typeof options.url)throw new Error("invalid:url",options.url);options.withCredentials="boolean"==typeof options.withCredentials?options.withCredentials:!0;var params={method:options.method||request.method.GET,url:options.url,headers:"object"==typeof options.headers?options.headers:{},callbackExtras:options.extras,callbackSuccess:options.success&&"function"==typeof options.success?options.success:void 0,callbackError:options.error&&"function"==typeof options.error?options.error:void 0,responseType:options.responseType,withCredentials:options.withCredentials,useCookies:options.useCookies||!1};params=rewriteRequestToPostIfUrlLengthIsTooLarge(options,params),params.headers["content-type"]=options.contentType||"application/json";var resolver,dataMethods=[request.method.PUT,request.method.POST,request.method.PATCH],promise=new Promise(function(resolve,reject){resolver={resolve:resolve,reject:reject},driver&&driver.trigger("request",params)});return-1!==dataMethods.indexOf(params.method)?request.serialize(options.data,params.headers["content-type"],function(serialized){params.data=serialized,doRequest(module,params,resolver)}):doRequest(module,params,resolver),promise};var xhrSuccessStatus={0:200,1223:204},processResponse=function(response,resolver,callbackSuccess,callbackError){var promiseResponse,statusCode=xhrSuccessStatus[response.status]||response.status,statusType=Number(response.status.toString()[0]),data=response.response,headers=corbel.utils.keysToLowerCase(response.headers);if(3>=statusType&&!response.error)response.response&&(data=request.parse(response.response,response.responseType,response.dataType)),callbackSuccess&&callbackSuccess.call(this,data,statusCode,response.responseObject,headers),promiseResponse={data:data,status:statusCode,headers:headers},promiseResponse[response.responseObjectType]=response.responseObject,resolver.resolve(promiseResponse);else{var disconnected=response.error&&0===response.status;statusCode=disconnected?0:statusCode,callbackError&&callbackError.call(this,response.error,statusCode,response.responseObject,headers),response.response&&(data=request.parse(response.response,response.responseType,response.dataType)),promiseResponse={data:data,status:statusCode,error:response.error,headers:headers},promiseResponse[response.responseObjectType]=response.responseObject,resolver.reject(promiseResponse)}},rewriteRequestToPostIfUrlLengthIsTooLarge=function(options,params){var AUTOMATIC_HTTP_METHOD_OVERRIDE=corbel.Config.AUTOMATIC_HTTP_METHOD_OVERRIDE||!0,HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN=corbel.Config.HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN||2048;if(AUTOMATIC_HTTP_METHOD_OVERRIDE&¶ms.method===request.method.GET&¶ms.url.length>HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN){var url=params.url.split("?");params.method=request.method.POST,params.headers["X-HTTP-Method-Override"]=request.method.GET,params.url=url[0],options.data=encodeUrlToForm(url[1]),options.contentType="application/x-www-form-urlencoded"}return params},encodeUrlToForm=function(url){var form={};return url.split("&").forEach(function(formEntry){var formPair=formEntry.split("=");form[formPair[0]]=formPair[1]}),form};return request._getNodeRequestAjax=function(params){var requestAjax=require("request");return request.isCrossDomain(params.url)&¶ms.withCredentials&¶ms.useCookies&&(requestAjax=requestAjax.defaults({jar:!0})),requestAjax},request._getNodeRequestCallback=function(context,params,resolver){return function(error,response,body){var responseType,status;error?(responseType=void 0,status=0):(responseType=response.responseType||response.headers["content-type"],status=response.statusCode),processResponse.call(context,{responseObject:response,dataType:params.dataType,responseType:responseType,response:body,status:status,headers:response?response.headers:{},responseObjectType:"response",error:error},resolver,params.callbackSuccess,params.callbackError)}},request._nodeAjax=function(params,resolver){var requestAjax=request._getNodeRequestAjax(params),requestOptions={method:params.method,url:params.url,headers:params.headers},data=params.data||"",callbackRequest=request._getNodeRequestCallback(this,params,resolver);corbel.utils.isStream(data)?data.pipe(requestAjax(requestOptions,callbackRequest)):(requestOptions.body=data,requestAjax(requestOptions,callbackRequest))},request.isCrossDomain=function(url){return!(!url||"string"!=typeof url||-1===url.indexOf("http"))},request._parseResponseHeaders=function(headerStr){var headers={};if(!headerStr)return headers;for(var headerPairs=headerStr.split("\r\n"),i=0;i0){var key=headerPair.substring(0,index),val=headerPair.substring(index+2);headers[key]=val}}return headers},request._browserAjax=function(params,resolver){var httpReq=new XMLHttpRequest;httpReq.open(params.method,params.url,!0),request.isCrossDomain(params.url)&¶ms.withCredentials&&(httpReq.withCredentials=!0);for(var header in params.headers)params.headers.hasOwnProperty(header)&&httpReq.setRequestHeader(header,params.headers[header]);httpReq.responseType=params.responseType||httpReq.responseType,httpReq.onload=function(xhr){xhr=xhr||httpReq,xhr=xhr.target||xhr,processResponse.call(this,{responseObject:xhr,dataType:xhr.dataType,responseType:xhr.responseType||xhr.getResponseHeader("content-type"),response:xhr.response||xhr.responseText,status:xhr.status,headers:request._parseResponseHeaders(xhr.getAllResponseHeaders()),responseObjectType:"xhr",error:xhr.error},resolver,params.callbackSuccess,params.callbackError)}.bind(this),httpReq.onerror=function(xhr){xhr=xhr||httpReq,xhr=xhr.target||xhr;var error=xhr.error?xhr.error:!0;processResponse.call(this,{responseObject:xhr,dataType:xhr.dataType,responseType:xhr.responseType||xhr.getResponseHeader("content-type"),response:xhr.response||xhr.responseText,status:xhr.status,responseObjectType:"xhr",error:error},resolver,params.callbackSuccess,params.callbackError)}.bind(this),params.callbackExtras&&(params.callbackExtras.requestCallback&¶ms.callbackExtras.requestCallback(httpReq),params.callbackExtras.progressCallback&&(httpReq.upload.onprogress=function(event){params.callbackExtras.progressCallback(event)})),params.data?httpReq.send(params.data):httpReq.send()},request}(),function(){var Services=corbel.Services=corbel.Object.inherit({constructor:function(driver){this.driver=driver},request:function(args){this.driver.trigger("service:request:before",args);var that=this;return this._requestWithRetries(args).then(function(response){return that.driver.trigger("service:request:after",response),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),response})["catch"](function(error){throw that.driver.trigger("service:request:after",error),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),error})},_requestWithRetries:function(args){var that=this,maxRetries=corbel.Services._UNAUTHORIZED_MAX_RETRIES,requestParameters=that._buildParams(args);return that._doRequest(requestParameters)["catch"](function(response){var retries=that.driver.config.get(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0);if(maxRetries>retries&&response.status===corbel.Services._UNAUTHORIZED_STATUS_CODE)return that._refreshToken().then(function(){return that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,retries+1),that._requestWithRetries(args)["catch"](function(retryResponse){throw response=retryResponse})})["catch"](function(){throw response});throw response})},_doRequest:function(params){var that=this;return corbel.request.send(params,that.driver).then(function(response){return that.driver.config.set(corbel.Services._FORCE_UPDATE_STATUS,0),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),response})["catch"](function(response){if(response.status===corbel.Services._FORCE_UPDATE_STATUS_CODE&&response.textStatus===corbel.Services._FORCE_UPDATE_TEXT){var retries=that.driver.config.get(corbel.Services._FORCE_UPDATE_STATUS,0);throw retriesmaxDelay)throw new Error("error:client-time:delay");return delay};return maxDelay=1e3*(maxDelay||MAX_TIME_DELTA),corbel.request.send({url:driver.config.getCurrentEndpoint("iam").replace(/v\d.\d\//,"")+"version",method:corbel.request.method.OPTIONS}).then(function(response){return checkDelay(response)})["catch"](function(error){if(0===error.data.length)throw new Error("error:server:not-available");throw error})},utils}(),function(){corbel.validate={},corbel.validate.values=function(keys,obj){var that=this;return keys.forEach(function(key){that.value(key,obj[key])}),!0},corbel.validate.value=function(key,value){return this.isDefined(value,key+" value is mandatory and cannot be undefined")},corbel.validate.isDefined=function(value,message){var isUndefined=void 0===value;if(isUndefined&&message)throw new Error(message);return!isUndefined},corbel.validate.failIfIsDefined=function(value,message){var isDefined=void 0!==value;if(isDefined&&message)throw new Error(message);return!isDefined},corbel.validate.isNotNull=function(value,message){var isNull=null===value;if(isNull&&message)throw new Error(message);return!isNull},corbel.validate.isValue=function(value,message){return this.isDefined(value,message)&&this.isNotNull(value,message)},corbel.validate.isObject=function(obj){return"object"==typeof obj},corbel.validate.isGreaterThan=function(value,greaterThan,message){var gt=this.isValue(value)&&value>greaterThan;if(!gt&&message)throw new Error(message);return gt},corbel.validate.isGreaterThanOrEqual=function(value,isGreaterThanOrEqual,message){var gte=this.isValue(value)&&value>=isGreaterThanOrEqual;if(!gte&&message)throw new Error(message);return gte}}(),function(){return corbel.Object=function(){return this},corbel.Object.inherit=corbel.utils.inherit,corbel.Object}(),function(){corbel.cryptography=function(){function b64_hmac_sha256(k,d){return rstr2b64(rstr_hmac_sha256(str2rstr_utf8(k),str2rstr_utf8(d)))}function rstr_hmac_sha256(key,data){var bkey=rstr2binb(key);bkey.length>16&&(bkey=binb_sha256(bkey,8*key.length));for(var ipad=Array(16),opad=Array(16),i=0;16>i;i++)ipad[i]=909522486^bkey[i],opad[i]=1549556828^bkey[i];var hash=binb_sha256(ipad.concat(rstr2binb(data)),512+8*data.length);return binb2rstr(binb_sha256(opad.concat(hash),768))}function rstr2b64(input){try{}catch(e){b64pad=""}for(var tab="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",output="",len=input.length,i=0;len>i;i+=3)for(var triplet=input.charCodeAt(i)<<16|(len>i+1?input.charCodeAt(i+1)<<8:0)|(len>i+2?input.charCodeAt(i+2):0),j=0;4>j;j++)output+=8*i+6*j>8*input.length?b64pad:tab.charAt(triplet>>>6*(3-j)&63);return output}function str2rstr_utf8(input){for(var x,y,output="",i=-1;++i=55296&&56319>=x&&y>=56320&&57343>=y&&(x=65536+((1023&x)<<10)+(1023&y),i++),127>=x?output+=String.fromCharCode(x):2047>=x?output+=String.fromCharCode(192|x>>>6&31,128|63&x):65535>=x?output+=String.fromCharCode(224|x>>>12&15,128|x>>>6&63,128|63&x):2097151>=x&&(output+=String.fromCharCode(240|x>>>18&7,128|x>>>12&63,128|x>>>6&63,128|63&x));return output}function rstr2binb(input){for(var output=Array(input.length>>2),i=0;i>5]|=(255&input.charCodeAt(i/8))<<24-i%32;return output}function binb2rstr(input){for(var output="",i=0;i<32*input.length;i+=8)output+=String.fromCharCode(input[i>>5]>>>24-i%32&255);return output}function sha256_S(X,n){return X>>>n|X<<32-n}function sha256_R(X,n){return X>>>n}function sha256_Ch(x,y,z){return x&y^~x&z}function sha256_Maj(x,y,z){return x&y^x&z^y&z}function sha256_Sigma0256(x){return sha256_S(x,2)^sha256_S(x,13)^sha256_S(x,22)}function sha256_Sigma1256(x){return sha256_S(x,6)^sha256_S(x,11)^sha256_S(x,25)}function sha256_Gamma0256(x){return sha256_S(x,7)^sha256_S(x,18)^sha256_R(x,3)}function sha256_Gamma1256(x){return sha256_S(x,17)^sha256_S(x,19)^sha256_R(x,10)}function binb_sha256(m,l){var a,b,c,d,e,f,g,h,i,j,T1,T2,HASH=new Array(1779033703,-1150833019,1013904242,-1521486534,1359893119,-1694144372,528734635,1541459225),W=new Array(64);for(m[l>>5]|=128<<24-l%32,m[(l+64>>9<<4)+15]=l,i=0;ij;j++)16>j?W[j]=m[j+i]:W[j]=safe_add(safe_add(safe_add(sha256_Gamma1256(W[j-2]),W[j-7]),sha256_Gamma0256(W[j-15])),W[j-16]),T1=safe_add(safe_add(safe_add(safe_add(h,sha256_Sigma1256(e)),sha256_Ch(e,f,g)),sha256_K[j]),W[j]),T2=safe_add(sha256_Sigma0256(a),sha256_Maj(a,b,c)),h=g,g=f,f=e,e=safe_add(d,T1),d=c,c=b,b=a,a=safe_add(T1,T2);HASH[0]=safe_add(a,HASH[0]),HASH[1]=safe_add(b,HASH[1]),HASH[2]=safe_add(c,HASH[2]),HASH[3]=safe_add(d,HASH[3]),HASH[4]=safe_add(e,HASH[4]),HASH[5]=safe_add(f,HASH[5]),HASH[6]=safe_add(g,HASH[6]),HASH[7]=safe_add(h,HASH[7])}return HASH}function safe_add(x,y){var lsw=(65535&x)+(65535&y),msw=(x>>16)+(y>>16)+(lsw>>16);return msw<<16|65535&lsw}function b64tob64u(s){return s=s.replace(/\=/g,""),s=s.replace(/\+/g,"-"),s=s.replace(/\//g,"_")}var b64pad="",sha256_K=new Array(1116352408,1899447441,-1245643825,-373957723,961987163,1508970993,-1841331548,-1424204075,-670586216,310598401,607225278,1426881987,1925078388,-2132889090,-1680079193,-1046744716,-459576895,-272742522,264347078,604807628,770255983,1249150122,1555081692,1996064986,-1740746414,-1473132947,-1341970488,-1084653625,-958395405,-710438585,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,-2117940946,-1838011259,-1564481375,-1474664885,-1035236496,-949202525,-778901479,-694614492,-200395387,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,-2067236844,-1933114872,-1866530822,-1538233109,-1090935817,-965641998);return{rstr2b64:rstr2b64,str2rstr_utf8:str2rstr_utf8,b64_hmac_sha256:b64_hmac_sha256,b64tob64u:b64tob64u}}()}(),function(){var jwt=corbel.jwt={EXPIRATION:3500,ALGORITHM:"HS256",TYP:"JWT",VERSION:"1.0.0",generate:function(claims,secret,alg){if(claims=claims||{},claims.exp=claims.exp||jwt._generateExp(),!claims.iss)throw new Error("jwt:undefined:iss");if(!claims.aud)throw new Error("jwt:undefined:aud");return jwt._generate(claims,secret,alg)},_generate:function(claims,secret,alg){alg=alg||jwt.ALGORITHM;var claimsKeys=["iss","aud","exp","scope","prn","version","refresh_token","request_domain","basic_auth.username","basic_auth.password","device_id"],finalClaims={};claimsKeys.forEach(function(key){claims[key]&&(finalClaims[key]=claims[key])}),corbel.utils.extend(finalClaims,claims),Array.isArray(finalClaims.scope)&&(finalClaims.scope=finalClaims.scope.join(" "));var bAlg=corbel.cryptography.rstr2b64(corbel.cryptography.str2rstr_utf8(JSON.stringify({typ:jwt.TYP,alg:alg}))),bClaims=corbel.cryptography.rstr2b64(corbel.cryptography.str2rstr_utf8(JSON.stringify(finalClaims))),segment=bAlg+"."+bClaims,assertion=corbel.cryptography.b64tob64u(corbel.cryptography.b64_hmac_sha256(secret,segment));return segment+"."+assertion},_generateExp:function(){return Math.round((new Date).getTime()/1e3)+jwt.EXPIRATION},decode:function(assertion){var serialize;serialize=corbel.Config.isNode||!root.atob?require("base-64").decode:root.atob;var decoded=assertion.split(".");try{decoded[0]=JSON.parse(serialize(decoded[0]))}catch(e){decoded[0]=!1}try{decoded[1]=JSON.parse(serialize(decoded[1]))}catch(e){decoded[1]=!1}if(!decoded[0]&&!decoded[1])throw new Error("corbel:jwt:decode:invalid_assertion");return decoded[0]=decoded[0]||{},decoded[1]=decoded[1]||{},Object.keys(decoded[1]).forEach(function(key){decoded[0][key]=decoded[1][key]}),decoded[0]}};return jwt}(),function(){function doRequest(module,params,resolver){corbel.Config.isBrowser?request._browserAjax.call(module,params,resolver):request._nodeAjax.call(module,params,resolver)}var request=corbel.request={method:{GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE",OPTIONS:"OPTIONS",PATCH:"PATCH",HEAD:"HEAD"}};request.serializeHandlers={json:function(data,cb){cb("string"!=typeof data?JSON.stringify(data):data)},"form-urlencoded":function(data,cb){cb(corbel.utils.toURLEncoded(data))},dataURI:function(data,cb){cb(corbel.Config.isNode?corbel.utils.toURLEncoded(data):corbel.utils.dataURItoBlob(data))},blob:function(data,cb){if(data instanceof ArrayBuffer)throw new Error("ArrayBuffer is not supported, please use Blob");cb(data)},stream:function(data,cb){if(data instanceof ArrayBuffer)throw new Error("ArrayBuffer is not supported, please use Blob, File, Stream or ArrayBufferView");cb(data)}},request.serialize=function(data,contentType,cb){var contentTypeSerializable=Object.keys(request.serializeHandlers).filter(function(type){return-1!==contentType.indexOf(type)?type:void 0});contentTypeSerializable.length>0?request.serializeHandlers[contentTypeSerializable[0]](data,cb):cb(data)},request.parseHandlers={json:function(data){return data=data||"{}","string"==typeof data&&(data=JSON.parse(data)),data}},request.parse=function(data,responseType,dataType){var parsed;return Object.keys(request.parseHandlers).forEach(function(type){responseType&&-1!==responseType.indexOf(type)&&(parsed=request.parseHandlers[type](data,dataType))}),parsed=parsed||data},request.send=function(options,driver){options=options||{};var module=this;if(!options.url)throw new Error("undefined:url");if("string"!=typeof options.url)throw new Error("invalid:url",options.url);options.withCredentials="boolean"==typeof options.withCredentials?options.withCredentials:!0;var params={method:options.method||request.method.GET,url:options.url,headers:"object"==typeof options.headers?options.headers:{},callbackExtras:options.extras,callbackSuccess:options.success&&"function"==typeof options.success?options.success:void 0,callbackError:options.error&&"function"==typeof options.error?options.error:void 0,responseType:options.responseType,withCredentials:options.withCredentials,useCookies:options.useCookies||!1};params=rewriteRequestToPostIfUrlLengthIsTooLarge(options,params),params.headers["content-type"]=options.contentType||"application/json";var resolver,dataMethods=[request.method.PUT,request.method.POST,request.method.PATCH],promise=new Promise(function(resolve,reject){resolver={resolve:resolve,reject:reject},driver&&driver.trigger("request",params)});return-1!==dataMethods.indexOf(params.method)?request.serialize(options.data,params.headers["content-type"],function(serialized){params.data=serialized,doRequest(module,params,resolver)}):doRequest(module,params,resolver),promise};var xhrSuccessStatus={0:200,1223:204},processResponse=function(response,resolver,callbackSuccess,callbackError){var promiseResponse,statusCode=xhrSuccessStatus[response.status]||response.status,statusType=Number(response.status.toString()[0]),data=response.response,headers=corbel.utils.keysToLowerCase(response.headers);if(3>=statusType&&!response.error)response.response&&(data=request.parse(response.response,response.responseType,response.dataType)),callbackSuccess&&callbackSuccess.call(this,data,statusCode,response.responseObject,headers),promiseResponse={data:data,status:statusCode,headers:headers},promiseResponse[response.responseObjectType]=response.responseObject,resolver.resolve(promiseResponse);else{var disconnected=response.error&&0===response.status;statusCode=disconnected?0:statusCode,callbackError&&callbackError.call(this,response.error,statusCode,response.responseObject,headers),response.response&&(data=request.parse(response.response,response.responseType,response.dataType)),promiseResponse={data:data,status:statusCode,error:response.error,headers:headers},promiseResponse[response.responseObjectType]=response.responseObject,resolver.reject(promiseResponse)}},rewriteRequestToPostIfUrlLengthIsTooLarge=function(options,params){var AUTOMATIC_HTTP_METHOD_OVERRIDE=corbel.Config.AUTOMATIC_HTTP_METHOD_OVERRIDE||!0,HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN=corbel.Config.HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN||2048;if(AUTOMATIC_HTTP_METHOD_OVERRIDE&¶ms.method===request.method.GET&¶ms.url.length>HTTP_METHOD_OVERRIDE_WITH_URL_SIZE_BIGGER_THAN){var url=params.url.split("?");params.method=request.method.POST,params.headers["X-HTTP-Method-Override"]=request.method.GET,params.url=url[0],options.data=encodeUrlToForm(url[1]),options.contentType="application/x-www-form-urlencoded"}return params},encodeUrlToForm=function(url){var form={};return url.split("&").forEach(function(formEntry){var formPair=formEntry.split("=");form[formPair[0]]=formPair[1]}),form};return request._getNodeRequestAjax=function(params){var requestAjax=require("request");return request.isCrossDomain(params.url)&¶ms.withCredentials&¶ms.useCookies&&(requestAjax=requestAjax.defaults({jar:!0})),requestAjax},request._getNodeRequestCallback=function(context,params,resolver){return function(error,response,body){var responseType,status;error?(responseType=void 0,status=0):(responseType=response.responseType||response.headers["content-type"],status=response.statusCode),processResponse.call(context,{responseObject:response,dataType:params.dataType,responseType:responseType,response:body,status:status,headers:response?response.headers:{},responseObjectType:"response",error:error},resolver,params.callbackSuccess,params.callbackError)}},request._nodeAjax=function(params,resolver){var requestAjax=request._getNodeRequestAjax(params),requestOptions={method:params.method,url:params.url,headers:params.headers},data=params.data||"",callbackRequest=request._getNodeRequestCallback(this,params,resolver);corbel.utils.isStream(data)?data.pipe(requestAjax(requestOptions,callbackRequest)):(requestOptions.body=data,requestAjax(requestOptions,callbackRequest))},request.isCrossDomain=function(url){return!(!url||"string"!=typeof url||-1===url.indexOf("http"))},request._parseResponseHeaders=function(headerStr){var headers={};if(!headerStr)return headers;for(var headerPairs=headerStr.split("\r\n"),i=0;i0){var key=headerPair.substring(0,index),val=headerPair.substring(index+2);headers[key]=val}}return headers},request._browserAjax=function(params,resolver){var httpReq=new XMLHttpRequest;httpReq.open(params.method,params.url,!0),request.isCrossDomain(params.url)&¶ms.withCredentials&&(httpReq.withCredentials=!0);for(var header in params.headers)params.headers.hasOwnProperty(header)&&httpReq.setRequestHeader(header,params.headers[header]);httpReq.responseType=params.responseType||httpReq.responseType,httpReq.onload=function(xhr){xhr=xhr||httpReq,xhr=xhr.target||xhr,processResponse.call(this,{responseObject:xhr,dataType:xhr.dataType,responseType:xhr.responseType||xhr.getResponseHeader("content-type"),response:xhr.response||xhr.responseText,status:xhr.status,headers:request._parseResponseHeaders(xhr.getAllResponseHeaders()),responseObjectType:"xhr",error:xhr.error},resolver,params.callbackSuccess,params.callbackError)}.bind(this),httpReq.onerror=function(xhr){xhr=xhr||httpReq,xhr=xhr.target||xhr;var error=xhr.error?xhr.error:!0;processResponse.call(this,{responseObject:xhr,dataType:xhr.dataType,responseType:xhr.responseType||xhr.getResponseHeader("content-type"),response:xhr.response||xhr.responseText,status:xhr.status,responseObjectType:"xhr",error:error},resolver,params.callbackSuccess,params.callbackError)}.bind(this),params.callbackExtras&&(params.callbackExtras.requestCallback&¶ms.callbackExtras.requestCallback(httpReq),params.callbackExtras.progressCallback&&(httpReq.upload.onprogress=params.callbackExtras.progressCallback)),params.data?httpReq.send(params.data):httpReq.send()},request}(),function(){var Services=corbel.Services=corbel.Object.inherit({constructor:function(driver){this.driver=driver},request:function(args){this.driver.trigger("service:request:before",args);var that=this;return this._requestWithRetries(args).then(function(response){return that.driver.trigger("service:request:after",response),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),response})["catch"](function(error){throw that.driver.trigger("service:request:after",error),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),error})},_requestWithRetries:function(args){var that=this,maxRetries=corbel.Services._UNAUTHORIZED_MAX_RETRIES,requestParameters=that._buildParams(args);return that._doRequest(requestParameters)["catch"](function(response){var retries=that.driver.config.get(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0);if(maxRetries>retries&&response.status===corbel.Services._UNAUTHORIZED_STATUS_CODE)return that._refreshToken().then(function(){return that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,retries+1),that._requestWithRetries(args)["catch"](function(retryResponse){throw response=retryResponse})})["catch"](function(){throw response});throw response})},_doRequest:function(params){var that=this;return corbel.request.send(params,that.driver).then(function(response){return that.driver.config.set(corbel.Services._FORCE_UPDATE_STATUS,0),that.driver.config.set(corbel.Services._UNAUTHORIZED_NUM_RETRIES,0),response})["catch"](function(response){if(response.status===corbel.Services._FORCE_UPDATE_STATUS_CODE&&response.textStatus===corbel.Services._FORCE_UPDATE_TEXT){var retries=that.driver.config.get(corbel.Services._FORCE_UPDATE_STATUS,0);throw retries0&&(query=queries.join("&"))}return query},_buildUri:corbel.CompoSR._buildUri})}(),function(){return corbel.Webfs=corbel.Object.inherit({constructor:function(driver){this.driver=driver},webfs:function(id){return new corbel.Webfs.WebfsBuilder(this.driver,id)}},{moduleName:"webfs",defaultPort:8096,defaultDomain:"unauthenticated",domain:"domain",create:function(driver){return new corbel.Webfs(driver)}}),corbel.Webfs}(),function(){var WebfsBuilder=corbel.Webfs.WebfsBuilder=corbel.Services.inherit({constructor:function(driver,id){this.driver=driver,this.id=id},get:function(params){corbel.validate.value("id",this.id);var options=params?corbel.utils.clone(params):{},args=corbel.utils.extend(options,{url:this._buildUriWithDomain(this.id),method:corbel.request.method.GET,query:params?corbel.utils.serializeParams(params):null});return this.request(args)},"delete":function(){corbel.validate.value("id",this.id);var args={url:this._buildUriWithDomain(this.id),method:corbel.request.method.DELETE};return this.request(args)},_buildUri:function(id){var urlBase=this.driver.config.getCurrentEndpoint(corbel.Webfs.moduleName,this._buildPort(this.driver.config));return urlBase+id},_buildUriWithDomain:function(id){var urlBase=this.driver.config.getCurrentEndpoint(corbel.Webfs.moduleName,this._buildPort(this.driver.config)),domain=this.driver.config.get(corbel.Webfs.domain,corbel.Webfs.defaultDomain),customDomain=this.driver.config.get(corbel.Domain.CUSTOM_DOMAIN,domain);this.driver.config.set(corbel.Domain.CUSTOM_DOMAIN,void 0);var uriWithDomain=urlBase+customDomain+"/path";return id&&(uriWithDomain+="/"+id),uriWithDomain},_buildPort:function(config){return config.get("webfsPort",null)||corbel.Webfs.defaultPort}},{moduleName:"webfs",create:function(driver){return new corbel.Webfs.WebfsBuilder(driver)}});return WebfsBuilder}(),function(){return corbel.Domain=corbel.Object.inherit({constructor:function(driver){return this.driver=driver,function(id){return driver.config.set(corbel.Domain.CUSTOM_DOMAIN,id),driver}}},{moduleName:"domain",CUSTOM_DOMAIN:"customDomain",create:function(driver){return new corbel.Domain(driver)}}),corbel.Domain}(),corbel}); \ No newline at end of file diff --git a/dist/corbel.with-polyfills.js b/dist/corbel.with-polyfills.js index bf58f0c..0891701 100644 --- a/dist/corbel.with-polyfills.js +++ b/dist/corbel.with-polyfills.js @@ -2798,9 +2798,7 @@ params.callbackExtras.requestCallback(httpReq); } if (params.callbackExtras.progressCallback) { - httpReq.upload.onprogress = function(event) { - params.callbackExtras.progressCallback(event); - }; + httpReq.upload.onprogress = params.callbackExtras.progressCallback; } }