From e6319f9dc8d5ea802cdbfb6b24b09175231f7300 Mon Sep 17 00:00:00 2001 From: Simon Woolf Date: Tue, 5 Apr 2016 19:58:09 +0100 Subject: [PATCH] Regenerate and release version 0.8.17 --- README.md | 2 +- bower.json | 2 +- browser/fragments/license.js | 2 +- browser/static/ably.js | 78 ++-- browser/static/ably.min.js | 472 ++++++++++++------------ browser/static/ably.noencryption.js | 78 ++-- browser/static/ably.noencryption.min.js | 439 +++++++++++----------- browser/static/compat-pubnub.js | 2 +- browser/static/compat-pubnub.min.js | 2 +- browser/static/compat-pusher.js | 6 +- browser/static/compat-pusher.min.js | 4 +- common/lib/util/defaults.js | 2 +- package.json | 2 +- spec/support/browser_file_list.js | 2 +- 14 files changed, 577 insertions(+), 516 deletions(-) diff --git a/README.md b/README.md index 3361b8a77c..73f53ebf6e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # [Ably](https://www.ably.io) -## Version: 0.8.16 +## Version: 0.8.17 [![Build Status](https://travis-ci.org/ably/ably-js.png)](https://travis-ci.org/ably/ably-js) diff --git a/bower.json b/bower.json index df09e8394e..db08c7ad43 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "Ably", - "version": "0.8.16", + "version": "0.8.17", "homepage": "https://www.ably.io/", "authors": [ "Paddy Byers " diff --git a/browser/fragments/license.js b/browser/fragments/license.js index 48d1e27f65..bad164a902 100644 --- a/browser/fragments/license.js +++ b/browser/fragments/license.js @@ -1,7 +1,7 @@ /** * @license Copyright 2016, Ably * - * Ably JavaScript Library v0.8.16 + * Ably JavaScript Library v0.8.17 * https://github.com/ably/ably-js * * Ably Realtime Messaging diff --git a/browser/static/ably.js b/browser/static/ably.js index cf09af4674..0def9fff23 100644 --- a/browser/static/ably.js +++ b/browser/static/ably.js @@ -1,7 +1,7 @@ /** * @license Copyright 2016, Ably * - * Ably JavaScript Library v0.8.16 + * Ably JavaScript Library v0.8.17 * https://github.com/ably/ably-js * * Ably Realtime Messaging @@ -3961,7 +3961,7 @@ Defaults.TIMEOUTS = { }; Defaults.httpMaxRetryCount = 3; -Defaults.version = '0.8.16'; +Defaults.version = '0.8.17'; Defaults.apiVersion = '0.8'; Defaults.getHost = function(options, host, ws) { @@ -4592,8 +4592,8 @@ var Utils = (function() { }; }; - Utils.arrRandomElement = function(arr) { - return arr.splice(Math.floor(Math.random() * arr.length)); + Utils.arrPopRandomElement = function(arr) { + return arr.splice(Math.floor(Math.random() * arr.length), 1)[0]; }; Utils.toQueryString = function(params) { @@ -5358,6 +5358,10 @@ var ConnectionManager = (function() { return err.statusCode < 500; } + function isFatalOrTokenErr(err) { + return isFatalErr(err) || Auth.isTokenErr(err); + } + function TransportParams(options, host, mode, connectionKey, connectionSerial) { this.options = options; this.host = host; @@ -5577,8 +5581,11 @@ var ConnectionManager = (function() { return; } if(err) { - /* a 4XX error, such as 401, signifies that there is an error that will not be resolved by another transport */ - if(isFatalErr(err)) { + /* a 4XX error, such as 401, signifies that there is an error that will + * not be resolved by another transport. Token errors are included as + * another transport won't help; need to callback(err) to let the + * connectErr handler in connectImpl deal with it */ + if(isFatalOrTokenErr(err)) { callback(err); return; } @@ -5632,10 +5639,10 @@ var ConnectionManager = (function() { /* the network is there, so there's a problem with the main host, or * its dns. Try the fallback hosts. We could try them simultaneously but * that would potentially cause a huge spike in load on the load balancer */ - transportParams.host = Utils.arrRandomElement(candidateHosts); + transportParams.host = Utils.arrPopRandomElement(candidateHosts); self.chooseTransportForHost(transportParams, self.httpTransports.slice(), function(err, httpTransport) { if(err) { - if(isFatalErr(err)) { + if(isFatalOrTokenErr(err)) { callback(err); return; } @@ -5650,7 +5657,7 @@ var ConnectionManager = (function() { this.chooseTransportForHost(transportParams, this.httpTransports.slice(), function(err, httpTransport) { if(err) { - if(isFatalErr(err)) { + if(isFatalOrTokenErr(err)) { callback(err); return; } @@ -5727,8 +5734,17 @@ var ConnectionManager = (function() { Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.scheduleTransportActivation()', 'sync successful upgraded transport; transport = ' + transport + '; connectionSerial = ' + connectionSerial + '; connectionId = ' + connectionId); Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.scheduleTransportActivation()', 'Sending queued messages on upgraded transport; transport = ' + transport); - self.state = self.states.connected; - self.sendQueuedMessages(); + /* Restore pre-sync state. If state has changed in the meantime, + * don't touch it -- since the websocket transport waits a tick before + * disposing itself, it's possible for it to have happily synced + * without err while, unknown to it, the connection has closed in the + * meantime and the ws transport is scheduled for death */ + if(self.state === self.states.synchronizing) { + self.state = self.states.connected; + } + if(self.state.sendEvents) { + self.sendQueuedMessages(); + } }); } }); @@ -5757,12 +5773,20 @@ var ConnectionManager = (function() { /* if the connectionmanager moved to the closing/closed state before this * connection event, then we won't activate this transport */ var existingState = this.state; - if(existingState == this.states.closing || existingState == this.states.closed) + Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.activateTransport()', 'current state = ' + existingState.state); + if(existingState.state == this.states.closing.state || existingState.state == this.states.closed.state) return false; /* remove this transport from pending transports */ Utils.arrDeleteValue(this.pendingTransports, transport); + /* if the transport is not connected (eg because it failed during a + * scheduleTransportActivation#onceNoPending wait) then don't activate it */ + if(!transport.isConnected) { + Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.activateTransport()', 'Declining to activate transport ' + transport + ' since it appears to no longer be connected'); + return false; + } + /* the given transport is connected; this will immediately * take over as the active transport */ var existingActiveProtocol = this.activeProtocol; @@ -6107,7 +6131,8 @@ var ConnectionManager = (function() { var self = this; var auth = this.realtime.auth; var connectErr = function(err) { - Logger.logAction(Logger.LOG_ERROR, 'ConnectionManager.connectImpl()', 'Connection attempt failed with error; err = ' + ErrorInfo.fromValues(err).toString()); + err = ErrorInfo.fromValues(err); + Logger.logAction(Logger.LOG_ERROR, 'ConnectionManager.connectImpl()', 'Connection attempt failed with error; err = ' + err.toString()); var state = self.state; if(state == self.states.closing || state == self.states.closed || state == self.states.failed) { /* do nothing */ @@ -6468,14 +6493,10 @@ var Transport = (function() { break; case actions.ERROR: var msgErr = message.error; - Logger.logAction(Logger.LOG_ERROR, 'Transport.onProtocolMessage()', 'error; connectionKey = ' + this.connectionManager.connectionKey + '; err = ' + JSON.stringify(msgErr)); + Logger.logAction(Logger.LOG_ERROR, 'Transport.onProtocolMessage()', 'error; connectionKey = ' + this.connectionManager.connectionKey + '; err = ' + JSON.stringify(msgErr) + (message.channel ? (', channel: ' + message.channel) : '')); if(message.channel === undefined) { /* a transport error */ - var err = { - statusCode: msgErr.statusCode, - code: msgErr.code, - message: msgErr.message - }; + var err = ErrorInfo.fromValues(msgErr); this.abort(err); break; } @@ -6966,11 +6987,11 @@ var CometTransport = (function() { })(); var Presence = (function() { + function noop() {} function Presence(channel) { this.channel = channel; this.basePath = channel.basePath + '/presence'; } - Utils.inherits(Presence, EventEmitter); Presence.prototype.get = function(params, callback) { @@ -8787,6 +8808,15 @@ var RealtimePresence = (function() { return realtimePresence.channel.realtime.auth.clientId; } + function isAnonymous(realtimePresence) { + var realtime = realtimePresence.channel.realtime; + /* If not currently connected, we can't assume that we're an anonymous + * client, as realtime may inform us of our clientId in the CONNECTED + * message. So assume we're not anonymous and leave it to realtime to + * return an error if we are */ + return !realtime.auth.clientId && realtime.connection.state === 'connected'; + } + function waitAttached(channel, callback, action) { switch(channel.state) { case 'attached': @@ -8814,14 +8844,14 @@ var RealtimePresence = (function() { Utils.inherits(RealtimePresence, Presence); RealtimePresence.prototype.enter = function(data, callback) { - if(!getClientId(this)) + if(isAnonymous(this)) throw new ErrorInfo('clientId must be specified to enter a presence channel', 40012, 400); this._enterOrUpdateClient(undefined, data, callback, 'enter'); }; RealtimePresence.prototype.update = function(data, callback) { - if(!getClientId(this)) - throw new Error('clientId must be specified to update presence data', 40012, 400); + if(isAnonymous(this)) + throw new ErrorInfo('clientId must be specified to update presence data', 40012, 400); this._enterOrUpdateClient(undefined, data, callback, 'update'); }; @@ -8883,7 +8913,7 @@ var RealtimePresence = (function() { }; RealtimePresence.prototype.leave = function(data, callback) { - if(!getClientId(this)) + if(isAnonymous(this)) throw new ErrorInfo('clientId must have been specified to enter or leave a presence channel', 40012, 400); this.leaveClient(undefined, data, callback); }; diff --git a/browser/static/ably.min.js b/browser/static/ably.min.js index c92cda1c84..5dcea95a31 100644 --- a/browser/static/ably.min.js +++ b/browser/static/ably.min.js @@ -1,7 +1,7 @@ /* Copyright 2016, Ably - Ably JavaScript Library v0.8.16 + Ably JavaScript Library v0.8.17 https://github.com/ably/ably-js Ably Realtime Messaging @@ -9,245 +9,245 @@ Released under the Apache Licence v2.0 */ -(function(){var Z=window.Ably=this,B=B||function(e,d){var c={},b=c.lib={},a=b.Base=function(){function a(){}return{extend:function(h){a.prototype=this;var f=new a;h&&f.mixIn(h);f.hasOwnProperty("init")||(f.init=function(){f.$super.init.apply(this,arguments)});f.init.prototype=f;f.$super=this;return f},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var h in a)a.hasOwnProperty(h)&&(this[h]=a[h]);a.hasOwnProperty("toString")&&(this.toString= -a.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),f=b.WordArray=a.extend({init:function(a,h){a=this.words=a||[];this.sigBytes=h!=d?h:4*a.length},toString:function(a){return(a||m).stringify(this)},concat:function(a){var h=this.words,f=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var b=0;b>>2]|=(f[b>>>2]>>>24-b%4*8&255)<<24-(c+b)%4*8;else if(65535>>2]=f[b>>>2];else h.push.apply(h,f);this.sigBytes+=a;return this}, -clamp:function(){var a=this.words,h=this.sigBytes;a[h>>>2]&=4294967295<<32-h%4*8;a.length=e.ceil(h/4)},clone:function(){var h=a.clone.call(this);h.words=this.words.slice(0);return h},random:function(a){for(var h=[],c=function(a){var h=987654321;return function(){h=36969*(h&65535)+(h>>16)&4294967295;a=18E3*(a&65535)+(a>>16)&4294967295;var f=(h<<16)+a&4294967295,f=f/4294967296+.5;return f*(.5>>2]>>>24-b%4*8&255;f.push((c>>>4).toString(16));f.push((c&15).toString(16))}return f.join("")},parse:function(a){for(var h=a.length,b=[],c=0;c>>3]|=parseInt(a.substr(c,2),16)<<24-c%8*4;return new f.init(b,h/2)}},n=l.Latin1={stringify:function(a){var h=a.words;a=a.sigBytes;for(var f=[],c=0;c>>2]>>>24-c%4*8&255));return f.join("")}, -parse:function(a){for(var h=a.length,c=[],b=0;b>>2]|=(a.charCodeAt(b)&255)<<24-b%4*8;return new f.init(c,h)}},h=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(h){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},q=b.BufferedBlockAlgorithm=a.extend({reset:function(){this._data=new f.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+= -a.sigBytes},_process:function(a){var h=this._data,c=h.words,b=h.sigBytes,q=this.blockSize,l=b/(4*q),l=a?e.ceil(l):e.max((l|0)-this._minBufferSize,0);a=l*q;b=e.min(4*a,b);if(a){for(var d=0;db;)a(c)&&(8>b&&(f[b]=h(e.pow(c,.5))),l[b]=h(e.pow(c,1/3)),b++),c++})();var m=[],c=c.SHA256=a.extend({_doReset:function(){this._hash=new b.init(f.slice(0))},_doProcessBlock:function(a,h){for(var f=this._hash.words,b=f[0],c=f[1],e=f[2],d=f[3],g=f[4],K=f[5],k=f[6],V=f[7],E=0;64>E;E++){if(16>E)m[E]=a[h+E]|0;else{var p=m[E-15],L=m[E-2];m[E]=((p<<25|p>>>7)^(p<<14|p>>>18)^p>>>3)+m[E-7]+((L<<15|L>>>17)^(L<<13|L>>>19)^L>>> -10)+m[E-16]}p=V+((g<<26|g>>>6)^(g<<21|g>>>11)^(g<<7|g>>>25))+(g&K^~g&k)+l[E]+m[E];L=((b<<30|b>>>2)^(b<<19|b>>>13)^(b<<10|b>>>22))+(b&c^b&e^c&e);V=k;k=K;K=g;g=d+p|0;d=e;e=c;c=b;b=p+L|0}f[0]=f[0]+b|0;f[1]=f[1]+c|0;f[2]=f[2]+e|0;f[3]=f[3]+d|0;f[4]=f[4]+g|0;f[5]=f[5]+K|0;f[6]=f[6]+k|0;f[7]=f[7]+V|0},_doFinalize:function(){var a=this._data,h=a.words,f=8*this._nDataBytes,b=8*a.sigBytes;h[b>>>5]|=128<<24-b%32;h[(b+64>>>9<<4)+14]=e.floor(f/4294967296);h[(b+64>>>9<<4)+15]=f;a.sigBytes=4*h.length;this._process(); -return this._hash},clone:function(){var f=a.clone.call(this);f._hash=this._hash.clone();return f}});d.SHA256=a._createHelper(c);d.HmacSHA256=a._createHmacHelper(c)})(Math);(function(){var e=B,d=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(c,b){c=this._hasher=new c.init;"string"==typeof b&&(b=d.parse(b));var a=c.blockSize,f=4*a;b.sigBytes>f&&(b=c.finalize(b));b.clamp();for(var e=this._oKey=b.clone(),m=this._iKey=b.clone(),n=e.words,h=m.words,q=0;q>>2]>>>24-e%4*8&255)<<16|(b[e+1>>>2]>>>24-(e+1)%4*8&255)<< -8|b[e+2>>>2]>>>24-(e+2)%4*8&255,n=0;4>n&&e+.75*n>>6*(3-n)&63));if(b=f.charAt(64))for(;c.length%4;)c.push(b);return c.join("")},parse:function(c){var b=c.length,a=this._map,f=a.charAt(64);f&&(f=c.indexOf(f),-1!=f&&(b=f));for(var f=[],e=0,m=0;m>>6-m%4*2;f[e>>>2]|=(n|h)<<24-e%4*8;e++}return d.create(f,e)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();B.lib.Cipher||function(e){var d= -B,c=d.lib,b=c.Base,a=c.WordArray,f=c.BufferedBlockAlgorithm,l=d.enc.Base64,m=d.algo.EvpKDF,n=c.Cipher=f.extend({cfg:b.extend(),createEncryptor:function(a,h){return this.create(this._ENC_XFORM_MODE,a,h)},createDecryptor:function(a,h){return this.create(this._DEC_XFORM_MODE,a,h)},init:function(a,h,f){this.cfg=this.cfg.extend(f);this._xformMode=a;this._key=h;this.reset()},reset:function(){f.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},finalize:function(a){a&& -this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){return function(a){return{encrypt:function(h,f,b){return("string"==typeof f?aa:u).encrypt(a,h,f,b)},decrypt:function(h,f,b){return("string"==typeof f?aa:u).decrypt(a,h,f,b)}}}}()});c.StreamCipher=n.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var h=d.mode={},q=c.BlockCipherMode=b.extend({createEncryptor:function(a,h){return this.Encryptor.create(a,h)}, -createDecryptor:function(a,h){return this.Decryptor.create(a,h)},init:function(a,h){this._cipher=a;this._iv=h}}),h=h.CBC=function(){function a(h,f,b){var c=this._iv;c?this._iv=e:c=this._prevBlock;for(var q=0;q>>2]&255}};c.BlockCipher=n.extend({cfg:n.cfg.extend({mode:h,padding:w}),reset:function(){n.reset.call(this);var a=this.cfg,h=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var f=a.createEncryptor;else f=a.createDecryptor,this._minBufferSize= -1;this._mode=f.call(a,this,h&&h.words)},_doProcessBlock:function(a,h){this._mode.processBlock(a,h)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var h=this._process(!0)}else h=this._process(!0),a.unpad(h);return h},blockSize:4});var t=c.CipherParams=b.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),h=(d.format={}).OpenSSL={stringify:function(h){var f=h.ciphertext;h= -h.salt;return(h?a.create([1398893684,1701076831]).concat(h).concat(f):f).toString(l)},parse:function(h){h=l.parse(h);var f=h.words;if(1398893684==f[0]&&1701076831==f[1]){var b=a.create(f.slice(2,4));f.splice(0,4);h.sigBytes-=16}return t.create({ciphertext:h,salt:b})}},u=c.SerializableCipher=b.extend({cfg:b.extend({format:h}),encrypt:function(a,h,f,b){b=this.cfg.extend(b);var c=a.createEncryptor(f,b);h=c.finalize(h);c=c.cfg;return t.create({ciphertext:h,key:f,iv:c.iv,algorithm:a,mode:c.mode,padding:c.padding, -blockSize:a.blockSize,formatter:b.format})},decrypt:function(a,h,f,b){b=this.cfg.extend(b);h=this._parse(h,b.format);return a.createDecryptor(f,b).finalize(h.ciphertext)},_parse:function(a,h){return"string"==typeof a?h.parse(a,this):a}}),d=(d.kdf={}).OpenSSL={execute:function(h,f,b,c){c||(c=a.random(8));h=m.create({keySize:f+b}).compute(h,c);b=a.create(h.words.slice(f),4*b);h.sigBytes=4*f;return t.create({key:h,iv:b,salt:c})}},aa=c.PasswordBasedCipher=u.extend({cfg:u.cfg.extend({kdf:d}),encrypt:function(a, -h,f,b){b=this.cfg.extend(b);f=b.kdf.execute(f,a.keySize,a.ivSize);b.iv=f.iv;a=u.encrypt.call(this,a,h,f.key,b);a.mixIn(f);return a},decrypt:function(a,h,f,b){b=this.cfg.extend(b);h=this._parse(h,b.format);f=b.kdf.execute(f,a.keySize,a.ivSize,h.salt);b.iv=f.iv;return u.decrypt.call(this,a,h,f.key,b)}})}();(function(){var e=B,d=e.lib.BlockCipher,c=e.algo,b=[],a=[],f=[],l=[],m=[],n=[],h=[],q=[],w=[],t=[];(function(){for(var c=[],e=0;256>e;e++)c[e]=128>e?e<<1:e<<1^283;for(var d=0,g=0,e=0;256>e;e++){var u= -g^g<<1^g<<2^g<<3^g<<4,u=u>>>8^u&255^99;b[d]=u;a[u]=d;var k=c[d],p=c[k],r=c[p],A=257*c[u]^16843008*u;f[d]=A<<24|A>>>8;l[d]=A<<16|A>>>16;m[d]=A<<8|A>>>24;n[d]=A;A=16843009*r^65537*p^257*k^16843008*d;h[u]=A<<24|A>>>8;q[u]=A<<16|A>>>16;w[u]=A<<8|A>>>24;t[u]=A;d?(d=k^c[c[c[r^k]]],g^=c[c[g]]):d=g=1}})();var u=[0,1,2,4,8,16,32,64,128,27,54],c=c.AES=d.extend({_doReset:function(){for(var a=this._key,f=a.words,c=a.sigBytes/4,a=4*((this._nRounds=c+6)+1),e=this._keySchedule=[],d=0;d>>24]<<24|b[l>>>16&255]<<16|b[l>>>8&255]<<8|b[l&255]):(l=l<<8|l>>>24,l=b[l>>>24]<<24|b[l>>>16&255]<<16|b[l>>>8&255]<<8|b[l&255],l^=u[d/c|0]<<24);e[d]=e[d-c]^l}f=this._invKeySchedule=[];for(c=0;cc||4>=d?l:h[b[l>>>24]]^q[b[l>>>16&255]]^w[b[l>>>8&255]]^t[b[l&255]]},encryptBlock:function(a,h){this._doCryptBlock(a,h,this._keySchedule,f,l,m,n,b)},decryptBlock:function(f,b){var c=f[b+1];f[b+1]=f[b+3];f[b+3]=c;this._doCryptBlock(f,b,this._invKeySchedule, -h,q,w,t,a);c=f[b+1];f[b+1]=f[b+3];f[b+3]=c},_doCryptBlock:function(a,h,f,b,c,e,q,d){for(var l=this._nRounds,w=a[h]^f[0],m=a[h+1]^f[1],n=a[h+2]^f[2],g=a[h+3]^f[3],t=4,u=1;u>>24]^c[m>>>16&255]^e[n>>>8&255]^q[g&255]^f[t++],p=b[m>>>24]^c[n>>>16&255]^e[g>>>8&255]^q[w&255]^f[t++],r=b[n>>>24]^c[g>>>16&255]^e[w>>>8&255]^q[m&255]^f[t++],g=b[g>>>24]^c[w>>>16&255]^e[m>>>8&255]^q[n&255]^f[t++],w=k,m=p,n=r;k=(d[w>>>24]<<24|d[m>>>16&255]<<16|d[n>>>8&255]<<8|d[g&255])^f[t++];p=(d[m>>>24]<<24|d[n>>> -16&255]<<16|d[g>>>8&255]<<8|d[w&255])^f[t++];r=(d[n>>>24]<<24|d[g>>>16&255]<<16|d[w>>>8&255]<<8|d[m&255])^f[t++];g=(d[g>>>24]<<24|d[w>>>16&255]<<16|d[m>>>8&255]<<8|d[n&255])^f[t++];a[h]=k;a[h+1]=p;a[h+2]=r;a[h+3]=g},keySize:8});e.AES=d._createHelper(c)})();(function(){if("undefined"!==typeof ArrayBuffer){var e=B.lib.WordArray,d=e.init;(e.init=function(c){if(c instanceof ArrayBuffer)c=new Uint8Array(c);else if(c instanceof Int8Array||"undefined"!==typeof Uint8ClampedArray&&c instanceof Uint8ClampedArray|| -c instanceof Int16Array||c instanceof Uint16Array||c instanceof Int32Array||c instanceof Uint32Array||"undefined"!==typeof Float32Array&&c instanceof Float32Array||"undefined"!==typeof Float64Array&&c instanceof Float64Array)c=new Uint8Array(c.buffer,c.byteOffset,c.byteLength);if(c instanceof Uint8Array){for(var b=c.byteLength,a=[],f=0;f>>2]|=c[f]<<24-f%4*8;d.call(this,a,b)}else d.apply(this,arguments)}).prototype=e}})();var Q=function(){function e(){}function g(){this.key=this.mode=this.keyLength= -this.algorithm=null}function c(a,h){this.algorithm=a.algorithm+"-"+String(a.keyLength)+"-"+a.mode;var f=this.cjsAlgorithm=a.algorithm.toUpperCase().replace(/-\d+$/,""),b=this.key=x.toWordArray(a.key);h=this.iv=x.toWordArray(h).clone();this.encryptCipher=B.algo[f].createEncryptor(b,{iv:h});this.blockLengthWords=h.words.length}var b=B.lib.WordArray,a,f=window.crypto||window.msCrypto;if(window.Uint32Array&&f&&f.getRandomValues){var l=new Uint32Array(4);a=function(a){a/=4;a=4==a?l:new Uint32Array(a); -f.getRandomValues(a);return x.toWordArray(a)}}else a=function(a){d.logAction(d.LOG_MAJOR,"Ably.Crypto.generateRandom()","Warning: the browser you are using does not support secure cryptographically secure randomness generation; falling back to insecure Math.random()");a/=4;for(var h=Array(a),f=0;f>>2]|=(e[c>>>2]>>>24-c%4*8&255)<<24-(k+c)%4*8;else if(65535>>2]=e[c>>>2];else b.push.apply(b,e);this.sigBytes+=a;return this}, +clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<32-b%4*8;a.length=f.ceil(b/4)},clone:function(){var a=e.clone.call(this);a.words=this.words.slice(0);return a},random:function(b){for(var e=[],k=function(a){var b=987654321;return function(){b=36969*(b&65535)+(b>>16)&4294967295;a=18E3*(a&65535)+(a>>16)&4294967295;var e=(b<<16)+a&4294967295,e=e/4294967296+.5;return e*(.5>>2]>>>24-k%4*8&255;e.push((c>>>4).toString(16));e.push((c&15).toString(16))}return e.join("")},parse:function(b){for(var e=b.length,k=[],c=0;c>>3]|=parseInt(b.substr(c,2),16)<<24-c%8*4;return new a.init(k,e/2)}},p=h.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var e=[],k=0;k>>2]>>>24-k%4*8&255));return e.join("")}, +parse:function(b){for(var e=b.length,k=[],c=0;c>>2]|=(b.charCodeAt(c)&255)<<24-c%4*8;return new a.init(k,e)}},n=h.Utf8={stringify:function(a){try{return decodeURIComponent(escape(p.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return p.parse(unescape(encodeURIComponent(a)))}},k=b.BufferedBlockAlgorithm=e.extend({reset:function(){this._data=new a.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=n.parse(a));this._data.concat(a);this._nDataBytes+= +a.sigBytes},_process:function(b){var e=this._data,k=e.words,c=e.sigBytes,n=this.blockSize,h=c/(4*n),h=b?f.ceil(h):f.max((h|0)-this._minBufferSize,0);b=h*n;c=f.min(4*b,c);if(b){for(var v=0;vc;)b(k)&&(8>c&&(a[c]=e(f.pow(k,.5))),h[c]=e(f.pow(k,1/3)),c++),k++})();var m=[],c=c.SHA256=e.extend({_doReset:function(){this._hash=new b.init(a.slice(0))},_doProcessBlock:function(a,b){for(var e=this._hash.words,c=e[0],f=e[1],d=e[2],g=e[3],D=e[4],L=e[5],l=e[6],V=e[7],F=0;64>F;F++){if(16>F)m[F]=a[b+F]|0;else{var q=m[F-15],M=m[F-2];m[F]=((q<<25|q>>>7)^(q<<14|q>>>18)^q>>>3)+m[F-7]+((M<<15|M>>>17)^(M<<13|M>>>19)^M>>> +10)+m[F-16]}q=V+((D<<26|D>>>6)^(D<<21|D>>>11)^(D<<7|D>>>25))+(D&L^~D&l)+h[F]+m[F];M=((c<<30|c>>>2)^(c<<19|c>>>13)^(c<<10|c>>>22))+(c&f^c&d^f&d);V=l;l=L;L=D;D=g+q|0;g=d;d=f;f=c;c=q+M|0}e[0]=e[0]+c|0;e[1]=e[1]+f|0;e[2]=e[2]+d|0;e[3]=e[3]+g|0;e[4]=e[4]+D|0;e[5]=e[5]+L|0;e[6]=e[6]+l|0;e[7]=e[7]+V|0},_doFinalize:function(){var a=this._data,e=a.words,b=8*this._nDataBytes,c=8*a.sigBytes;e[c>>>5]|=128<<24-c%32;e[(c+64>>>9<<4)+14]=f.floor(b/4294967296);e[(c+64>>>9<<4)+15]=b;a.sigBytes=4*e.length;this._process(); +return this._hash},clone:function(){var a=e.clone.call(this);a._hash=this._hash.clone();return a}});d.SHA256=e._createHelper(c);d.HmacSHA256=e._createHmacHelper(c)})(Math);(function(){var f=B,d=f.enc.Utf8;f.algo.HMAC=f.lib.Base.extend({init:function(c,b){c=this._hasher=new c.init;"string"==typeof b&&(b=d.parse(b));var e=c.blockSize,a=4*e;b.sigBytes>a&&(b=c.finalize(b));b.clamp();for(var f=this._oKey=b.clone(),m=this._iKey=b.clone(),p=f.words,n=m.words,k=0;k>>2]>>>24-f%4*8&255)<<16|(b[f+1>>>2]>>>24-(f+1)%4*8&255)<< +8|b[f+2>>>2]>>>24-(f+2)%4*8&255,p=0;4>p&&f+.75*p>>6*(3-p)&63));if(b=a.charAt(64))for(;c.length%4;)c.push(b);return c.join("")},parse:function(c){var b=c.length,e=this._map,a=e.charAt(64);a&&(a=c.indexOf(a),-1!=a&&(b=a));for(var a=[],f=0,m=0;m>>6-m%4*2;a[f>>>2]|=(p|n)<<24-f%4*8;f++}return d.create(a,f)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();B.lib.Cipher||function(f){var d= +B,c=d.lib,b=c.Base,e=c.WordArray,a=c.BufferedBlockAlgorithm,h=d.enc.Base64,m=d.algo.EvpKDF,p=c.Cipher=a.extend({cfg:b.extend(),createEncryptor:function(a,e){return this.create(this._ENC_XFORM_MODE,a,e)},createDecryptor:function(a,e){return this.create(this._DEC_XFORM_MODE,a,e)},init:function(a,e,b){this.cfg=this.cfg.extend(b);this._xformMode=a;this._key=e;this.reset()},reset:function(){a.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},finalize:function(a){a&& +this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(){return function(a){return{encrypt:function(e,b,c){return("string"==typeof b?aa:u).encrypt(a,e,b,c)},decrypt:function(e,b,c){return("string"==typeof b?aa:u).decrypt(a,e,b,c)}}}}()});c.StreamCipher=p.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var n=d.mode={},k=c.BlockCipherMode=b.extend({createEncryptor:function(a,e){return this.Encryptor.create(a,e)}, +createDecryptor:function(a,e){return this.Decryptor.create(a,e)},init:function(a,e){this._cipher=a;this._iv=e}}),n=n.CBC=function(){function a(e,b,c){var k=this._iv;k?this._iv=f:k=this._prevBlock;for(var n=0;n>>2]&255}};c.BlockCipher=p.extend({cfg:p.cfg.extend({mode:n,padding:v}),reset:function(){p.reset.call(this);var a=this.cfg,e=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var b=a.createEncryptor;else b=a.createDecryptor,this._minBufferSize= +1;this._mode=b.call(a,this,e&&e.words)},_doProcessBlock:function(a,e){this._mode.processBlock(a,e)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var e=this._process(!0)}else e=this._process(!0),a.unpad(e);return e},blockSize:4});var t=c.CipherParams=b.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),n=(d.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a= +a.salt;return(a?e.create([1398893684,1701076831]).concat(a).concat(b):b).toString(h)},parse:function(a){a=h.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=e.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return t.create({ciphertext:a,salt:c})}},u=c.SerializableCipher=b.extend({cfg:b.extend({format:n}),encrypt:function(a,e,b,c){c=this.cfg.extend(c);var k=a.createEncryptor(b,c);e=k.finalize(e);k=k.cfg;return t.create({ciphertext:e,key:b,iv:k.iv,algorithm:a,mode:k.mode,padding:k.padding, +blockSize:a.blockSize,formatter:c.format})},decrypt:function(a,e,b,c){c=this.cfg.extend(c);e=this._parse(e,c.format);return a.createDecryptor(b,c).finalize(e.ciphertext)},_parse:function(a,e){return"string"==typeof a?e.parse(a,this):a}}),d=(d.kdf={}).OpenSSL={execute:function(a,b,c,k){k||(k=e.random(8));a=m.create({keySize:b+c}).compute(a,k);c=e.create(a.words.slice(b),4*c);a.sigBytes=4*b;return t.create({key:a,iv:c,salt:k})}},aa=c.PasswordBasedCipher=u.extend({cfg:u.cfg.extend({kdf:d}),encrypt:function(a, +e,b,c){c=this.cfg.extend(c);b=c.kdf.execute(b,a.keySize,a.ivSize);c.iv=b.iv;a=u.encrypt.call(this,a,e,b.key,c);a.mixIn(b);return a},decrypt:function(a,e,b,c){c=this.cfg.extend(c);e=this._parse(e,c.format);b=c.kdf.execute(b,a.keySize,a.ivSize,e.salt);c.iv=b.iv;return u.decrypt.call(this,a,e,b.key,c)}})}();(function(){var f=B,d=f.lib.BlockCipher,c=f.algo,b=[],e=[],a=[],h=[],m=[],p=[],n=[],k=[],v=[],t=[];(function(){for(var c=[],f=0;256>f;f++)c[f]=128>f?f<<1:f<<1^283;for(var d=0,g=0,f=0;256>f;f++){var u= +g^g<<1^g<<2^g<<3^g<<4,u=u>>>8^u&255^99;b[d]=u;e[u]=d;var l=c[d],q=c[l],r=c[q],A=257*c[u]^16843008*u;a[d]=A<<24|A>>>8;h[d]=A<<16|A>>>16;m[d]=A<<8|A>>>24;p[d]=A;A=16843009*r^65537*q^257*l^16843008*d;n[u]=A<<24|A>>>8;k[u]=A<<16|A>>>16;v[u]=A<<8|A>>>24;t[u]=A;d?(d=l^c[c[c[r^l]]],g^=c[c[g]]):d=g=1}})();var u=[0,1,2,4,8,16,32,64,128,27,54],c=c.AES=d.extend({_doReset:function(){for(var a=this._key,e=a.words,c=a.sigBytes/4,a=4*((this._nRounds=c+6)+1),f=this._keySchedule=[],d=0;d>>24]<<24|b[h>>>16&255]<<16|b[h>>>8&255]<<8|b[h&255]):(h=h<<8|h>>>24,h=b[h>>>24]<<24|b[h>>>16&255]<<16|b[h>>>8&255]<<8|b[h&255],h^=u[d/c|0]<<24);f[d]=f[d-c]^h}e=this._invKeySchedule=[];for(c=0;cc||4>=d?h:n[b[h>>>24]]^k[b[h>>>16&255]]^v[b[h>>>8&255]]^t[b[h&255]]},encryptBlock:function(e,c){this._doCryptBlock(e,c,this._keySchedule,a,h,m,p,b)},decryptBlock:function(a,b){var c=a[b+1];a[b+1]=a[b+3];a[b+3]=c;this._doCryptBlock(a,b,this._invKeySchedule, +n,k,v,t,e);c=a[b+1];a[b+1]=a[b+3];a[b+3]=c},_doCryptBlock:function(a,e,b,c,k,n,f,d){for(var h=this._nRounds,v=a[e]^b[0],m=a[e+1]^b[1],p=a[e+2]^b[2],g=a[e+3]^b[3],t=4,u=1;u>>24]^k[m>>>16&255]^n[p>>>8&255]^f[g&255]^b[t++],q=c[m>>>24]^k[p>>>16&255]^n[g>>>8&255]^f[v&255]^b[t++],r=c[p>>>24]^k[g>>>16&255]^n[v>>>8&255]^f[m&255]^b[t++],g=c[g>>>24]^k[v>>>16&255]^n[m>>>8&255]^f[p&255]^b[t++],v=l,m=q,p=r;l=(d[v>>>24]<<24|d[m>>>16&255]<<16|d[p>>>8&255]<<8|d[g&255])^b[t++];q=(d[m>>>24]<<24|d[p>>> +16&255]<<16|d[g>>>8&255]<<8|d[v&255])^b[t++];r=(d[p>>>24]<<24|d[g>>>16&255]<<16|d[v>>>8&255]<<8|d[m&255])^b[t++];g=(d[g>>>24]<<24|d[v>>>16&255]<<16|d[m>>>8&255]<<8|d[p&255])^b[t++];a[e]=l;a[e+1]=q;a[e+2]=r;a[e+3]=g},keySize:8});f.AES=d._createHelper(c)})();(function(){if("undefined"!==typeof ArrayBuffer){var f=B.lib.WordArray,d=f.init;(f.init=function(c){if(c instanceof ArrayBuffer)c=new Uint8Array(c);else if(c instanceof Int8Array||"undefined"!==typeof Uint8ClampedArray&&c instanceof Uint8ClampedArray|| +c instanceof Int16Array||c instanceof Uint16Array||c instanceof Int32Array||c instanceof Uint32Array||"undefined"!==typeof Float32Array&&c instanceof Float32Array||"undefined"!==typeof Float64Array&&c instanceof Float64Array)c=new Uint8Array(c.buffer,c.byteOffset,c.byteLength);if(c instanceof Uint8Array){for(var b=c.byteLength,e=[],a=0;a>>2]|=c[a]<<24-a%4*8;d.call(this,e,b)}else d.apply(this,arguments)}).prototype=f}})();var R=function(){function f(){}function g(){this.key=this.mode=this.keyLength= +this.algorithm=null}function c(a,e){this.algorithm=a.algorithm+"-"+String(a.keyLength)+"-"+a.mode;var b=this.cjsAlgorithm=a.algorithm.toUpperCase().replace(/-\d+$/,""),c=this.key=x.toWordArray(a.key);e=this.iv=x.toWordArray(e).clone();this.encryptCipher=B.algo[b].createEncryptor(c,{iv:e});this.blockLengthWords=e.words.length}var b=B.lib.WordArray,e,a=window.crypto||window.msCrypto;if(window.Uint32Array&&a&&a.getRandomValues){var h=new Uint32Array(4);e=function(e){e/=4;e=4==e?h:new Uint32Array(e); +a.getRandomValues(e);return x.toWordArray(e)}}else e=function(a){d.logAction(d.LOG_MAJOR,"Ably.Crypto.generateRandom()","Warning: the browser you are using does not support secure cryptographically secure randomness generation; falling back to insecure Math.random()");a/=4;for(var e=Array(a),c=0;c>>2]>>>24-n%4*8&255;return b}throw Error("BufferUtils.toArrayBuffer expected a buffer");};c.toWordArray=function(a){return e(a)?a:b.create(a)};c.base64Encode=function(a){if(d(a)){var b="";a=new Uint8Array(a);for(var c=a.byteLength,n=c%3,c=c-n,h,q,w,t,u=0;u>18,q=(t&258048)>>12,w=(t&4032)>>6,t&=63,b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[h]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[q]+ -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[w]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[t];1==n?(t=a[c],b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&252)>>2]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&3)<<4]+"=="):2==n&&(t=a[c]<<8|a[c+1],b+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&64512)>>10]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&1008)>> -4]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&15)<<2]+"=");return b}if(e(a))return B.enc.Base64.stringify(a)};c.base64Decode=function(f){if(a){f=window.atob(f);for(var b=f.length,c=new Uint8Array(b),e=0;e>2,m=(m&3)<<4|n>>4,w=(n&15)<<2|h>>6,t=h&63;isNaN(n)?w=t=64:isNaN(h)&&(t=64);f.append(c.charAt(q)+c.charAt(m)+c.charAt(w)+c.charAt(t))}return f.toString()},decode:function(a){var f=new e;for(a=new c(a);a.moveNext();){var b=a.current;if(128>b)f.append(String.fromCharCode(b)); -else if(191b){a.moveNext();var d=a.current;f.append(String.fromCharCode((b&31)<<6|d&63))}else a.moveNext(),d=a.current,a.moveNext(),f.append(String.fromCharCode((b&15)<<12|(d&63)<<6|a.current&63))}return f.toString()}};d.prototype={current:Number.NaN,moveNext:function(){if(0=this._input.length-1)return this.current=Number.NaN,!1;var a=this._input.charCodeAt(++this._index);13==a&&10==this._input.charCodeAt(this._index+ -1)&&(a=10,this._index+=2);128>a?this.current=a:(127a?this.current=a>>6|192:(this.current=a>>12|224,this._buffer.push(a>>6&63|128)),this._buffer.push(a&63|128));return!0}};c.prototype={current:64,moveNext:function(){if(0=this._input.length-1)return this.current=64,!1;var a=b.codex.indexOf(this._input.charAt(++this._index)),f=b.codex.indexOf(this._input.charAt(++this._index)),c=b.codex.indexOf(this._input.charAt(++this._index)), -e=b.codex.indexOf(this._input.charAt(++this._index)),d=(c&3)<<6|e;this.current=a<<2|f>>4;64!=c&&this._buffer.push((f&15)<<4|c>>2);64!=e&&this._buffer.push(d);return!0}};return b}(),fa=function(){function e(){}e.addListener=function(e,c,b){e.addEventListener?e.addEventListener(c,b,!1):e.attachEvent("on"+c,function(){b.apply(e,arguments)})};e.removeListener=function(e,c,b){e.removeEventListener?e.removeEventListener(c,b,!1):e.detachEvent("on"+c,function(){b.apply(e,arguments)})};e.addMessageListener= -function(d,c){e.addListener(d,"message",c)};e.removeMessageListener=function(d,c){e.removeListener(d,"message",c)};e.addUnloadListener=function(d){e.addListener(window,"unload",d)};return e}();(function(e){this.msgpack=e()}).call(this,function(){function e(a,b,f){for(var c=0,e=f.length;cd)a.setUint8(b++,d>>>0&127|0);else if(2048>d)a.setUint8(b++,d>>>6&31|192),a.setUint8(b++,d>>>0&63|128);else if(65536>d)a.setUint8(b++,d>>>12&15|224),a.setUint8(b++,d>>>6&63|128), -a.setUint8(b++,d>>>0&63|128);else if(1114112>d)a.setUint8(b++,d>>>18&7|240),a.setUint8(b++,d>>>12&63|128),a.setUint8(b++,d>>>6&63|128),a.setUint8(b++,d>>>0&63|128);else throw Error("bad codepoint "+d);}}function d(a,b,f){var c="",e=b;for(b+=f;ee)b+=1;else if(2048>e)b+=2;else if(65536>e)b+=3;else if(1114112>e)b+=4;else throw Error("bad codepoint "+e);}return b}function b(a,b){this.offset=b||0;this.view=a}function a(a,b){return k.keysArray(a,!0).filter(function(f){f=a[f];return(!b||void 0!== -f&&null!==f)&&("function"!==typeof f||!!f.toJSON)})}function f(h,b,d,l){var m=typeof h;if("string"===m){var g=c(h);if(32>g)return b.setUint8(d,g|160),e(b,d+1,h),1+g;if(256>g)return b.setUint8(d,217),b.setUint8(d+1,g),e(b,d+2,h),2+g;if(65536>g)return b.setUint8(d,218),b.setUint16(d+1,g),e(b,d+3,h),3+g;if(4294967296>g)return b.setUint8(d,219),b.setUint32(d+1,g),e(b,d+5,h),5+g}if(h instanceof ArrayBuffer){g=h.byteLength;if(256>g)return b.setUint8(d,196),b.setUint8(d+1,g),(new Uint8Array(b.buffer)).set(new Uint8Array(h), -d+2),2+g;if(65536>g)return b.setUint8(d,197),b.setUint16(d+1,g),(new Uint8Array(b.buffer)).set(new Uint8Array(h),d+3),3+g;if(4294967296>g)return b.setUint8(d,198),b.setUint32(d+1,g),(new Uint8Array(b.buffer)).set(new Uint8Array(h),d+5),5+g}if("number"===m){if(Math.floor(h)!==h)return b.setUint8(d,203),b.setFloat64(d+1,h),9;if(0<=h){if(128>h)return b.setUint8(d,h),1;if(256>h)return b.setUint8(d,204),b.setUint8(d+1,h),2;if(65536>h)return b.setUint8(d,205),b.setUint16(d+1,h),3;if(4294967296>h)return b.setUint8(d, -206),b.setUint32(d+1,h),5;if(1.8446744073709552E19>h)return b.setUint8(d,207),d+=1,1.8446744073709552E19>h?(b.setUint32(d,Math.floor(h*n)),b.setInt32(d+4,h&-1)):(b.setUint32(d,4294967295),b.setUint32(d+4,4294967295)),9;throw Error("Number too big 0x"+h.toString(16));}if(-32<=h)return b.setInt8(d,h),1;if(-128<=h)return b.setUint8(d,208),b.setInt8(d+1,h),2;if(-32768<=h)return b.setUint8(d,209),b.setInt16(d+1,h),3;if(-2147483648<=h)return b.setUint8(d,210),b.setInt32(d+1,h),5;if(-9223372036854775808<= -h)return b.setUint8(d,211),d+=1,0x7fffffffffffffff>h?(b.setInt32(d,Math.floor(h*n)),b.setInt32(d+4,h&-1)):(b.setUint32(d,2147483647),b.setUint32(d+4,2147483647)),9;throw Error("Number too small -0x"+(-h).toString(16).substr(1));}if("undefined"===m){if(l)return 0;b.setUint8(d,212);b.setUint8(d+1,0);b.setUint8(d+2,0);return 3}if(null===h){if(l)return 0;b.setUint8(d,192);return 1}if("boolean"===m)return b.setUint8(d,h?195:194),1;if("function"===typeof h.toJSON)return f(h.toJSON(),b,d,l);if("object"=== -m){var m=0,k=Array.isArray(h);if(k)g=h.length;else var K=a(h,l),g=K.length;16>g?(b.setUint8(d,g|(k?144:128)),m=1):65536>g?(b.setUint8(d,k?220:222),b.setUint16(d+1,g),m=3):4294967296>g&&(b.setUint8(d,k?221:223),b.setUint32(d+1,g),m=5);if(k)for(k=0;ke)return 1+e;if(256>e)return 2+ -e;if(65536>e)return 3+e;if(4294967296>e)return 5+e}if(b instanceof ArrayBuffer){e=b.byteLength;if(256>e)return 2+e;if(65536>e)return 3+e;if(4294967296>e)return 5+e}if("number"===d){if(Math.floor(b)!==b)return 9;if(0<=b){if(128>b)return 1;if(256>b)return 2;if(65536>b)return 3;if(4294967296>b)return 5;if(1.8446744073709552E19>b)return 9;throw Error("Number too big 0x"+b.toString(16));}if(-32<=b)return 1;if(-128<=b)return 2;if(-32768<=b)return 3;if(-2147483648<=b)return 5;if(-9223372036854775808<=b)return 9; -throw Error("Number too small -0x"+b.toString(16).substr(1));}if("boolean"===d)return 1;if(null===b)return f?0:1;if(void 0===b)return f?0:3;if("function"===typeof b.toJSON)return l(b.toJSON(),f);if("object"===d){d=0;if(Array.isArray(b))for(var e=b.length,m=0;me)return 1+d;if(65536>e)return 3+d;if(4294967296>e)return 5+d;throw Error("Array or object too long 0x"+e.toString(16));}if("function"===d)return 0; -throw Error("Unknown type "+d);}var m={inspect:function(a){if(void 0===a)return"undefined";var b,f;a instanceof ArrayBuffer?(f="ArrayBuffer",b=new DataView(a)):a instanceof DataView&&(f="DataView",b=a);if(!b)return JSON.stringify(a);for(var c=[],d=0;d"}};m.utf8Write=e;m.utf8Read=d;m.utf8ByteCount=c;m.encode=function(a,b){var c=l(a,b);if(0!=c){var c=new ArrayBuffer(c), -d=new DataView(c);f(a,d,0,b);return c}};m.decode=function(a){var f=new DataView(a),f=new b(f),c=f.parse();if(f.offset!==a.byteLength)throw Error(a.byteLength-f.offset+" trailing bytes");return c};var n=1/4294967296;b.prototype.map=function(a){for(var b={},f=0;f>>2]>>>24-p%4*8&255;return b}throw Error("BufferUtils.toArrayBuffer expected a buffer");};c.toWordArray=function(a){return f(a)?a:b.create(a)};c.base64Encode=function(a){if(d(a)){var e="";a=new Uint8Array(a);for(var b=a.byteLength,c=b%3,b=b-c,n,k,v,t,u=0;u>18,k=(t&258048)>>12,v=(t&4032)>>6,t&=63,e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[n]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[k]+ +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[v]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[t];1==c?(t=a[b],e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&252)>>2]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&3)<<4]+"=="):2==c&&(t=a[b]<<8|a[b+1],e+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&64512)>>10]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&1008)>> +4]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&15)<<2]+"=");return e}if(f(a))return B.enc.Base64.stringify(a)};c.base64Decode=function(a){if(e){a=window.atob(a);for(var b=a.length,c=new Uint8Array(b),f=0;f>2,m=(m&3)<<4|p>>4,v=(p&15)<<2|n>>6,t=n&63;isNaN(p)?v=t=64:isNaN(n)&&(t=64);a.append(c.charAt(k)+c.charAt(m)+c.charAt(v)+c.charAt(t))}return a.toString()},decode:function(e){var a=new f;for(e=new c(e);e.moveNext();){var b=e.current;if(128>b)a.append(String.fromCharCode(b)); +else if(191b){e.moveNext();var d=e.current;a.append(String.fromCharCode((b&31)<<6|d&63))}else e.moveNext(),d=e.current,e.moveNext(),a.append(String.fromCharCode((b&15)<<12|(d&63)<<6|e.current&63))}return a.toString()}};d.prototype={current:Number.NaN,moveNext:function(){if(0=this._input.length-1)return this.current=Number.NaN,!1;var e=this._input.charCodeAt(++this._index);13==e&&10==this._input.charCodeAt(this._index+ +1)&&(e=10,this._index+=2);128>e?this.current=e:(127e?this.current=e>>6|192:(this.current=e>>12|224,this._buffer.push(e>>6&63|128)),this._buffer.push(e&63|128));return!0}};c.prototype={current:64,moveNext:function(){if(0=this._input.length-1)return this.current=64,!1;var e=b.codex.indexOf(this._input.charAt(++this._index)),a=b.codex.indexOf(this._input.charAt(++this._index)),c=b.codex.indexOf(this._input.charAt(++this._index)), +f=b.codex.indexOf(this._input.charAt(++this._index)),d=(c&3)<<6|f;this.current=e<<2|a>>4;64!=c&&this._buffer.push((a&15)<<4|c>>2);64!=f&&this._buffer.push(d);return!0}};return b}(),fa=function(){function f(){}f.addListener=function(f,c,b){f.addEventListener?f.addEventListener(c,b,!1):f.attachEvent("on"+c,function(){b.apply(f,arguments)})};f.removeListener=function(f,c,b){f.removeEventListener?f.removeEventListener(c,b,!1):f.detachEvent("on"+c,function(){b.apply(f,arguments)})};f.addMessageListener= +function(d,c){f.addListener(d,"message",c)};f.removeMessageListener=function(d,c){f.removeListener(d,"message",c)};f.addUnloadListener=function(d){f.addListener(window,"unload",d)};return f}();(function(f){this.msgpack=f()}).call(this,function(){function f(a,e,b){for(var c=0,f=b.length;cd)a.setUint8(e++,d>>>0&127|0);else if(2048>d)a.setUint8(e++,d>>>6&31|192),a.setUint8(e++,d>>>0&63|128);else if(65536>d)a.setUint8(e++,d>>>12&15|224),a.setUint8(e++,d>>>6&63|128), +a.setUint8(e++,d>>>0&63|128);else if(1114112>d)a.setUint8(e++,d>>>18&7|240),a.setUint8(e++,d>>>12&63|128),a.setUint8(e++,d>>>6&63|128),a.setUint8(e++,d>>>0&63|128);else throw Error("bad codepoint "+d);}}function d(a,e,b){var c="",f=e;for(e+=b;ff)e+=1;else if(2048>f)e+=2;else if(65536>f)e+=3;else if(1114112>f)e+=4;else throw Error("bad codepoint "+f);}return e}function b(a,e){this.offset=e||0;this.view=a}function e(a,e){return l.keysArray(a,!0).filter(function(b){b=a[b];return(!e||void 0!== +b&&null!==b)&&("function"!==typeof b||!!b.toJSON)})}function a(b,k,d,h){var m=typeof b;if("string"===m){var g=c(b);if(32>g)return k.setUint8(d,g|160),f(k,d+1,b),1+g;if(256>g)return k.setUint8(d,217),k.setUint8(d+1,g),f(k,d+2,b),2+g;if(65536>g)return k.setUint8(d,218),k.setUint16(d+1,g),f(k,d+3,b),3+g;if(4294967296>g)return k.setUint8(d,219),k.setUint32(d+1,g),f(k,d+5,b),5+g}if(b instanceof ArrayBuffer){g=b.byteLength;if(256>g)return k.setUint8(d,196),k.setUint8(d+1,g),(new Uint8Array(k.buffer)).set(new Uint8Array(b), +d+2),2+g;if(65536>g)return k.setUint8(d,197),k.setUint16(d+1,g),(new Uint8Array(k.buffer)).set(new Uint8Array(b),d+3),3+g;if(4294967296>g)return k.setUint8(d,198),k.setUint32(d+1,g),(new Uint8Array(k.buffer)).set(new Uint8Array(b),d+5),5+g}if("number"===m){if(Math.floor(b)!==b)return k.setUint8(d,203),k.setFloat64(d+1,b),9;if(0<=b){if(128>b)return k.setUint8(d,b),1;if(256>b)return k.setUint8(d,204),k.setUint8(d+1,b),2;if(65536>b)return k.setUint8(d,205),k.setUint16(d+1,b),3;if(4294967296>b)return k.setUint8(d, +206),k.setUint32(d+1,b),5;if(1.8446744073709552E19>b)return k.setUint8(d,207),d+=1,1.8446744073709552E19>b?(k.setUint32(d,Math.floor(b*p)),k.setInt32(d+4,b&-1)):(k.setUint32(d,4294967295),k.setUint32(d+4,4294967295)),9;throw Error("Number too big 0x"+b.toString(16));}if(-32<=b)return k.setInt8(d,b),1;if(-128<=b)return k.setUint8(d,208),k.setInt8(d+1,b),2;if(-32768<=b)return k.setUint8(d,209),k.setInt16(d+1,b),3;if(-2147483648<=b)return k.setUint8(d,210),k.setInt32(d+1,b),5;if(-9223372036854775808<= +b)return k.setUint8(d,211),d+=1,0x7fffffffffffffff>b?(k.setInt32(d,Math.floor(b*p)),k.setInt32(d+4,b&-1)):(k.setUint32(d,2147483647),k.setUint32(d+4,2147483647)),9;throw Error("Number too small -0x"+(-b).toString(16).substr(1));}if("undefined"===m){if(h)return 0;k.setUint8(d,212);k.setUint8(d+1,0);k.setUint8(d+2,0);return 3}if(null===b){if(h)return 0;k.setUint8(d,192);return 1}if("boolean"===m)return k.setUint8(d,b?195:194),1;if("function"===typeof b.toJSON)return a(b.toJSON(),k,d,h);if("object"=== +m){var m=0,l=Array.isArray(b);if(l)g=b.length;else var L=e(b,h),g=L.length;16>g?(k.setUint8(d,g|(l?144:128)),m=1):65536>g?(k.setUint8(d,l?220:222),k.setUint16(d+1,g),m=3):4294967296>g&&(k.setUint8(d,l?221:223),k.setUint32(d+1,g),m=5);if(l)for(l=0;lf)return 1+f;if(256>f)return 2+ +f;if(65536>f)return 3+f;if(4294967296>f)return 5+f}if(a instanceof ArrayBuffer){f=a.byteLength;if(256>f)return 2+f;if(65536>f)return 3+f;if(4294967296>f)return 5+f}if("number"===d){if(Math.floor(a)!==a)return 9;if(0<=a){if(128>a)return 1;if(256>a)return 2;if(65536>a)return 3;if(4294967296>a)return 5;if(1.8446744073709552E19>a)return 9;throw Error("Number too big 0x"+a.toString(16));}if(-32<=a)return 1;if(-128<=a)return 2;if(-32768<=a)return 3;if(-2147483648<=a)return 5;if(-9223372036854775808<=a)return 9; +throw Error("Number too small -0x"+a.toString(16).substr(1));}if("boolean"===d)return 1;if(null===a)return b?0:1;if(void 0===a)return b?0:3;if("function"===typeof a.toJSON)return h(a.toJSON(),b);if("object"===d){d=0;if(Array.isArray(a))for(var f=a.length,m=0;mf)return 1+d;if(65536>f)return 3+d;if(4294967296>f)return 5+d;throw Error("Array or object too long 0x"+f.toString(16));}if("function"===d)return 0; +throw Error("Unknown type "+d);}var m={inspect:function(a){if(void 0===a)return"undefined";var b,e;a instanceof ArrayBuffer?(e="ArrayBuffer",b=new DataView(a)):a instanceof DataView&&(e="DataView",b=a);if(!b)return JSON.stringify(a);for(var c=[],d=0;d"}};m.utf8Write=f;m.utf8Read=d;m.utf8ByteCount=c;m.encode=function(b,e){var c=h(b,e);if(0!=c){var c=new ArrayBuffer(c), +d=new DataView(c);a(b,d,0,e);return c}};m.decode=function(a){var e=new DataView(a),e=new b(e),c=e.parse();if(e.offset!==a.byteLength)throw Error(a.byteLength-e.offset+" trailing bytes");return c};var p=1/4294967296;b.prototype.map=function(a){for(var b={},e=0;e=f?null:a.slice(0,f).join("/"),c.data=e}}};e.fromResponseBody=function(c,b,a,f){a&&(c="msgpack"==a?g.decode(c):JSON.parse(String(c)));for(a=0;aa.code:500>a.statusCode}function g(a,b,d,c,f){this.options=a;this.host=b;this.mode=d;this.connectionKey=c;this.connectionSerial=f;this.format=a.useBinaryProtocol?"msgpack":"json"}function c(b,f){y.call(this);this.realtime=b;this.options= -f;var e=f.timeouts;this.states={initialized:{state:"initialized",terminal:!1,queueEvents:!0,sendEvents:!1},connecting:{state:"connecting",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:e.realtimeRequestTimeout,failState:"disconnected"},connected:{state:"connected",terminal:!1,queueEvents:!1,sendEvents:!0,failState:"disconnected"},synchronizing:{state:"connected",terminal:!1,queueEvents:!0,sendEvents:!1},disconnected:{state:"disconnected",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:e.disconnectedRetryTimeout}, -suspended:{state:"suspended",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:e.suspendedRetryTimeout},closing:{state:"closing",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:e.realtimeRequestTimeout,failState:"closed"},closed:{state:"closed",terminal:!0,queueEvents:!1,sendEvents:!1},failed:{state:"failed",terminal:!0,queueEvents:!1,sendEvents:!1}};this.state=this.states.initialized;this.errorReason=null;this.queuedMessages=new ba;this.msgSerial=0;this.connectionSerial=this.connectionKey= -this.connectionId=void 0;this.httpTransports=k.intersect(f.transports||r.httpTransports,c.httpTransports);this.transports=k.intersect(f.transports||r.transports,c.transports);this.upgradeTransports=k.arrSubtract(this.transports,this.httpTransports);this.httpHosts=r.getHosts(f);this.activeProtocol=null;this.pendingTransports=[];this.host=null;d.logAction(d.LOG_MINOR,"Realtime.ConnectionManager()","started");d.logAction(d.LOG_MICRO,"Realtime.ConnectionManager()","requested transports = ["+(f.transports|| -r.transports)+"]");d.logAction(d.LOG_MICRO,"Realtime.ConnectionManager()","available http transports = ["+this.httpTransports+"]");d.logAction(d.LOG_MICRO,"Realtime.ConnectionManager()","available transports = ["+this.transports+"]");d.logAction(d.LOG_MICRO,"Realtime.ConnectionManager()","http hosts = ["+this.httpHosts+"]");if(!this.transports.length)throw d.logAction(d.LOG_ERROR,"realtime.ConnectionManager()","no requested transports available"),Error("no requested transports available");a&&!0=== -f.recover&&window.addEventListener&&window.addEventListener("beforeunload",this.persistConnection.bind(this));if("object"===typeof window&&window.addEventListener){var l=this;window.addEventListener("online",function(){if(l.state==l.states.disconnected||l.state==l.states.suspended)d.logAction(d.LOG_MINOR,"ConnectionManager caught browser \u2018online\u2019 event","reattempting connection"),l.requestState({state:"connecting"})});window.addEventListener("offline",function(){l.state==l.states.connected&& -(d.logAction(d.LOG_MINOR,"ConnectionManager caught browser \u2018offline\u2019 event","disconnecting active transport"),l.disconnectAllTransports())})}}var b="undefined"!==typeof N&&N.read,a="undefined"!==typeof N&&N.create,f="undefined"!==typeof N&&N.erase,l=z.Action,m=ca.PendingMessage,n=function(){};g.prototype.getConnectParams=function(a){a=a?k.copy(a):{};var d=this.options;switch(this.mode){case "upgrade":a.upgrade=this.connectionKey;break;case "resume":a.resume=this.connectionKey;void 0!==this.connectionSerial&& -(a.connection_serial=this.connectionSerial);break;case "recover":if(!0===d.recover){var c=b("ably-connection-key"),f=b("ably-connection-serial");null!==c&&null!==f&&(a.recover=c,a.connection_serial=f)}else if(c=d.recover.match(/^(\w+):(\w+)$/))a.recover=c[1],a.connection_serial=c[2]}void 0!==d.clientId&&(a.clientId=d.clientId);!1===d.echoMessages&&(a.echo="false");void 0!==this.format&&(a.format=this.format);void 0!==this.stream&&(a.stream=this.stream);void 0!==d.transportParams&&k.mixin(a,d.transportParams); -a.v=r.apiVersion;return a};k.inherits(c,y);c.httpTransports={};c.transports={};c.prototype.chooseTransport=function(a){d.logAction(d.LOG_MAJOR,"ConnectionManager.chooseTransport()","");if(this.activeProtocol)d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransport()","Transport already established"),a(null);else{var b=this.connectionKey?"resume":this.options.recover?"recover":"clean",c=new g(this.options,null,b,this.connectionKey,this.connectionSerial);d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransport()", -"Transport recovery mode = "+b+("clean"==b?"":"; connectionKey = "+this.connectionKey+"; connectionSerial = "+this.connectionSerial));var f=this;this.httpTransports.length?this.chooseHttpTransport(c,function(b,e){if(b)d.logAction(d.LOG_ERROR,"ConnectionManager.chooseTransport()","Unexpected error establishing transport; err = "+k.inspectError(b)),a(b);else if(d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransport()","Establishing http transport: "+e),a(null,e),f.upgradeTransports.length)e.once("connected", -function(a,b){k.nextTick(function(){d.logAction(d.LOG_MAJOR,"ConnectionManager.chooseTransport()","upgrading ... connectionKey = "+b);c=new g(f.options,c.host,"upgrade",b);f.chooseTransportForHost(c,f.upgradeTransports.slice(),n)})})}):(c.host=this.httpHosts[0],d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransport()","No http transports available; ignoring fallback hosts"),this.chooseTransportForHost(c,f.transports.slice(),a))}};c.prototype.chooseTransportForHost=function(a,b,f){var l=b.shift(); -if(l){var g=this;d.logAction(d.LOG_MICRO,"ConnectionManager.chooseTransportForHost()","trying "+l);c.transports[l].tryConnect(this,this.realtime.auth,a,function(c,n){var m=g.state;m==g.states.closing||m==g.states.closed||m==g.states.failed?(d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransportForHost()","connection closing"),n&&(d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransportForHost()","closing transport = "+n),n.close()),f(new p("Connection already closed",400,80017))):c?e(c)?f(c): -g.chooseTransportForHost(a,b,f):(d.logAction(d.LOG_MICRO,"ConnectionManager.chooseTransportForHost()","transport "+l+" connecting"),g.setTransportPending(n,a.mode),f(null,n))})}else f(new p("Unable to connect (no available transport)",8E4,404))};c.prototype.chooseHttpTransport=function(a,b){function d(){f.length?c.httpTransports[g.httpTransports[0]].checkConnectivity(function(c,l){c?b(c):l?(a.host=k.arrRandomElement(f),g.chooseTransportForHost(a,g.httpTransports.slice(),function(a,c){a?e(a)?b(a): -d():b(null,c)})):b(new p("Unable to connect (network unreachable)",8E4,404))}):b(new p("Unable to connect (no available host)",8E4,404))}var f=this.httpHosts.slice(),l=f.shift();if(l){a.host=l;var g=this;this.chooseTransportForHost(a,this.httpTransports.slice(),function(a,c){a?e(a)?b(a):d():b(null,c)})}else b(new p("Unable to connect (no available host)",8E4,404))};c.prototype.setTransportPending=function(a,b){d.logAction(d.LOG_MINOR,"ConnectionManager.setTransportPending()","transport = "+a+"; mode = "+ -b);this.pendingTransports.push(a);var c=this;a.on("connected",function(d,f,e,l,g){"upgrade"==b&&c.activeProtocol?c.scheduleTransportActivation(a):c.activateTransport(a,f,e,l,g)});for(var f=function(b){return function(d){c.deactivateTransport(a,b,d)}},e=["disconnected","closed","failed"],l=0;l=a?null:e.slice(0,a).join("/"),c.data=f}}};f.fromResponseBody=function(c,b,e,a){e&&(c="msgpack"==e?g.decode(c):JSON.parse(String(c)));for(e=0;ea.code:500>a.statusCode}function g(a){return f(a)||N.isTokenErr(a)}function c(a,b,e,c,d){this.options=a;this.host=b;this.mode=e;this.connectionKey=c;this.connectionSerial=d;this.format=a.useBinaryProtocol?"msgpack":"json"}function b(e, +c){y.call(this);this.realtime=e;this.options=c;var f=c.timeouts;this.states={initialized:{state:"initialized",terminal:!1,queueEvents:!0,sendEvents:!1},connecting:{state:"connecting",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:f.realtimeRequestTimeout,failState:"disconnected"},connected:{state:"connected",terminal:!1,queueEvents:!1,sendEvents:!0,failState:"disconnected"},synchronizing:{state:"connected",terminal:!1,queueEvents:!0,sendEvents:!1},disconnected:{state:"disconnected",terminal:!1, +queueEvents:!0,sendEvents:!1,retryDelay:f.disconnectedRetryTimeout},suspended:{state:"suspended",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:f.suspendedRetryTimeout},closing:{state:"closing",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:f.realtimeRequestTimeout,failState:"closed"},closed:{state:"closed",terminal:!0,queueEvents:!1,sendEvents:!1},failed:{state:"failed",terminal:!0,queueEvents:!1,sendEvents:!1}};this.state=this.states.initialized;this.errorReason=null;this.queuedMessages= +new ba;this.msgSerial=0;this.connectionSerial=this.connectionKey=this.connectionId=void 0;this.httpTransports=l.intersect(c.transports||r.httpTransports,b.httpTransports);this.transports=l.intersect(c.transports||r.transports,b.transports);this.upgradeTransports=l.arrSubtract(this.transports,this.httpTransports);this.httpHosts=r.getHosts(c);this.activeProtocol=null;this.pendingTransports=[];this.host=null;d.logAction(d.LOG_MINOR,"Realtime.ConnectionManager()","started");d.logAction(d.LOG_MICRO,"Realtime.ConnectionManager()", +"requested transports = ["+(c.transports||r.transports)+"]");d.logAction(d.LOG_MICRO,"Realtime.ConnectionManager()","available http transports = ["+this.httpTransports+"]");d.logAction(d.LOG_MICRO,"Realtime.ConnectionManager()","available transports = ["+this.transports+"]");d.logAction(d.LOG_MICRO,"Realtime.ConnectionManager()","http hosts = ["+this.httpHosts+"]");if(!this.transports.length)throw d.logAction(d.LOG_ERROR,"realtime.ConnectionManager()","no requested transports available"),Error("no requested transports available"); +a&&!0===c.recover&&window.addEventListener&&window.addEventListener("beforeunload",this.persistConnection.bind(this));if("object"===typeof window&&window.addEventListener){var h=this;window.addEventListener("online",function(){if(h.state==h.states.disconnected||h.state==h.states.suspended)d.logAction(d.LOG_MINOR,"ConnectionManager caught browser \u2018online\u2019 event","reattempting connection"),h.requestState({state:"connecting"})});window.addEventListener("offline",function(){h.state==h.states.connected&& +(d.logAction(d.LOG_MINOR,"ConnectionManager caught browser \u2018offline\u2019 event","disconnecting active transport"),h.disconnectAllTransports())})}}var e="undefined"!==typeof P&&P.read,a="undefined"!==typeof P&&P.create,h="undefined"!==typeof P&&P.erase,m=z.Action,p=ca.PendingMessage,n=function(){};c.prototype.getConnectParams=function(a){a=a?l.copy(a):{};var b=this.options;switch(this.mode){case "upgrade":a.upgrade=this.connectionKey;break;case "resume":a.resume=this.connectionKey;void 0!==this.connectionSerial&& +(a.connection_serial=this.connectionSerial);break;case "recover":if(!0===b.recover){var c=e("ably-connection-key"),d=e("ably-connection-serial");null!==c&&null!==d&&(a.recover=c,a.connection_serial=d)}else if(c=b.recover.match(/^(\w+):(\w+)$/))a.recover=c[1],a.connection_serial=c[2]}void 0!==b.clientId&&(a.clientId=b.clientId);!1===b.echoMessages&&(a.echo="false");void 0!==this.format&&(a.format=this.format);void 0!==this.stream&&(a.stream=this.stream);void 0!==b.transportParams&&l.mixin(a,b.transportParams); +a.v=r.apiVersion;return a};l.inherits(b,y);b.httpTransports={};b.transports={};b.prototype.chooseTransport=function(a){d.logAction(d.LOG_MAJOR,"ConnectionManager.chooseTransport()","");if(this.activeProtocol)d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransport()","Transport already established"),a(null);else{var b=this.connectionKey?"resume":this.options.recover?"recover":"clean",e=new c(this.options,null,b,this.connectionKey,this.connectionSerial);d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransport()", +"Transport recovery mode = "+b+("clean"==b?"":"; connectionKey = "+this.connectionKey+"; connectionSerial = "+this.connectionSerial));var f=this;this.httpTransports.length?this.chooseHttpTransport(e,function(b,h){if(b)d.logAction(d.LOG_ERROR,"ConnectionManager.chooseTransport()","Unexpected error establishing transport; err = "+l.inspectError(b)),a(b);else if(d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransport()","Establishing http transport: "+h),a(null,h),f.upgradeTransports.length)h.once("connected", +function(a,b){l.nextTick(function(){d.logAction(d.LOG_MAJOR,"ConnectionManager.chooseTransport()","upgrading ... connectionKey = "+b);e=new c(f.options,e.host,"upgrade",b);f.chooseTransportForHost(e,f.upgradeTransports.slice(),n)})})}):(e.host=this.httpHosts[0],d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransport()","No http transports available; ignoring fallback hosts"),this.chooseTransportForHost(e,f.transports.slice(),a))}};b.prototype.chooseTransportForHost=function(a,c,e){var f=c.shift(); +if(f){var h=this;d.logAction(d.LOG_MICRO,"ConnectionManager.chooseTransportForHost()","trying "+f);b.transports[f].tryConnect(this,this.realtime.auth,a,function(b,n){var m=h.state;m==h.states.closing||m==h.states.closed||m==h.states.failed?(d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransportForHost()","connection closing"),n&&(d.logAction(d.LOG_MINOR,"ConnectionManager.chooseTransportForHost()","closing transport = "+n),n.close()),e(new q("Connection already closed",400,80017))):b?g(b)?e(b): +h.chooseTransportForHost(a,c,e):(d.logAction(d.LOG_MICRO,"ConnectionManager.chooseTransportForHost()","transport "+f+" connecting"),h.setTransportPending(n,a.mode),e(null,n))})}else e(new q("Unable to connect (no available transport)",8E4,404))};b.prototype.chooseHttpTransport=function(a,c){function e(){d.length?b.httpTransports[h.httpTransports[0]].checkConnectivity(function(b,f){b?c(b):f?(a.host=l.arrPopRandomElement(d),h.chooseTransportForHost(a,h.httpTransports.slice(),function(a,b){a?g(a)?c(a): +e():c(null,b)})):c(new q("Unable to connect (network unreachable)",8E4,404))}):c(new q("Unable to connect (no available host)",8E4,404))}var d=this.httpHosts.slice(),f=d.shift();if(f){a.host=f;var h=this;this.chooseTransportForHost(a,this.httpTransports.slice(),function(a,b){a?g(a)?c(a):e():c(null,b)})}else c(new q("Unable to connect (no available host)",8E4,404))};b.prototype.setTransportPending=function(a,b){d.logAction(d.LOG_MINOR,"ConnectionManager.setTransportPending()","transport = "+a+"; mode = "+ +b);this.pendingTransports.push(a);var c=this;a.on("connected",function(e,d,f,h,n){"upgrade"==b&&c.activeProtocol?c.scheduleTransportActivation(a):c.activateTransport(a,d,f,h,n)});for(var e=function(b){return function(e){c.deactivateTransport(a,b,e)}},f=["disconnected","closed","failed"],h=0;hg||300<=g?(c=c&&c.error,c||(c=Error(String(res)),c.statusCode=g),a(c)):a(null,c,e,!0))}}}function b(a){var b=[];if(a)for(var c in a)b.push(c+"="+a[c]);return b.join("&")}function a(a,c,f,e){return function(g,k,t,u){g?d.logAction(d.LOG_MICRO,"Resource."+c+"()","Received Error; "+(f+(e?"?":"")+b(e))+"; Error: "+JSON.stringify(g)):d.logAction(d.LOG_MICRO,"Resource."+c+"()","Received; "+(f+(e?"?":"")+b(e))+"; Headers: "+b(t)+"; Body: "+(x.isBuffer(k)?k.toString():k));a&&a(g,k,t,u)}}var f= -"object"==typeof window?window.Ably.msgpack:(void 0)("msgpack-js");e.get=function(f,e,n,h,q,k){function t(a,c){d.shouldLog(d.LOG_MICRO)&&d.logAction(d.LOG_MICRO,"Resource.get()","Sending; "+(e+(c?"?":"")+b(c)));v.get(f,e,a,c,function(a,b,c,d){a&&O.isTokenErr(a)?f.auth.authorise(null,{force:!0},function(a){a?k(a):g(f,n,h,k,t)}):k(a,b,c,d)})}d.shouldLog(d.LOG_MICRO)&&(k=a(k,"get",e,h));q&&(k=k&&c(k,q),(h=h||{}).envelope=q);g(f,n,h,k,t)};e.post=function(e,m,n,h,k,w,t){function u(a,c){if(d.shouldLog(d.LOG_MICRO)){var w= -n;if(0<(a["content-type"]||"").indexOf("msgpack"))try{n=f.decode(n)}catch(p){d.logAction(d.LOG_MICRO,"Resource.post()","Sending MsgPack Decoding Error: "+JSON.stringify(p))}d.logAction(d.LOG_MICRO,"Resource.post()","Sending; "+(m+(c?"?":"")+b(c))+"; Body: "+w)}v.post(e,m,a,n,c,function(a,b,c,d){a&&O.isTokenErr(a)?e.auth.authorise(null,{force:!0},function(a){a?t(a):g(e,h,k,t,u)}):t(a,b,c,d)})}d.shouldLog(d.LOG_MICRO)&&(t=a(t,"post",m,k));w&&(t=c(t,w),k.envelope=w);g(e,h,k,t,u)};return e}(),R=function(){function e(c, -b,a,d,e){this.rest=c;this.path=b;this.headers=a;this.envelope=d;this.bodyHandler=e}function g(c,b,a){this.resource=c;this.items=b;var d=this;"first"in a&&(this.first=function(b){d.get(a.first,b)});"current"in a&&(this.current=function(b){d.get(a.current,b)});this.next=function(b){"next"in a?d.get(a.next,b):b(null,null)};this.hasNext=function(){return"next"in a};this.isLast=function(){return!this.hasNext()}}e.prototype.get=function(c,b){var a=this;Y.get(a.rest,a.path,a.headers,c,a.envelope,function(c, -d,e,g){a.handlePage(c,d,e,g,b)})};e.prototype.handlePage=function(c,b,a,f,e){if(c)d.logAction(d.LOG_ERROR,"PaginatedResource.get()","Unexpected error getting resource: err = "+JSON.stringify(c)),e(c);else{var m,n,h;try{m=this.bodyHandler(b,a,f)}catch(q){e(q);return}if(a&&(n=a.Link||a.link)){c=n;"string"==typeof c&&(c=c.split(","));b={};for(a=0;a;\s*rel="(\w+)"$/))&&(n=(n=f[1].match(/^\.\/(\w+)\?(.*)$/))&&k.parseQueryString(n[2]))&&(b[f[2]]=n);h=b}e(null,new g(this, -m,h))}};g.prototype.get=function(c,b){var a=this.resource;Y.get(a.rest,a.path,a.headers,c,a.envelope,function(c,d,e,g){a.handlePage(c,d,e,g,b)})};return e}(),O=function(){function e(){}function g(a){if(!a)return"";"string"==typeof a&&(a=JSON.parse(a));var b={},c=k.keysArray(a,!0);if(!c)return"";c.sort();for(var d=0;d=g){if(!b||!b.force){d.logAction(d.LOG_MINOR,"Auth.getToken()", -"using cached token; expires = "+e.expires);c(null,e);return}}else d.logAction(d.LOG_MINOR,"Auth.getToken()","deleting expired token"),f.tokenDetails=null;l()}):l()};c.prototype.requestToken=function(a,b,c){"function"!=typeof a||c?"function"!=typeof b||c||(c=b,b=null):(c=a,b=a=null);b=k.mixin(k.copy(this.client.options),b);a=a||k.copy(this.tokenParams);c=c||e;var l=b.format||"json",m,u=this.client;if(b.authCallback)d.logAction(d.LOG_MINOR,"Auth.requestToken()","using token auth with auth_callback"), -m=b.authCallback;else if(b.authUrl)d.logAction(d.LOG_MINOR,"Auth.requestToken()","using token auth with auth_url"),b.authParams||(m=b.authUrl.indexOf("?"),-1a.code};return c}(),G=function(){function e(b){if(!(this instanceof e))return new e(b);if(!b){var a="no options provided";d.logAction(d.LOG_ERROR,"Rest()",a);throw Error(a);}"string"==typeof b&&(b=-1==b.indexOf(":")?{token:b}:{key:b});this.options=r.normaliseOptions(b); -x.supportsBinary&&!0===this.options.useBinaryProtocol||(this.options.useBinaryProtocol=!1);if(b.key){a=b.key.match(/^([^:\s]+):([^:.\s]+)$/);if(!a)throw a="invalid key parameter",d.logAction(d.LOG_ERROR,"Rest()",a),Error(a);b.keyName=a[1];b.keySecret=a[2]}if("clientId"in b){if("string"!==typeof b.clientId&&null!==b.clientId)throw new p("clientId must be either a string or null",40012,400);if("*"===b.clientId)throw new p('Can\u2019t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: "*"}})', -40012,400);}b.log&&d.setLog(b.log.level,b.log.handler);d.logAction(d.LOG_MINOR,"Rest()","started");this.baseUri=this.authority=function(a){return r.getHttpScheme(b)+a+":"+r.getPort(b,!1)};this.serverTimeOffset=null;this.auth=new O(this,b);this.channels=new g(this)}function g(b){this.rest=b;this.attached={}}var c=function(){};e.prototype.stats=function(b,a){void 0===a&&("function"==typeof b?(a=b,b=null):a=c);var d=k.copy(k.defaultGetHeaders()),e=v.supportsLinkHeaders?void 0:"json";this.options.headers&& -k.mixin(d,this.options.headers);(new R(this,"/stats",d,e,function(a,b,c){a=c?a:JSON.parse(a);for(b=0;ba.statusCode?g.complete(null,b,a.headers):(a=b.error||new p("Error response received from server",5E4,a.statusCode),g.complete(a)):g.complete(new p("Invalid server response: no envelope detected", -5E4,500))}else g.complete(null,a)};this.timer=setTimeout(function(){g.abort()},this.requestMode==M.REQ_SEND?this.timeouts.httpRequestTimeout:this.timeouts.recvTimeout);f.insertBefore(c,f.firstChild)};g.prototype.complete=function(a,b,c){c=c||{};this.requestComplete||(this.requestComplete=!0,b&&(c["content-type"]="string"==typeof b?"text/plain":"application/json",this.emit("data",b)),this.emit("complete",a,b,c,!0),this.dispose())};g.prototype.abort=function(){this.dispose()};g.prototype.dispose=function(){var a= -this.timer;a&&(clearTimeout(a),this.timer=null);a=this.script;a.parentNode&&a.parentNode.removeChild(a);delete b[this.id];this.emit("disposed")};v.Request=function(a,b,c,d,e){var f=m(a,b,c,d,M.REQ_SEND);f.once("complete",e);k.nextTick(function(){f.exec()});return f};return e})();var da=function(){function e(){for(var a in f)f[a].dispose()}function g(){return l=window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}function c(b,c,d,e,g,l){y.call(this);d=d||{};d.rnd=k.randStr();var n,p;if(p= -m)p=n=(n=navigator.userAgent.toString().match(/MSIE\s([\d.]+)/))&&Number(n[1]);p&&10===n&&!d.envelope&&(d.envelope="json");this.uri=b+k.toQueryString(d);this.headers=c||{};this.body=e;this.requestMode=g;this.timeouts=l;this.requestComplete=!1;f[this.id=String(++a)]=this}var b=function(){},a=0,f={},l,m=window.XDomainRequest;k.inherits(c,y);c.isAvailable=g;var n=c.createRequest=function(a,b,d,e,f){var g=this&&this.timeouts||r.TIMEOUTS;return new c(a,b,k.copy(d),e,f,g)};c.prototype.complete=function(a, -b,c,d){this.requestComplete||(this.requestComplete=!0,b&&this.emit("data",b),this.emit("complete",a,b,c,d),this.dispose())};c.prototype.abort=function(){this.dispose()};c.prototype.exec=function(){function a(){v=l.responseText;for(var b=v.length-1,c,d;Cd)&&0!==l.status){if(void 0=== -A)if(A=l.status,1223===A&&(A=204),clearTimeout(c),B=400>A,204==A)m.complete();else{var e;if(e=3==m.requestMode&&B)e=l,e=e.getResponseHeader&&e.getResponseHeader("transfer-encoding")&&!e.getResponseHeader("content-length");z=e}if(3==d&&z)a();else if(4==d)if(z)b();else a:{try{var f=l.getResponseHeader&&l.getResponseHeader("content-type"),d=null,g=f?"application/json"==f:"text"==l.responseType;v=g?l.responseText:l.response;if(!v){204!=status&&(n=Error("Incomplete response body from server"),n.statusCode= -400,m.complete(n));break a}g&&(v=JSON.parse(String(v)),D=!0);void 0!==v.response&&(A=v.statusCode,B=400>A,d=v.headers,v=v.response)}catch(k){var n=Error("Malformed response body from server: "+k.message);n.statusCode=400;m.complete(n);break a}B?m.complete(null,v,d||f&&{"content-type":f},D):(n=v.error,n||(n=Error("Error response received from server: "+A),n.statusCode=A),m.complete(n))}}};l.send(e)};c.prototype.dispose=function(){var a=this.xhr;if(a){a.onreadystatechange=a.onerror=a.onabort=a.ontimeout= -b;this.xhr=null;var c=this.timer;c&&(clearTimeout(c),this.timer=null);this.requestComplete||a.abort()}delete f[this.id]};g()&&(fa.addUnloadListener(e),"undefined"!==typeof v&&(v.supportsAuthHeaders=l,v.Request=function(a,b,c,d,e){a=n(a,b,c,d,0);a.once("complete",e);a.exec();return a}));return c}();(function(){function e(d,c,b){M.call(this,d,c,b)}k.inherits(e,M);e.isAvailable=da.isAvailable;e.checkConnectivity=function(e){var c=r.internetUpUrlWithoutExtension+".txt";d.logAction(d.LOG_MICRO,"XHRTransport.checkConnectivity()", -"Sending; "+c);v.Request(c,null,null,null,function(b,a){var c=!b&&"yes"==a.replace(/\n/,"");d.logAction(d.LOG_MICRO,"XHRTransport.checkConnectivity()","Result: "+c);e(null,c)})};e.tryConnect=function(g,c,b,a){var f=new e(g,c,b),k=function(b){a(b)};f.on("error",k);f.on("preconnect",function(){d.logAction(d.LOG_MINOR,"XHRTransport.tryConnect()","viable transport "+f);f.off("error",k);a(null,f)});f.connect()};e.prototype.toString=function(){return"XHRTransport; uri="+this.baseUri+"; isConnected="+this.isConnected}; -e.prototype.createRequest=da.createRequest;"undefined"!==typeof F&&e.isAvailable()&&(F.httpTransports.xhr=F.transports.xhr=e);return e})();"undefined"!==typeof H&&(Z.Rest=G,Z.Realtime=H,H.ConnectionManager=F,H.BufferUtils=G.BufferUtils=x,"undefined"!==typeof Q&&(H.Crypto=G.Crypto=Q),H.Defaults=G.Defaults=r,H.Http=G.Http=v,H.Utils=G.Utils=k,H.Http=G.Http=v,H.Message=G.Message=C,H.PresenceMessage=G.PresenceMessage=D,H.ProtocolMessage=G.ProtocolMessage=z)}).call({}); +"ConnectionManager.scheduleTransportActivation()","Syncing transport; transport = "+a),b.sync(a,function(c,e,f){c?d.logAction(d.LOG_ERROR,"ConnectionManager.scheduleTransportActivation()","Unexpected error attempting to sync transport; transport = "+a+"; err = "+c):(d.logAction(d.LOG_MINOR,"ConnectionManager.scheduleTransportActivation()","sync successful upgraded transport; transport = "+a+"; connectionSerial = "+e+"; connectionId = "+f),d.logAction(d.LOG_MINOR,"ConnectionManager.scheduleTransportActivation()", +"Sending queued messages on upgraded transport; transport = "+a),b.state===b.states.synchronizing&&(b.state=b.states.connected),b.state.sendEvents&&b.sendQueuedMessages())})))})};b.prototype.activateTransport=function(a,b,c,e,f){d.logAction(d.LOG_MINOR,"ConnectionManager.activateTransport()","transport = "+a);b&&d.logAction(d.LOG_MICRO,"ConnectionManager.activateTransport()","connectionKey = "+b);void 0!==c&&d.logAction(d.LOG_MICRO,"ConnectionManager.activateTransport()","connectionSerial = "+c); +e&&d.logAction(d.LOG_MICRO,"ConnectionManager.activateTransport()","connectionId = "+e);f&&d.logAction(d.LOG_MICRO,"ConnectionManager.activateTransport()","clientId = "+f);var h=this.state;d.logAction(d.LOG_MINOR,"ConnectionManager.activateTransport()","current state = "+h.state);if(h.state==this.states.closing.state||h.state==this.states.closed.state)return!1;l.arrDeleteValue(this.pendingTransports,a);if(!a.isConnected)return d.logAction(d.LOG_MINOR,"ConnectionManager.activateTransport()","Declining to activate transport "+ +a+" since it appears to no longer be connected"),!1;var n=this.activeProtocol;this.activeProtocol=new ca(a);this.host=a.params.host;b&&this.connectionKey!=b&&this.setConnection(e,b,c);c=this.realtime.auth;if(f&&"*"!==f){if(c.clientId&&c.clientId!=f){b=new q("Unexpected mismatch between expected and received clientId",40102,401);d.logAction(d.LOG_ERROR,"ConnectionManager.activateTransport()","Unexpected mismatch between expected and received clientId");a.abort(b);return}c.clientId=f}this.emit("transport.active", +a,b,a.params);h!==this.states.connected&&(this.notifyState({state:"connected"}),this.errorReason=null,this.realtime.connection.errorReason=null);n&&n.finish();for(a=0;ag||300<=g?(e=e&&e.error,e||(e=Error(String(res)),e.statusCode=g),b(e)):b(null,e,f,!0))}}}function b(a){var b=[];if(a)for(var c in a)b.push(c+"="+a[c]);return b.join("&")}function e(a,c,e,f){return function(k,g,l, +u){k?d.logAction(d.LOG_MICRO,"Resource."+c+"()","Received Error; "+(e+(f?"?":"")+b(f))+"; Error: "+JSON.stringify(k)):d.logAction(d.LOG_MICRO,"Resource."+c+"()","Received; "+(e+(f?"?":"")+b(f))+"; Headers: "+b(l)+"; Body: "+(x.isBuffer(g)?g.toString():g));a&&a(k,g,l,u)}}var a="object"==typeof window?window.Ably.msgpack:(void 0)("msgpack-js");f.get=function(a,f,p,n,k,l){function t(c,e){d.shouldLog(d.LOG_MICRO)&&d.logAction(d.LOG_MICRO,"Resource.get()","Sending; "+(f+(e?"?":"")+b(e)));w.get(a,f,c,e, +function(b,c,e,d){b&&N.isTokenErr(b)?a.auth.authorise(null,{force:!0},function(b){b?l(b):g(a,p,n,l,t)}):l(b,c,e,d)})}d.shouldLog(d.LOG_MICRO)&&(l=e(l,"get",f,n));k&&(l=l&&c(l,k),(n=n||{}).envelope=k);g(a,p,n,l,t)};f.post=function(f,m,p,n,k,l,t){function u(c,e){if(d.shouldLog(d.LOG_MICRO)){var l=p;if(0<(c["content-type"]||"").indexOf("msgpack"))try{p=a.decode(p)}catch(v){d.logAction(d.LOG_MICRO,"Resource.post()","Sending MsgPack Decoding Error: "+JSON.stringify(v))}d.logAction(d.LOG_MICRO,"Resource.post()", +"Sending; "+(m+(e?"?":"")+b(e))+"; Body: "+l)}w.post(f,m,c,p,e,function(a,b,c,e){a&&N.isTokenErr(a)?f.auth.authorise(null,{force:!0},function(a){a?t(a):g(f,n,k,t,u)}):t(a,b,c,e)})}d.shouldLog(d.LOG_MICRO)&&(t=e(t,"post",m,k));l&&(t=c(t,l),k.envelope=l);g(f,n,k,t,u)};return f}(),S=function(){function f(c,b,e,a,d){this.rest=c;this.path=b;this.headers=e;this.envelope=a;this.bodyHandler=d}function g(c,b,e){this.resource=c;this.items=b;var a=this;"first"in e&&(this.first=function(b){a.get(e.first,b)}); +"current"in e&&(this.current=function(b){a.get(e.current,b)});this.next=function(b){"next"in e?a.get(e.next,b):b(null,null)};this.hasNext=function(){return"next"in e};this.isLast=function(){return!this.hasNext()}}f.prototype.get=function(c,b){var e=this;Y.get(e.rest,e.path,e.headers,c,e.envelope,function(a,c,d,f){e.handlePage(a,c,d,f,b)})};f.prototype.handlePage=function(c,b,e,a,f){if(c)d.logAction(d.LOG_ERROR,"PaginatedResource.get()","Unexpected error getting resource: err = "+JSON.stringify(c)), +f(c);else{var m,p,n;try{m=this.bodyHandler(b,e,a)}catch(k){f(k);return}if(e&&(p=e.Link||e.link)){c=p;"string"==typeof c&&(c=c.split(","));b={};for(e=0;e;\s*rel="(\w+)"$/))&&(p=(p=a[1].match(/^\.\/(\w+)\?(.*)$/))&&l.parseQueryString(p[2]))&&(b[a[2]]=p);n=b}f(null,new g(this,m,n))}};g.prototype.get=function(c,b){var e=this.resource;Y.get(e.rest,e.path,e.headers,c,e.envelope,function(a,c,d,f){e.handlePage(a,c,d,f,b)})};return f}(),N=function(){function f(){}function g(a){if(!a)return""; +"string"==typeof a&&(a=JSON.parse(a));var b={},c=l.keysArray(a,!0);if(!c)return"";c.sort();for(var e=0;e=m){if(!b||!b.force){d.logAction(d.LOG_MINOR,"Auth.getToken()","using cached token; expires = "+f.expires);c(null,f);return}}else d.logAction(d.LOG_MINOR,"Auth.getToken()","deleting expired token"),e.tokenDetails=null;h()}):h()};c.prototype.requestToken=function(b,c,e){"function"!= +typeof b||e?"function"!=typeof c||e||(e=c,c=null):(e=b,c=b=null);c=l.mixin(l.copy(this.client.options),c);b=b||l.copy(this.tokenParams);e=e||f;var h=c.format||"json",m,u=this.client;if(c.authCallback)d.logAction(d.LOG_MINOR,"Auth.requestToken()","using token auth with auth_callback"),m=c.authCallback;else if(c.authUrl)d.logAction(d.LOG_MINOR,"Auth.requestToken()","using token auth with auth_url"),c.authParams||(m=c.authUrl.indexOf("?"),-1a.code};return c}(),H=function(){function f(b){if(!(this instanceof f))return new f(b);if(!b){var c="no options provided";d.logAction(d.LOG_ERROR,"Rest()",c);throw Error(c);}"string"==typeof b&&(b=-1==b.indexOf(":")?{token:b}:{key:b});this.options=r.normaliseOptions(b);x.supportsBinary&&!0===this.options.useBinaryProtocol||(this.options.useBinaryProtocol=!1);if(b.key){c=b.key.match(/^([^:\s]+):([^:.\s]+)$/);if(!c)throw c="invalid key parameter",d.logAction(d.LOG_ERROR,"Rest()",c),Error(c); +b.keyName=c[1];b.keySecret=c[2]}if("clientId"in b){if("string"!==typeof b.clientId&&null!==b.clientId)throw new q("clientId must be either a string or null",40012,400);if("*"===b.clientId)throw new q('Can\u2019t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: "*"}})',40012,400);}b.log&&d.setLog(b.log.level,b.log.handler);d.logAction(d.LOG_MINOR,"Rest()","started");this.baseUri=this.authority= +function(a){return r.getHttpScheme(b)+a+":"+r.getPort(b,!1)};this.serverTimeOffset=null;this.auth=new N(this,b);this.channels=new g(this)}function g(b){this.rest=b;this.attached={}}var c=function(){};f.prototype.stats=function(b,e){void 0===e&&("function"==typeof b?(e=b,b=null):e=c);var a=l.copy(l.defaultGetHeaders()),d=w.supportsLinkHeaders?void 0:"json";this.options.headers&&l.mixin(a,this.options.headers);(new S(this,"/stats",a,d,function(a,b,c){a=c?a:JSON.parse(a);for(b=0;ba.statusCode?g.complete(null,b,a.headers):(a=b.error||new q("Error response received from server",5E4,a.statusCode),g.complete(a)):g.complete(new q("Invalid server response: no envelope detected", +5E4,500))}else g.complete(null,a)};this.timer=setTimeout(function(){g.abort()},this.requestMode==O.REQ_SEND?this.timeouts.httpRequestTimeout:this.timeouts.recvTimeout);a.insertBefore(d,a.firstChild)};g.prototype.complete=function(a,b,c){c=c||{};this.requestComplete||(this.requestComplete=!0,b&&(c["content-type"]="string"==typeof b?"text/plain":"application/json",this.emit("data",b)),this.emit("complete",a,b,c,!0),this.dispose())};g.prototype.abort=function(){this.dispose()};g.prototype.dispose=function(){var a= +this.timer;a&&(clearTimeout(a),this.timer=null);a=this.script;a.parentNode&&a.parentNode.removeChild(a);delete b[this.id];this.emit("disposed")};w.Request=function(a,b,c,d,e){var f=m(a,b,c,d,O.REQ_SEND);f.once("complete",e);l.nextTick(function(){f.exec()});return f};return f})();var da=function(){function f(){for(var b in a)a[b].dispose()}function g(){return h=window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}function c(b,c,d,f,g,h){y.call(this);d=d||{};d.rnd=l.randStr();var p,q;if(q= +m)q=p=(p=navigator.userAgent.toString().match(/MSIE\s([\d.]+)/))&&Number(p[1]);q&&10===p&&!d.envelope&&(d.envelope="json");this.uri=b+l.toQueryString(d);this.headers=c||{};this.body=f;this.requestMode=g;this.timeouts=h;this.requestComplete=!1;a[this.id=String(++e)]=this}var b=function(){},e=0,a={},h,m=window.XDomainRequest;l.inherits(c,y);c.isAvailable=g;var p=c.createRequest=function(a,b,d,e,f){var g=this&&this.timeouts||r.TIMEOUTS;return new c(a,b,l.copy(d),e,f,g)};c.prototype.complete=function(a, +b,c,d){this.requestComplete||(this.requestComplete=!0,b&&this.emit("data",b),this.emit("complete",a,b,c,d),this.dispose())};c.prototype.abort=function(){this.dispose()};c.prototype.exec=function(){function a(){w=h.responseText;for(var b=w.length-1,c,d;Cd)&&0!==h.status){if(void 0=== +A)if(A=h.status,1223===A&&(A=204),clearTimeout(c),B=400>A,204==A)m.complete();else{var e;if(e=3==m.requestMode&&B)e=h,e=e.getResponseHeader&&e.getResponseHeader("transfer-encoding")&&!e.getResponseHeader("content-length");z=e}if(3==d&&z)a();else if(4==d)if(z)b();else a:{try{var f=h.getResponseHeader&&h.getResponseHeader("content-type"),d=null,g=f?"application/json"==f:"text"==h.responseType;w=g?h.responseText:h.response;if(!w){204!=status&&(p=Error("Incomplete response body from server"),p.statusCode= +400,m.complete(p));break a}g&&(w=JSON.parse(String(w)),E=!0);void 0!==w.response&&(A=w.statusCode,B=400>A,d=w.headers,w=w.response)}catch(l){var p=Error("Malformed response body from server: "+l.message);p.statusCode=400;m.complete(p);break a}B?m.complete(null,w,d||f&&{"content-type":f},E):(p=w.error,p||(p=Error("Error response received from server: "+A),p.statusCode=A),m.complete(p))}}};h.send(e)};c.prototype.dispose=function(){var c=this.xhr;if(c){c.onreadystatechange=c.onerror=c.onabort=c.ontimeout= +b;this.xhr=null;var d=this.timer;d&&(clearTimeout(d),this.timer=null);this.requestComplete||c.abort()}delete a[this.id]};g()&&(fa.addUnloadListener(f),"undefined"!==typeof w&&(w.supportsAuthHeaders=h,w.Request=function(a,b,c,d,e){a=p(a,b,c,d,0);a.once("complete",e);a.exec();return a}));return c}();(function(){function f(d,c,b){O.call(this,d,c,b)}l.inherits(f,O);f.isAvailable=da.isAvailable;f.checkConnectivity=function(f){var c=r.internetUpUrlWithoutExtension+".txt";d.logAction(d.LOG_MICRO,"XHRTransport.checkConnectivity()", +"Sending; "+c);w.Request(c,null,null,null,function(b,c){var a=!b&&"yes"==c.replace(/\n/,"");d.logAction(d.LOG_MICRO,"XHRTransport.checkConnectivity()","Result: "+a);f(null,a)})};f.tryConnect=function(g,c,b,e){var a=new f(g,c,b),h=function(a){e(a)};a.on("error",h);a.on("preconnect",function(){d.logAction(d.LOG_MINOR,"XHRTransport.tryConnect()","viable transport "+a);a.off("error",h);e(null,a)});a.connect()};f.prototype.toString=function(){return"XHRTransport; uri="+this.baseUri+"; isConnected="+this.isConnected}; +f.prototype.createRequest=da.createRequest;"undefined"!==typeof G&&f.isAvailable()&&(G.httpTransports.xhr=G.transports.xhr=f);return f})();"undefined"!==typeof I&&(Z.Rest=H,Z.Realtime=I,I.ConnectionManager=G,I.BufferUtils=H.BufferUtils=x,"undefined"!==typeof R&&(I.Crypto=H.Crypto=R),I.Defaults=H.Defaults=r,I.Http=H.Http=w,I.Utils=H.Utils=l,I.Http=H.Http=w,I.Message=H.Message=C,I.PresenceMessage=H.PresenceMessage=E,I.ProtocolMessage=H.ProtocolMessage=z)}).call({}); diff --git a/browser/static/ably.noencryption.js b/browser/static/ably.noencryption.js index 2318796c42..ec435e695b 100644 --- a/browser/static/ably.noencryption.js +++ b/browser/static/ably.noencryption.js @@ -1,7 +1,7 @@ /** * @license Copyright 2016, Ably * - * Ably JavaScript Library v0.8.16 + * Ably JavaScript Library v0.8.17 * https://github.com/ably/ably-js * * Ably Realtime Messaging @@ -2566,7 +2566,7 @@ Defaults.TIMEOUTS = { }; Defaults.httpMaxRetryCount = 3; -Defaults.version = '0.8.16'; +Defaults.version = '0.8.17'; Defaults.apiVersion = '0.8'; Defaults.getHost = function(options, host, ws) { @@ -3197,8 +3197,8 @@ var Utils = (function() { }; }; - Utils.arrRandomElement = function(arr) { - return arr.splice(Math.floor(Math.random() * arr.length)); + Utils.arrPopRandomElement = function(arr) { + return arr.splice(Math.floor(Math.random() * arr.length), 1)[0]; }; Utils.toQueryString = function(params) { @@ -3963,6 +3963,10 @@ var ConnectionManager = (function() { return err.statusCode < 500; } + function isFatalOrTokenErr(err) { + return isFatalErr(err) || Auth.isTokenErr(err); + } + function TransportParams(options, host, mode, connectionKey, connectionSerial) { this.options = options; this.host = host; @@ -4182,8 +4186,11 @@ var ConnectionManager = (function() { return; } if(err) { - /* a 4XX error, such as 401, signifies that there is an error that will not be resolved by another transport */ - if(isFatalErr(err)) { + /* a 4XX error, such as 401, signifies that there is an error that will + * not be resolved by another transport. Token errors are included as + * another transport won't help; need to callback(err) to let the + * connectErr handler in connectImpl deal with it */ + if(isFatalOrTokenErr(err)) { callback(err); return; } @@ -4237,10 +4244,10 @@ var ConnectionManager = (function() { /* the network is there, so there's a problem with the main host, or * its dns. Try the fallback hosts. We could try them simultaneously but * that would potentially cause a huge spike in load on the load balancer */ - transportParams.host = Utils.arrRandomElement(candidateHosts); + transportParams.host = Utils.arrPopRandomElement(candidateHosts); self.chooseTransportForHost(transportParams, self.httpTransports.slice(), function(err, httpTransport) { if(err) { - if(isFatalErr(err)) { + if(isFatalOrTokenErr(err)) { callback(err); return; } @@ -4255,7 +4262,7 @@ var ConnectionManager = (function() { this.chooseTransportForHost(transportParams, this.httpTransports.slice(), function(err, httpTransport) { if(err) { - if(isFatalErr(err)) { + if(isFatalOrTokenErr(err)) { callback(err); return; } @@ -4332,8 +4339,17 @@ var ConnectionManager = (function() { Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.scheduleTransportActivation()', 'sync successful upgraded transport; transport = ' + transport + '; connectionSerial = ' + connectionSerial + '; connectionId = ' + connectionId); Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.scheduleTransportActivation()', 'Sending queued messages on upgraded transport; transport = ' + transport); - self.state = self.states.connected; - self.sendQueuedMessages(); + /* Restore pre-sync state. If state has changed in the meantime, + * don't touch it -- since the websocket transport waits a tick before + * disposing itself, it's possible for it to have happily synced + * without err while, unknown to it, the connection has closed in the + * meantime and the ws transport is scheduled for death */ + if(self.state === self.states.synchronizing) { + self.state = self.states.connected; + } + if(self.state.sendEvents) { + self.sendQueuedMessages(); + } }); } }); @@ -4362,12 +4378,20 @@ var ConnectionManager = (function() { /* if the connectionmanager moved to the closing/closed state before this * connection event, then we won't activate this transport */ var existingState = this.state; - if(existingState == this.states.closing || existingState == this.states.closed) + Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.activateTransport()', 'current state = ' + existingState.state); + if(existingState.state == this.states.closing.state || existingState.state == this.states.closed.state) return false; /* remove this transport from pending transports */ Utils.arrDeleteValue(this.pendingTransports, transport); + /* if the transport is not connected (eg because it failed during a + * scheduleTransportActivation#onceNoPending wait) then don't activate it */ + if(!transport.isConnected) { + Logger.logAction(Logger.LOG_MINOR, 'ConnectionManager.activateTransport()', 'Declining to activate transport ' + transport + ' since it appears to no longer be connected'); + return false; + } + /* the given transport is connected; this will immediately * take over as the active transport */ var existingActiveProtocol = this.activeProtocol; @@ -4712,7 +4736,8 @@ var ConnectionManager = (function() { var self = this; var auth = this.realtime.auth; var connectErr = function(err) { - Logger.logAction(Logger.LOG_ERROR, 'ConnectionManager.connectImpl()', 'Connection attempt failed with error; err = ' + ErrorInfo.fromValues(err).toString()); + err = ErrorInfo.fromValues(err); + Logger.logAction(Logger.LOG_ERROR, 'ConnectionManager.connectImpl()', 'Connection attempt failed with error; err = ' + err.toString()); var state = self.state; if(state == self.states.closing || state == self.states.closed || state == self.states.failed) { /* do nothing */ @@ -5073,14 +5098,10 @@ var Transport = (function() { break; case actions.ERROR: var msgErr = message.error; - Logger.logAction(Logger.LOG_ERROR, 'Transport.onProtocolMessage()', 'error; connectionKey = ' + this.connectionManager.connectionKey + '; err = ' + JSON.stringify(msgErr)); + Logger.logAction(Logger.LOG_ERROR, 'Transport.onProtocolMessage()', 'error; connectionKey = ' + this.connectionManager.connectionKey + '; err = ' + JSON.stringify(msgErr) + (message.channel ? (', channel: ' + message.channel) : '')); if(message.channel === undefined) { /* a transport error */ - var err = { - statusCode: msgErr.statusCode, - code: msgErr.code, - message: msgErr.message - }; + var err = ErrorInfo.fromValues(msgErr); this.abort(err); break; } @@ -5571,11 +5592,11 @@ var CometTransport = (function() { })(); var Presence = (function() { + function noop() {} function Presence(channel) { this.channel = channel; this.basePath = channel.basePath + '/presence'; } - Utils.inherits(Presence, EventEmitter); Presence.prototype.get = function(params, callback) { @@ -7392,6 +7413,15 @@ var RealtimePresence = (function() { return realtimePresence.channel.realtime.auth.clientId; } + function isAnonymous(realtimePresence) { + var realtime = realtimePresence.channel.realtime; + /* If not currently connected, we can't assume that we're an anonymous + * client, as realtime may inform us of our clientId in the CONNECTED + * message. So assume we're not anonymous and leave it to realtime to + * return an error if we are */ + return !realtime.auth.clientId && realtime.connection.state === 'connected'; + } + function waitAttached(channel, callback, action) { switch(channel.state) { case 'attached': @@ -7419,14 +7449,14 @@ var RealtimePresence = (function() { Utils.inherits(RealtimePresence, Presence); RealtimePresence.prototype.enter = function(data, callback) { - if(!getClientId(this)) + if(isAnonymous(this)) throw new ErrorInfo('clientId must be specified to enter a presence channel', 40012, 400); this._enterOrUpdateClient(undefined, data, callback, 'enter'); }; RealtimePresence.prototype.update = function(data, callback) { - if(!getClientId(this)) - throw new Error('clientId must be specified to update presence data', 40012, 400); + if(isAnonymous(this)) + throw new ErrorInfo('clientId must be specified to update presence data', 40012, 400); this._enterOrUpdateClient(undefined, data, callback, 'update'); }; @@ -7488,7 +7518,7 @@ var RealtimePresence = (function() { }; RealtimePresence.prototype.leave = function(data, callback) { - if(!getClientId(this)) + if(isAnonymous(this)) throw new ErrorInfo('clientId must have been specified to enter or leave a presence channel', 40012, 400); this.leaveClient(undefined, data, callback); }; diff --git a/browser/static/ably.noencryption.min.js b/browser/static/ably.noencryption.min.js index 2284bbefc6..77e704ddca 100644 --- a/browser/static/ably.noencryption.min.js +++ b/browser/static/ably.noencryption.min.js @@ -1,7 +1,7 @@ /* Copyright 2016, Ably - Ably JavaScript Library v0.8.16 + Ably JavaScript Library v0.8.17 https://github.com/ably/ably-js Ably Realtime Messaging @@ -9,224 +9,225 @@ Released under the Apache Licence v2.0 */ -(function(){var U=window.Ably=this,F=F||function(e,c){var d={},b=d.lib={},a=b.Base=function(){function a(){}return{extend:function(k){a.prototype=this;var g=new a;k&&g.mixIn(k);g.hasOwnProperty("init")||(g.init=function(){g.$super.init.apply(this,arguments)});g.init.prototype=g;g.$super=this;return g},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var k in a)a.hasOwnProperty(k)&&(this[k]=a[k]);a.hasOwnProperty("toString")&&(this.toString= -a.toString)},clone:function(){return this.init.prototype.extend(this)}}}(),g=b.WordArray=a.extend({init:function(a,k){a=this.words=a||[];this.sigBytes=k!=c?k:4*a.length},toString:function(a){return(a||m).stringify(this)},concat:function(a){var k=this.words,g=a.words,d=this.sigBytes;a=a.sigBytes;this.clamp();if(d%4)for(var b=0;b>>2]|=(g[b>>>2]>>>24-b%4*8&255)<<24-(d+b)%4*8;else if(65535>>2]=g[b>>>2];else k.push.apply(k,g);this.sigBytes+=a;return this}, -clamp:function(){var a=this.words,k=this.sigBytes;a[k>>>2]&=4294967295<<32-k%4*8;a.length=e.ceil(k/4)},clone:function(){var k=a.clone.call(this);k.words=this.words.slice(0);return k},random:function(a){for(var k=[],d=function(a){var k=987654321;return function(){k=36969*(k&65535)+(k>>16)&4294967295;a=18E3*(a&65535)+(a>>16)&4294967295;var g=(k<<16)+a&4294967295,g=g/4294967296+.5;return g*(.5>>2]>>>24-d%4*8&255;g.push((b>>>4).toString(16));g.push((b&15).toString(16))}return g.join("")},parse:function(a){for(var k=a.length,d=[],b=0;b>>3]|=parseInt(a.substr(b,2),16)<<24-b%8*4;return new g.init(d,k/2)}},n=h.Latin1={stringify:function(a){var k=a.words;a=a.sigBytes;for(var g=[],d=0;d>>2]>>>24-d%4*8&255));return g.join("")}, -parse:function(a){for(var k=a.length,d=[],b=0;b>>2]|=(a.charCodeAt(b)&255)<<24-b%4*8;return new g.init(d,k)}},k=h.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(k){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},r=b.BufferedBlockAlgorithm=a.extend({reset:function(){this._data=new g.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=k.parse(a));this._data.concat(a);this._nDataBytes+= -a.sigBytes},_process:function(a){var k=this._data,d=k.words,b=k.sigBytes,r=this.blockSize,h=b/(4*r),h=a?e.ceil(h):e.max((h|0)-this._minBufferSize,0);a=h*r;b=e.min(4*a,b);if(a){for(var c=0;cb;)a(d)&&(8>b&&(g[b]=k(e.pow(d,.5))),h[b]=k(e.pow(d,1/3)),b++),d++})();var m=[],d=d.SHA256=a.extend({_doReset:function(){this._hash=new b.init(g.slice(0))},_doProcessBlock:function(a,k){for(var g=this._hash.words,d=g[0],b=g[1],e=g[2],c=g[3],f=g[4],l=g[5],q=g[6],p=g[7],D=0;64>D;D++){if(16>D)m[D]=a[k+D]|0;else{var I=m[D-15],t=m[D-2];m[D]=((I<<25|I>>>7)^(I<<14|I>>>18)^I>>>3)+m[D-7]+((t<<15|t>>>17)^(t<<13|t>>>19)^t>>> -10)+m[D-16]}I=p+((f<<26|f>>>6)^(f<<21|f>>>11)^(f<<7|f>>>25))+(f&l^~f&q)+h[D]+m[D];t=((d<<30|d>>>2)^(d<<19|d>>>13)^(d<<10|d>>>22))+(d&b^d&e^b&e);p=q;q=l;l=f;f=c+I|0;c=e;e=b;b=d;d=I+t|0}g[0]=g[0]+d|0;g[1]=g[1]+b|0;g[2]=g[2]+e|0;g[3]=g[3]+c|0;g[4]=g[4]+f|0;g[5]=g[5]+l|0;g[6]=g[6]+q|0;g[7]=g[7]+p|0},_doFinalize:function(){var a=this._data,k=a.words,g=8*this._nDataBytes,d=8*a.sigBytes;k[d>>>5]|=128<<24-d%32;k[(d+64>>>9<<4)+14]=e.floor(g/4294967296);k[(d+64>>>9<<4)+15]=g;a.sigBytes=4*k.length;this._process(); -return this._hash},clone:function(){var g=a.clone.call(this);g._hash=this._hash.clone();return g}});c.SHA256=a._createHelper(d);c.HmacSHA256=a._createHmacHelper(d)})(Math);(function(){var e=F,c=e.enc.Utf8;e.algo.HMAC=e.lib.Base.extend({init:function(d,b){d=this._hasher=new d.init;"string"==typeof b&&(b=c.parse(b));var a=d.blockSize,g=4*a;b.sigBytes>g&&(b=d.finalize(b));b.clamp();for(var e=this._oKey=b.clone(),m=this._iKey=b.clone(),n=e.words,k=m.words,r=0;r>>2]>>>24-e%4*8&255)<<16|(b[e+1>>>2]>>>24-(e+1)%4*8&255)<< -8|b[e+2>>>2]>>>24-(e+2)%4*8&255,f=0;4>f&&e+.75*f>>6*(3-f)&63));if(b=g.charAt(64))for(;d.length%4;)d.push(b);return d.join("")},parse:function(d){var b=d.length,a=this._map,g=a.charAt(64);g&&(g=d.indexOf(g),-1!=g&&(b=g));for(var g=[],e=0,m=0;m>>6-m%4*2;g[e>>>2]|=(n|k)<<24-e%4*8;e++}return c.create(g,e)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();var p={internetUpUrlWithoutExtension:"https://internet-up.ably-realtime.com/is-the-internet-up", -httpTransports:["xhr","jsonp"],transports:["web_socket","xhr","jsonp"],minified:!function(){}.name},y=function(){function e(a){return null!==a&&void 0!==a&&void 0!==a.sigBytes}function c(g){return null!==g&&void 0!==g&&g.constructor===a}function d(){}var b=F.lib.WordArray,a=window.ArrayBuffer;d.supportsBinary=!!window.TextDecoder;d.isBuffer=function(a){return c(a)||e(a)};d.toArrayBuffer=function(g){if(!a)throw Error("Can't convert to ArrayBuffer: ArrayBuffer not supported");if(c(g))return g;if(e(g)){for(var d= -new a(g.sigBytes),b=new Uint8Array(d),n=0;n>>2]>>>24-n%4*8&255;return d}throw Error("BufferUtils.toArrayBuffer expected a buffer");};d.toWordArray=function(a){return e(a)?a:b.create(a)};d.base64Encode=function(a){if(c(a)){var d="";a=new Uint8Array(a);for(var b=a.byteLength,n=b%3,b=b-n,k,r,B,u,H=0;H>18,r=(u&258048)>>12,B=(u&4032)>>6,u&=63,d+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[k]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[r]+ -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[B]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[u];1==n?(u=a[b],d+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(u&252)>>2]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(u&3)<<4]+"=="):2==n&&(u=a[b]<<8|a[b+1],d+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(u&64512)>>10]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(u&1008)>> -4]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(u&15)<<2]+"=");return d}if(e(a))return F.enc.Base64.stringify(a)};d.base64Decode=function(g){if(a){g=window.atob(g);for(var d=g.length,b=new Uint8Array(d),e=0;e>2,m=(m&3)<<4|n>>4,B=(n&15)<<2|k>>6,u=k&63;isNaN(n)?B=u=64:isNaN(k)&&(u=64);d.append(h.charAt(r)+h.charAt(m)+h.charAt(B)+h.charAt(u))}return d.toString()},decode:function(a){var b=new e;for(a=new d(a);a.moveNext();){var c=a.current;if(128>c)b.append(String.fromCharCode(c)); -else if(191c){a.moveNext();var m=a.current;b.append(String.fromCharCode((c&31)<<6|m&63))}else a.moveNext(),m=a.current,a.moveNext(),b.append(String.fromCharCode((c&15)<<12|(m&63)<<6|a.current&63))}return b.toString()}};c.prototype={current:Number.NaN,moveNext:function(){if(0=this._input.length-1)return this.current=Number.NaN,!1;var a=this._input.charCodeAt(++this._index);13==a&&10==this._input.charCodeAt(this._index+ -1)&&(a=10,this._index+=2);128>a?this.current=a:(127a?this.current=a>>6|192:(this.current=a>>12|224,this._buffer.push(a>>6&63|128)),this._buffer.push(a&63|128));return!0}};d.prototype={current:64,moveNext:function(){if(0=this._input.length-1)return this.current=64,!1;var a=b.codex.indexOf(this._input.charAt(++this._index)),d=b.codex.indexOf(this._input.charAt(++this._index)),e=b.codex.indexOf(this._input.charAt(++this._index)), -c=b.codex.indexOf(this._input.charAt(++this._index)),f=(e&3)<<6|c;this.current=a<<2|d>>4;64!=e&&this._buffer.push((d&15)<<4|e>>2);64!=c&&this._buffer.push(f);return!0}};return b}(),ba=function(){function e(){}e.addListener=function(e,d,b){e.addEventListener?e.addEventListener(d,b,!1):e.attachEvent("on"+d,function(){b.apply(e,arguments)})};e.removeListener=function(e,d,b){e.removeEventListener?e.removeEventListener(d,b,!1):e.detachEvent("on"+d,function(){b.apply(e,arguments)})};e.addMessageListener= -function(c,d){e.addListener(c,"message",d)};e.removeMessageListener=function(c,d){e.removeListener(c,"message",d)};e.addUnloadListener=function(c){e.addListener(window,"unload",c)};return e}();(function(e){this.msgpack=e()}).call(this,function(){function e(a,d,b){for(var g=0,e=b.length;gc)a.setUint8(d++,c>>>0&127|0);else if(2048>c)a.setUint8(d++,c>>>6&31|192),a.setUint8(d++,c>>>0&63|128);else if(65536>c)a.setUint8(d++,c>>>12&15|224),a.setUint8(d++,c>>>6&63|128), -a.setUint8(d++,c>>>0&63|128);else if(1114112>c)a.setUint8(d++,c>>>18&7|240),a.setUint8(d++,c>>>12&63|128),a.setUint8(d++,c>>>6&63|128),a.setUint8(d++,c>>>0&63|128);else throw Error("bad codepoint "+c);}}function c(a,d,b){var g="",e=d;for(d+=b;ee)d+=1;else if(2048>e)d+=2;else if(65536>e)d+=3;else if(1114112>e)d+=4;else throw Error("bad codepoint "+e);}return d}function b(a,d){this.offset=d||0;this.view=a}function a(a,d){return l.keysArray(a,!0).filter(function(b){b=a[b];return(!d||void 0!== -b&&null!==b)&&("function"!==typeof b||!!b.toJSON)})}function g(k,b,c,h){var m=typeof k;if("string"===m){var f=d(k);if(32>f)return b.setUint8(c,f|160),e(b,c+1,k),1+f;if(256>f)return b.setUint8(c,217),b.setUint8(c+1,f),e(b,c+2,k),2+f;if(65536>f)return b.setUint8(c,218),b.setUint16(c+1,f),e(b,c+3,k),3+f;if(4294967296>f)return b.setUint8(c,219),b.setUint32(c+1,f),e(b,c+5,k),5+f}if(k instanceof ArrayBuffer){f=k.byteLength;if(256>f)return b.setUint8(c,196),b.setUint8(c+1,f),(new Uint8Array(b.buffer)).set(new Uint8Array(k), -c+2),2+f;if(65536>f)return b.setUint8(c,197),b.setUint16(c+1,f),(new Uint8Array(b.buffer)).set(new Uint8Array(k),c+3),3+f;if(4294967296>f)return b.setUint8(c,198),b.setUint32(c+1,f),(new Uint8Array(b.buffer)).set(new Uint8Array(k),c+5),5+f}if("number"===m){if(Math.floor(k)!==k)return b.setUint8(c,203),b.setFloat64(c+1,k),9;if(0<=k){if(128>k)return b.setUint8(c,k),1;if(256>k)return b.setUint8(c,204),b.setUint8(c+1,k),2;if(65536>k)return b.setUint8(c,205),b.setUint16(c+1,k),3;if(4294967296>k)return b.setUint8(c, -206),b.setUint32(c+1,k),5;if(1.8446744073709552E19>k)return b.setUint8(c,207),c+=1,1.8446744073709552E19>k?(b.setUint32(c,Math.floor(k*n)),b.setInt32(c+4,k&-1)):(b.setUint32(c,4294967295),b.setUint32(c+4,4294967295)),9;throw Error("Number too big 0x"+k.toString(16));}if(-32<=k)return b.setInt8(c,k),1;if(-128<=k)return b.setUint8(c,208),b.setInt8(c+1,k),2;if(-32768<=k)return b.setUint8(c,209),b.setInt16(c+1,k),3;if(-2147483648<=k)return b.setUint8(c,210),b.setInt32(c+1,k),5;if(-9223372036854775808<= -k)return b.setUint8(c,211),c+=1,0x7fffffffffffffff>k?(b.setInt32(c,Math.floor(k*n)),b.setInt32(c+4,k&-1)):(b.setUint32(c,2147483647),b.setUint32(c+4,2147483647)),9;throw Error("Number too small -0x"+(-k).toString(16).substr(1));}if("undefined"===m){if(h)return 0;b.setUint8(c,212);b.setUint8(c+1,0);b.setUint8(c+2,0);return 3}if(null===k){if(h)return 0;b.setUint8(c,192);return 1}if("boolean"===m)return b.setUint8(c,k?195:194),1;if("function"===typeof k.toJSON)return g(k.toJSON(),b,c,h);if("object"=== -m){var m=0,l=Array.isArray(k);if(l)f=k.length;else var V=a(k,h),f=V.length;16>f?(b.setUint8(c,f|(l?144:128)),m=1):65536>f?(b.setUint8(c,l?220:222),b.setUint16(c+1,f),m=3):4294967296>f&&(b.setUint8(c,l?221:223),b.setUint32(c+1,f),m=5);if(l)for(l=0;le)return 1+e;if(256>e)return 2+ -e;if(65536>e)return 3+e;if(4294967296>e)return 5+e}if(b instanceof ArrayBuffer){e=b.byteLength;if(256>e)return 2+e;if(65536>e)return 3+e;if(4294967296>e)return 5+e}if("number"===c){if(Math.floor(b)!==b)return 9;if(0<=b){if(128>b)return 1;if(256>b)return 2;if(65536>b)return 3;if(4294967296>b)return 5;if(1.8446744073709552E19>b)return 9;throw Error("Number too big 0x"+b.toString(16));}if(-32<=b)return 1;if(-128<=b)return 2;if(-32768<=b)return 3;if(-2147483648<=b)return 5;if(-9223372036854775808<=b)return 9; -throw Error("Number too small -0x"+b.toString(16).substr(1));}if("boolean"===c)return 1;if(null===b)return g?0:1;if(void 0===b)return g?0:3;if("function"===typeof b.toJSON)return h(b.toJSON(),g);if("object"===c){c=0;if(Array.isArray(b))for(var e=b.length,m=0;me)return 1+c;if(65536>e)return 3+c;if(4294967296>e)return 5+c;throw Error("Array or object too long 0x"+e.toString(16));}if("function"===c)return 0; -throw Error("Unknown type "+c);}var m={inspect:function(a){if(void 0===a)return"undefined";var b,d;a instanceof ArrayBuffer?(d="ArrayBuffer",b=new DataView(a)):a instanceof DataView&&(d="DataView",b=a);if(!b)return JSON.stringify(a);for(var g=[],c=0;c"}};m.utf8Write=e;m.utf8Read=c;m.utf8ByteCount=d;m.encode=function(a,b){var d=h(a,b);if(0!=d){var d=new ArrayBuffer(d), -c=new DataView(d);g(a,c,0,b);return d}};m.decode=function(a){var d=new DataView(a),d=new b(d),g=d.parse();if(d.offset!==a.byteLength)throw Error(a.byteLength-d.offset+" trailing bytes");return g};var n=1/4294967296;b.prototype.map=function(a){for(var b={},d=0;d>>2]|=(a[e>>>2]>>>24-e%4*8&255)<<24-(l+e)%4*8;else if(65535>>2]=a[e>>>2];else c.push.apply(c,a);this.sigBytes+=d;return this}, +clamp:function(){var d=this.words,c=this.sigBytes;d[c>>>2]&=4294967295<<32-c%4*8;d.length=f.ceil(c/4)},clone:function(){var d=c.clone.call(this);d.words=this.words.slice(0);return d},random:function(c){for(var a=[],l=function(d){var c=987654321;return function(){c=36969*(c&65535)+(c>>16)&4294967295;d=18E3*(d&65535)+(d>>16)&4294967295;var a=(c<<16)+d&4294967295,a=a/4294967296+.5;return a*(.5>>2]>>>24-l%4*8&255;a.push((e>>>4).toString(16));a.push((e&15).toString(16))}return a.join("")},parse:function(c){for(var a=c.length,l=[],e=0;e>>3]|=parseInt(c.substr(e,2),16)<<24-e%8*4;return new d.init(l,a/2)}},n=m.Latin1={stringify:function(d){var c=d.words;d=d.sigBytes;for(var a=[],l=0;l>>2]>>>24-l%4*8&255));return a.join("")}, +parse:function(c){for(var a=c.length,l=[],e=0;e>>2]|=(c.charCodeAt(e)&255)<<24-e%4*8;return new d.init(l,a)}},p=m.Utf8={stringify:function(d){try{return decodeURIComponent(escape(n.stringify(d)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(d){return n.parse(unescape(encodeURIComponent(d)))}},l=a.BufferedBlockAlgorithm=c.extend({reset:function(){this._data=new d.init;this._nDataBytes=0},_append:function(d){"string"==typeof d&&(d=p.parse(d));this._data.concat(d);this._nDataBytes+= +d.sigBytes},_process:function(c){var a=this._data,l=a.words,e=a.sigBytes,p=this.blockSize,m=e/(4*p),m=c?f.ceil(m):f.max((m|0)-this._minBufferSize,0);c=m*p;e=f.min(4*c,e);if(c){for(var A=0;Ae;)c(l)&&(8>e&&(d[e]=a(f.pow(l,.5))),m[e]=a(f.pow(l,1/3)),e++),l++})();var h=[],e=e.SHA256=c.extend({_doReset:function(){this._hash=new a.init(d.slice(0))},_doProcessBlock:function(d,c){for(var a=this._hash.words,e=a[0],f=a[1],b=a[2],g=a[3],k=a[4],I=a[5],r=a[6],q=a[7],E=0;64>E;E++){if(16>E)h[E]=d[c+E]|0;else{var J=h[E-15],L=h[E-2];h[E]=((J<<25|J>>>7)^(J<<14|J>>>18)^J>>>3)+h[E-7]+((L<<15|L>>>17)^(L<<13|L>>>19)^L>>> +10)+h[E-16]}J=q+((k<<26|k>>>6)^(k<<21|k>>>11)^(k<<7|k>>>25))+(k&I^~k&r)+m[E]+h[E];L=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&b^f&b);q=r;r=I;I=k;k=g+J|0;g=b;b=f;f=e;e=J+L|0}a[0]=a[0]+e|0;a[1]=a[1]+f|0;a[2]=a[2]+b|0;a[3]=a[3]+g|0;a[4]=a[4]+k|0;a[5]=a[5]+I|0;a[6]=a[6]+r|0;a[7]=a[7]+q|0},_doFinalize:function(){var d=this._data,c=d.words,a=8*this._nDataBytes,e=8*d.sigBytes;c[e>>>5]|=128<<24-e%32;c[(e+64>>>9<<4)+14]=f.floor(a/4294967296);c[(e+64>>>9<<4)+15]=a;d.sigBytes=4*c.length;this._process(); +return this._hash},clone:function(){var d=c.clone.call(this);d._hash=this._hash.clone();return d}});b.SHA256=c._createHelper(e);b.HmacSHA256=c._createHmacHelper(e)})(Math);(function(){var f=G,b=f.enc.Utf8;f.algo.HMAC=f.lib.Base.extend({init:function(e,a){e=this._hasher=new e.init;"string"==typeof a&&(a=b.parse(a));var c=e.blockSize,d=4*c;a.sigBytes>d&&(a=e.finalize(a));a.clamp();for(var f=this._oKey=a.clone(),h=this._iKey=a.clone(),n=f.words,p=h.words,l=0;l>>2]>>>24-f%4*8&255)<<16|(a[f+1>>>2]>>>24-(f+1)%4*8&255)<< +8|a[f+2>>>2]>>>24-(f+2)%4*8&255,n=0;4>n&&f+.75*n>>6*(3-n)&63));if(a=d.charAt(64))for(;e.length%4;)e.push(a);return e.join("")},parse:function(e){var a=e.length,c=this._map,d=c.charAt(64);d&&(d=e.indexOf(d),-1!=d&&(a=d));for(var d=[],f=0,h=0;h>>6-h%4*2;d[f>>>2]|=(n|p)<<24-f%4*8;f++}return b.create(d,f)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();var q={internetUpUrlWithoutExtension:"https://internet-up.ably-realtime.com/is-the-internet-up", +httpTransports:["xhr","jsonp"],transports:["web_socket","xhr","jsonp"],minified:!function(){}.name},y=function(){function f(d){return null!==d&&void 0!==d&&void 0!==d.sigBytes}function b(d){return null!==d&&void 0!==d&&d.constructor===c}function e(){}var a=G.lib.WordArray,c=window.ArrayBuffer;e.supportsBinary=!!window.TextDecoder;e.isBuffer=function(d){return b(d)||f(d)};e.toArrayBuffer=function(d){if(!c)throw Error("Can't convert to ArrayBuffer: ArrayBuffer not supported");if(b(d))return d;if(f(d)){for(var a= +new c(d.sigBytes),e=new Uint8Array(a),n=0;n>>2]>>>24-n%4*8&255;return a}throw Error("BufferUtils.toArrayBuffer expected a buffer");};e.toWordArray=function(d){return f(d)?d:a.create(d)};e.base64Encode=function(d){if(b(d)){var c="";d=new Uint8Array(d);for(var a=d.byteLength,e=a%3,a=a-e,p,l,A,t,z=0;z>18,l=(t&258048)>>12,A=(t&4032)>>6,t&=63,c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[p]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[l]+ +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[A]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[t];1==e?(t=d[a],c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&252)>>2]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&3)<<4]+"=="):2==e&&(t=d[a]<<8|d[a+1],c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&64512)>>10]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&1008)>> +4]+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(t&15)<<2]+"=");return c}if(f(d))return G.enc.Base64.stringify(d)};e.base64Decode=function(d){if(c){d=window.atob(d);for(var a=d.length,e=new Uint8Array(a),f=0;f>2,h=(h&3)<<4|n>>4,A=(n&15)<<2|p>>6,t=p&63;isNaN(n)?A=t=64:isNaN(p)&&(t=64);d.append(e.charAt(l)+e.charAt(h)+e.charAt(A)+e.charAt(t))}return d.toString()},decode:function(c){var d=new f;for(c=new e(c);c.moveNext();){var a=c.current;if(128>a)d.append(String.fromCharCode(a)); +else if(191a){c.moveNext();var b=c.current;d.append(String.fromCharCode((a&31)<<6|b&63))}else c.moveNext(),b=c.current,c.moveNext(),d.append(String.fromCharCode((a&15)<<12|(b&63)<<6|c.current&63))}return d.toString()}};b.prototype={current:Number.NaN,moveNext:function(){if(0=this._input.length-1)return this.current=Number.NaN,!1;var a=this._input.charCodeAt(++this._index);13==a&&10==this._input.charCodeAt(this._index+ +1)&&(a=10,this._index+=2);128>a?this.current=a:(127a?this.current=a>>6|192:(this.current=a>>12|224,this._buffer.push(a>>6&63|128)),this._buffer.push(a&63|128));return!0}};e.prototype={current:64,moveNext:function(){if(0=this._input.length-1)return this.current=64,!1;var c=a.codex.indexOf(this._input.charAt(++this._index)),d=a.codex.indexOf(this._input.charAt(++this._index)),e=a.codex.indexOf(this._input.charAt(++this._index)), +f=a.codex.indexOf(this._input.charAt(++this._index)),b=(e&3)<<6|f;this.current=c<<2|d>>4;64!=e&&this._buffer.push((d&15)<<4|e>>2);64!=f&&this._buffer.push(b);return!0}};return a}(),ca=function(){function f(){}f.addListener=function(f,e,a){f.addEventListener?f.addEventListener(e,a,!1):f.attachEvent("on"+e,function(){a.apply(f,arguments)})};f.removeListener=function(f,e,a){f.removeEventListener?f.removeEventListener(e,a,!1):f.detachEvent("on"+e,function(){a.apply(f,arguments)})};f.addMessageListener= +function(b,e){f.addListener(b,"message",e)};f.removeMessageListener=function(b,e){f.removeListener(b,"message",e)};f.addUnloadListener=function(b){f.addListener(window,"unload",b)};return f}();(function(f){this.msgpack=f()}).call(this,function(){function f(d,a,c){for(var e=0,f=c.length;eb)d.setUint8(a++,b>>>0&127|0);else if(2048>b)d.setUint8(a++,b>>>6&31|192),d.setUint8(a++,b>>>0&63|128);else if(65536>b)d.setUint8(a++,b>>>12&15|224),d.setUint8(a++,b>>>6&63|128), +d.setUint8(a++,b>>>0&63|128);else if(1114112>b)d.setUint8(a++,b>>>18&7|240),d.setUint8(a++,b>>>12&63|128),d.setUint8(a++,b>>>6&63|128),d.setUint8(a++,b>>>0&63|128);else throw Error("bad codepoint "+b);}}function b(d,a,c){var e="",f=a;for(a+=c;ff)a+=1;else if(2048>f)a+=2;else if(65536>f)a+=3;else if(1114112>f)a+=4;else throw Error("bad codepoint "+f);}return a}function a(d,a){this.offset=a||0;this.view=d}function c(d,a){return k.keysArray(d,!0).filter(function(c){c=d[c];return(!a||void 0!== +c&&null!==c)&&("function"!==typeof c||!!c.toJSON)})}function d(a,l,b,m){var h=typeof a;if("string"===h){var g=e(a);if(32>g)return l.setUint8(b,g|160),f(l,b+1,a),1+g;if(256>g)return l.setUint8(b,217),l.setUint8(b+1,g),f(l,b+2,a),2+g;if(65536>g)return l.setUint8(b,218),l.setUint16(b+1,g),f(l,b+3,a),3+g;if(4294967296>g)return l.setUint8(b,219),l.setUint32(b+1,g),f(l,b+5,a),5+g}if(a instanceof ArrayBuffer){g=a.byteLength;if(256>g)return l.setUint8(b,196),l.setUint8(b+1,g),(new Uint8Array(l.buffer)).set(new Uint8Array(a), +b+2),2+g;if(65536>g)return l.setUint8(b,197),l.setUint16(b+1,g),(new Uint8Array(l.buffer)).set(new Uint8Array(a),b+3),3+g;if(4294967296>g)return l.setUint8(b,198),l.setUint32(b+1,g),(new Uint8Array(l.buffer)).set(new Uint8Array(a),b+5),5+g}if("number"===h){if(Math.floor(a)!==a)return l.setUint8(b,203),l.setFloat64(b+1,a),9;if(0<=a){if(128>a)return l.setUint8(b,a),1;if(256>a)return l.setUint8(b,204),l.setUint8(b+1,a),2;if(65536>a)return l.setUint8(b,205),l.setUint16(b+1,a),3;if(4294967296>a)return l.setUint8(b, +206),l.setUint32(b+1,a),5;if(1.8446744073709552E19>a)return l.setUint8(b,207),b+=1,1.8446744073709552E19>a?(l.setUint32(b,Math.floor(a*n)),l.setInt32(b+4,a&-1)):(l.setUint32(b,4294967295),l.setUint32(b+4,4294967295)),9;throw Error("Number too big 0x"+a.toString(16));}if(-32<=a)return l.setInt8(b,a),1;if(-128<=a)return l.setUint8(b,208),l.setInt8(b+1,a),2;if(-32768<=a)return l.setUint8(b,209),l.setInt16(b+1,a),3;if(-2147483648<=a)return l.setUint8(b,210),l.setInt32(b+1,a),5;if(-9223372036854775808<= +a)return l.setUint8(b,211),b+=1,0x7fffffffffffffff>a?(l.setInt32(b,Math.floor(a*n)),l.setInt32(b+4,a&-1)):(l.setUint32(b,2147483647),l.setUint32(b+4,2147483647)),9;throw Error("Number too small -0x"+(-a).toString(16).substr(1));}if("undefined"===h){if(m)return 0;l.setUint8(b,212);l.setUint8(b+1,0);l.setUint8(b+2,0);return 3}if(null===a){if(m)return 0;l.setUint8(b,192);return 1}if("boolean"===h)return l.setUint8(b,a?195:194),1;if("function"===typeof a.toJSON)return d(a.toJSON(),l,b,m);if("object"=== +h){var h=0,k=Array.isArray(a);if(k)g=a.length;else var I=c(a,m),g=I.length;16>g?(l.setUint8(b,g|(k?144:128)),h=1):65536>g?(l.setUint8(b,k?220:222),l.setUint16(b+1,g),h=3):4294967296>g&&(l.setUint8(b,k?221:223),l.setUint32(b+1,g),h=5);if(k)for(k=0;kf)return 1+f;if(256>f)return 2+ +f;if(65536>f)return 3+f;if(4294967296>f)return 5+f}if(a instanceof ArrayBuffer){f=a.byteLength;if(256>f)return 2+f;if(65536>f)return 3+f;if(4294967296>f)return 5+f}if("number"===b){if(Math.floor(a)!==a)return 9;if(0<=a){if(128>a)return 1;if(256>a)return 2;if(65536>a)return 3;if(4294967296>a)return 5;if(1.8446744073709552E19>a)return 9;throw Error("Number too big 0x"+a.toString(16));}if(-32<=a)return 1;if(-128<=a)return 2;if(-32768<=a)return 3;if(-2147483648<=a)return 5;if(-9223372036854775808<=a)return 9; +throw Error("Number too small -0x"+a.toString(16).substr(1));}if("boolean"===b)return 1;if(null===a)return d?0:1;if(void 0===a)return d?0:3;if("function"===typeof a.toJSON)return m(a.toJSON(),d);if("object"===b){b=0;if(Array.isArray(a))for(var f=a.length,h=0;hf)return 1+b;if(65536>f)return 3+b;if(4294967296>f)return 5+b;throw Error("Array or object too long 0x"+f.toString(16));}if("function"===b)return 0; +throw Error("Unknown type "+b);}var h={inspect:function(a){if(void 0===a)return"undefined";var d,c;a instanceof ArrayBuffer?(c="ArrayBuffer",d=new DataView(a)):a instanceof DataView&&(c="DataView",d=a);if(!d)return JSON.stringify(a);for(var e=[],f=0;f"}};h.utf8Write=f;h.utf8Read=b;h.utf8ByteCount=e;h.encode=function(a,c){var e=m(a,c);if(0!=e){var e=new ArrayBuffer(e), +f=new DataView(e);d(a,f,0,c);return e}};h.decode=function(d){var c=new DataView(d),c=new a(c),e=c.parse();if(c.offset!==d.byteLength)throw Error(d.byteLength-c.offset+" trailing bytes");return e};var n=1/4294967296;a.prototype.map=function(a){for(var d={},c=0;c=c?null:a.slice(0,c).join("/"),d.data=m}}};e.fromResponseBody=function(d,b,a,g){a&&(d="msgpack"==a?f.decode(d):JSON.parse(String(d)));for(a=0;aa.code:500>a.statusCode}function f(a,c,b,d,e){this.options=a;this.host=c;this.mode=b;this.connectionKey=d;this.connectionSerial=e;this.format=a.useBinaryProtocol?"msgpack":"json"}function d(b,e){t.call(this);this.realtime=b;this.options= -e;var g=e.timeouts;this.states={initialized:{state:"initialized",terminal:!1,queueEvents:!0,sendEvents:!1},connecting:{state:"connecting",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:g.realtimeRequestTimeout,failState:"disconnected"},connected:{state:"connected",terminal:!1,queueEvents:!1,sendEvents:!0,failState:"disconnected"},synchronizing:{state:"connected",terminal:!1,queueEvents:!0,sendEvents:!1},disconnected:{state:"disconnected",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:g.disconnectedRetryTimeout}, -suspended:{state:"suspended",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:g.suspendedRetryTimeout},closing:{state:"closing",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:g.realtimeRequestTimeout,failState:"closed"},closed:{state:"closed",terminal:!0,queueEvents:!1,sendEvents:!1},failed:{state:"failed",terminal:!0,queueEvents:!1,sendEvents:!1}};this.state=this.states.initialized;this.errorReason=null;this.queuedMessages=new W;this.msgSerial=0;this.connectionSerial=this.connectionKey=this.connectionId= -void 0;this.httpTransports=l.intersect(e.transports||p.httpTransports,d.httpTransports);this.transports=l.intersect(e.transports||p.transports,d.transports);this.upgradeTransports=l.arrSubtract(this.transports,this.httpTransports);this.httpHosts=p.getHosts(e);this.activeProtocol=null;this.pendingTransports=[];this.host=null;c.logAction(c.LOG_MINOR,"Realtime.ConnectionManager()","started");c.logAction(c.LOG_MICRO,"Realtime.ConnectionManager()","requested transports = ["+(e.transports||p.transports)+ -"]");c.logAction(c.LOG_MICRO,"Realtime.ConnectionManager()","available http transports = ["+this.httpTransports+"]");c.logAction(c.LOG_MICRO,"Realtime.ConnectionManager()","available transports = ["+this.transports+"]");c.logAction(c.LOG_MICRO,"Realtime.ConnectionManager()","http hosts = ["+this.httpHosts+"]");if(!this.transports.length)throw c.logAction(c.LOG_ERROR,"realtime.ConnectionManager()","no requested transports available"),Error("no requested transports available");a&&!0===e.recover&&window.addEventListener&& -window.addEventListener("beforeunload",this.persistConnection.bind(this));if("object"===typeof window&&window.addEventListener){var h=this;window.addEventListener("online",function(){if(h.state==h.states.disconnected||h.state==h.states.suspended)c.logAction(c.LOG_MINOR,"ConnectionManager caught browser \u2018online\u2019 event","reattempting connection"),h.requestState({state:"connecting"})});window.addEventListener("offline",function(){h.state==h.states.connected&&(c.logAction(c.LOG_MINOR,"ConnectionManager caught browser \u2018offline\u2019 event", -"disconnecting active transport"),h.disconnectAllTransports())})}}var b="undefined"!==typeof L&&L.read,a="undefined"!==typeof L&&L.create,g="undefined"!==typeof L&&L.erase,h=x.Action,m=X.PendingMessage,n=function(){};f.prototype.getConnectParams=function(a){a=a?l.copy(a):{};var c=this.options;switch(this.mode){case "upgrade":a.upgrade=this.connectionKey;break;case "resume":a.resume=this.connectionKey;void 0!==this.connectionSerial&&(a.connection_serial=this.connectionSerial);break;case "recover":if(!0=== -c.recover){var d=b("ably-connection-key"),e=b("ably-connection-serial");null!==d&&null!==e&&(a.recover=d,a.connection_serial=e)}else if(d=c.recover.match(/^(\w+):(\w+)$/))a.recover=d[1],a.connection_serial=d[2]}void 0!==c.clientId&&(a.clientId=c.clientId);!1===c.echoMessages&&(a.echo="false");void 0!==this.format&&(a.format=this.format);void 0!==this.stream&&(a.stream=this.stream);void 0!==c.transportParams&&l.mixin(a,c.transportParams);a.v=p.apiVersion;return a};l.inherits(d,t);d.httpTransports= -{};d.transports={};d.prototype.chooseTransport=function(a){c.logAction(c.LOG_MAJOR,"ConnectionManager.chooseTransport()","");if(this.activeProtocol)c.logAction(c.LOG_MINOR,"ConnectionManager.chooseTransport()","Transport already established"),a(null);else{var b=this.connectionKey?"resume":this.options.recover?"recover":"clean",d=new f(this.options,null,b,this.connectionKey,this.connectionSerial);c.logAction(c.LOG_MINOR,"ConnectionManager.chooseTransport()","Transport recovery mode = "+b+("clean"== -b?"":"; connectionKey = "+this.connectionKey+"; connectionSerial = "+this.connectionSerial));var e=this;this.httpTransports.length?this.chooseHttpTransport(d,function(b,g){if(b)c.logAction(c.LOG_ERROR,"ConnectionManager.chooseTransport()","Unexpected error establishing transport; err = "+l.inspectError(b)),a(b);else if(c.logAction(c.LOG_MINOR,"ConnectionManager.chooseTransport()","Establishing http transport: "+g),a(null,g),e.upgradeTransports.length)g.once("connected",function(a,b){l.nextTick(function(){c.logAction(c.LOG_MAJOR, -"ConnectionManager.chooseTransport()","upgrading ... connectionKey = "+b);d=new f(e.options,d.host,"upgrade",b);e.chooseTransportForHost(d,e.upgradeTransports.slice(),n)})})}):(d.host=this.httpHosts[0],c.logAction(c.LOG_MINOR,"ConnectionManager.chooseTransport()","No http transports available; ignoring fallback hosts"),this.chooseTransportForHost(d,e.transports.slice(),a))}};d.prototype.chooseTransportForHost=function(a,b,g){var h=b.shift();if(h){var f=this;c.logAction(c.LOG_MICRO,"ConnectionManager.chooseTransportForHost()", -"trying "+h);d.transports[h].tryConnect(this,this.realtime.auth,a,function(d,n){var m=f.state;m==f.states.closing||m==f.states.closed||m==f.states.failed?(c.logAction(c.LOG_MINOR,"ConnectionManager.chooseTransportForHost()","connection closing"),n&&(c.logAction(c.LOG_MINOR,"ConnectionManager.chooseTransportForHost()","closing transport = "+n),n.close()),g(new q("Connection already closed",400,80017))):d?e(d)?g(d):f.chooseTransportForHost(a,b,g):(c.logAction(c.LOG_MICRO,"ConnectionManager.chooseTransportForHost()", -"transport "+h+" connecting"),f.setTransportPending(n,a.mode),g(null,n))})}else g(new q("Unable to connect (no available transport)",8E4,404))};d.prototype.chooseHttpTransport=function(a,c){function b(){g.length?d.httpTransports[f.httpTransports[0]].checkConnectivity(function(d,h){d?c(d):h?(a.host=l.arrRandomElement(g),f.chooseTransportForHost(a,f.httpTransports.slice(),function(a,d){a?e(a)?c(a):b():c(null,d)})):c(new q("Unable to connect (network unreachable)",8E4,404))}):c(new q("Unable to connect (no available host)", -8E4,404))}var g=this.httpHosts.slice(),h=g.shift();if(h){a.host=h;var f=this;this.chooseTransportForHost(a,this.httpTransports.slice(),function(a,d){a?e(a)?c(a):b():c(null,d)})}else c(new q("Unable to connect (no available host)",8E4,404))};d.prototype.setTransportPending=function(a,b){c.logAction(c.LOG_MINOR,"ConnectionManager.setTransportPending()","transport = "+a+"; mode = "+b);this.pendingTransports.push(a);var d=this;a.on("connected",function(c,e,g,h,f){"upgrade"==b&&d.activeProtocol?d.scheduleTransportActivation(a): -d.activateTransport(a,e,g,h,f)});for(var e=function(c){return function(b){d.deactivateTransport(a,c,b)}},g=["disconnected","closed","failed"],h=0;hf||300<=f?(c=c&&c.error,c||(c=Error(String(res)),c.statusCode=f),a(c)):a(null,c,e,!0))}}}function b(a){var c=[];if(a)for(var b in a)c.push(b+"="+a[b]);return c.join("&")}function a(a,d,e,g){return function(f,l,u,H){f?c.logAction(c.LOG_MICRO, -"Resource."+d+"()","Received Error; "+(e+(g?"?":"")+b(g))+"; Error: "+JSON.stringify(f)):c.logAction(c.LOG_MICRO,"Resource."+d+"()","Received; "+(e+(g?"?":"")+b(g))+"; Headers: "+b(u)+"; Body: "+(y.isBuffer(l)?l.toString():l));a&&a(f,l,u,H)}}var g="object"==typeof window?window.Ably.msgpack:(void 0)("msgpack-js");e.get=function(e,g,n,k,r,l){function u(a,d){c.shouldLog(c.LOG_MICRO)&&c.logAction(c.LOG_MICRO,"Resource.get()","Sending; "+(g+(d?"?":"")+b(d)));v.get(e,g,a,d,function(a,c,b,d){a&&M.isTokenErr(a)? -e.auth.authorise(null,{force:!0},function(a){a?l(a):f(e,n,k,l,u)}):l(a,c,b,d)})}c.shouldLog(c.LOG_MICRO)&&(l=a(l,"get",g,k));r&&(l=l&&d(l,r),(k=k||{}).envelope=r);f(e,n,k,l,u)};e.post=function(e,m,n,k,l,B,u){function q(a,d){if(c.shouldLog(c.LOG_MICRO)){var B=n;if(0<(a["content-type"]||"").indexOf("msgpack"))try{n=g.decode(n)}catch(p){c.logAction(c.LOG_MICRO,"Resource.post()","Sending MsgPack Decoding Error: "+JSON.stringify(p))}c.logAction(c.LOG_MICRO,"Resource.post()","Sending; "+(m+(d?"?":"")+b(d))+ -"; Body: "+B)}v.post(e,m,a,n,d,function(a,c,b,d){a&&M.isTokenErr(a)?e.auth.authorise(null,{force:!0},function(a){a?u(a):f(e,k,l,u,q)}):u(a,c,b,d)})}c.shouldLog(c.LOG_MICRO)&&(u=a(u,"post",m,l));B&&(u=d(u,B),l.envelope=B);f(e,k,l,u,q)};return e}(),O=function(){function e(c,b,a,e,h){this.rest=c;this.path=b;this.headers=a;this.envelope=e;this.bodyHandler=h}function f(c,b,a){this.resource=c;this.items=b;var e=this;"first"in a&&(this.first=function(c){e.get(a.first,c)});"current"in a&&(this.current=function(c){e.get(a.current, -c)});this.next=function(c){"next"in a?e.get(a.next,c):c(null,null)};this.hasNext=function(){return"next"in a};this.isLast=function(){return!this.hasNext()}}e.prototype.get=function(c,b){var a=this;T.get(a.rest,a.path,a.headers,c,a.envelope,function(c,d,e,f){a.handlePage(c,d,e,f,b)})};e.prototype.handlePage=function(d,b,a,e,h){if(d)c.logAction(c.LOG_ERROR,"PaginatedResource.get()","Unexpected error getting resource: err = "+JSON.stringify(d)),h(d);else{var m,n,k;try{m=this.bodyHandler(b,a,e)}catch(r){h(r); -return}if(a&&(n=a.Link||a.link)){d=n;"string"==typeof d&&(d=d.split(","));b={};for(a=0;a;\s*rel="(\w+)"$/))&&(n=(n=e[1].match(/^\.\/(\w+)\?(.*)$/))&&l.parseQueryString(n[2]))&&(b[e[2]]=n);k=b}h(null,new f(this,m,k))}};f.prototype.get=function(c,b){var a=this.resource;T.get(a.rest,a.path,a.headers,c,a.envelope,function(c,d,e,f){a.handlePage(c,d,e,f,b)})};return e}(),M=function(){function e(){}function f(a){if(!a)return"";"string"==typeof a&&(a=JSON.parse(a)); -var c={},b=l.keysArray(a,!0);if(!b)return"";b.sort();for(var d=0;d=f){if(!b||!b.force){c.logAction(c.LOG_MINOR,"Auth.getToken()","using cached token; expires = "+g.expires);d(null,g);return}}else c.logAction(c.LOG_MINOR,"Auth.getToken()","deleting expired token"),e.tokenDetails=null;h()}):h()};d.prototype.requestToken=function(a,b,d){"function"!= -typeof a||d?"function"!=typeof b||d||(d=b,b=null):(d=a,b=a=null);b=l.mixin(l.copy(this.client.options),b);a=a||l.copy(this.tokenParams);d=d||e;var h=b.format||"json",m,p=this.client;if(b.authCallback)c.logAction(c.LOG_MINOR,"Auth.requestToken()","using token auth with auth_callback"),m=b.authCallback;else if(b.authUrl)c.logAction(c.LOG_MINOR,"Auth.requestToken()","using token auth with auth_url"),b.authParams||(m=b.authUrl.indexOf("?"),-1a.code};return d}(),C=function(){function e(b){if(!(this instanceof e))return new e(b);if(!b){var a="no options provided";c.logAction(c.LOG_ERROR,"Rest()",a);throw Error(a);}"string"==typeof b&&(b=-1==b.indexOf(":")?{token:b}:{key:b});this.options=p.normaliseOptions(b);y.supportsBinary&&!0===this.options.useBinaryProtocol||(this.options.useBinaryProtocol=!1);if(b.key){a=b.key.match(/^([^:\s]+):([^:.\s]+)$/);if(!a)throw a="invalid key parameter",c.logAction(c.LOG_ERROR,"Rest()",a),Error(a); -b.keyName=a[1];b.keySecret=a[2]}if("clientId"in b){if("string"!==typeof b.clientId&&null!==b.clientId)throw new q("clientId must be either a string or null",40012,400);if("*"===b.clientId)throw new q('Can\u2019t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: "*"}})',40012,400);}b.log&&c.setLog(b.log.level,b.log.handler);c.logAction(c.LOG_MINOR,"Rest()","started");this.baseUri=this.authority= -function(a){return p.getHttpScheme(b)+a+":"+p.getPort(b,!1)};this.serverTimeOffset=null;this.auth=new M(this,b);this.channels=new f(this)}function f(b){this.rest=b;this.attached={}}var d=function(){};e.prototype.stats=function(b,a){void 0===a&&("function"==typeof b?(a=b,b=null):a=d);var c=l.copy(l.defaultGetHeaders()),e=v.supportsLinkHeaders?void 0:"json";this.options.headers&&l.mixin(c,this.options.headers);(new O(this,"/stats",c,e,function(a,b,c){a=c?a:JSON.parse(a);for(b=0;ba.statusCode?f.complete(null,b,a.headers):(a=b.error||new q("Error response received from server",5E4,a.statusCode),f.complete(a)):f.complete(new q("Invalid server response: no envelope detected", -5E4,500))}else f.complete(null,a)};this.timer=setTimeout(function(){f.abort()},this.requestMode==K.REQ_SEND?this.timeouts.httpRequestTimeout:this.timeouts.recvTimeout);g.insertBefore(c,g.firstChild)};f.prototype.complete=function(a,b,c){c=c||{};this.requestComplete||(this.requestComplete=!0,b&&(c["content-type"]="string"==typeof b?"text/plain":"application/json",this.emit("data",b)),this.emit("complete",a,b,c,!0),this.dispose())};f.prototype.abort=function(){this.dispose()};f.prototype.dispose=function(){var a= -this.timer;a&&(clearTimeout(a),this.timer=null);a=this.script;a.parentNode&&a.parentNode.removeChild(a);delete b[this.id];this.emit("disposed")};v.Request=function(a,b,c,d,e){var f=m(a,b,c,d,K.REQ_SEND);f.once("complete",e);l.nextTick(function(){f.exec()});return f};return e})();var Y=function(){function e(){for(var a in g)g[a].dispose()}function f(){return h=window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}function d(b,c,d,e,f,h){t.call(this);d=d||{};d.rnd=l.randStr();var n,p;if(p=m)p= -n=(n=navigator.userAgent.toString().match(/MSIE\s([\d.]+)/))&&Number(n[1]);p&&10===n&&!d.envelope&&(d.envelope="json");this.uri=b+l.toQueryString(d);this.headers=c||{};this.body=e;this.requestMode=f;this.timeouts=h;this.requestComplete=!1;g[this.id=String(++a)]=this}var b=function(){},a=0,g={},h,m=window.XDomainRequest;l.inherits(d,t);d.isAvailable=f;var n=d.createRequest=function(a,b,c,e,f){var g=this&&this.timeouts||p.TIMEOUTS;return new d(a,b,l.copy(c),e,f,g)};d.prototype.complete=function(a,b, -c,d){this.requestComplete||(this.requestComplete=!0,b&&this.emit("data",b),this.emit("complete",a,b,c,d),this.dispose())};d.prototype.abort=function(){this.dispose()};d.prototype.exec=function(){function a(){w=h.responseText;for(var b=w.length-1,c,d;Ac)&&0!==h.status){if(void 0=== -v)if(v=h.status,1223===v&&(v=204),clearTimeout(d),z=400>v,204==v)m.complete();else{var e;if(e=3==m.requestMode&&z)e=h,e=e.getResponseHeader&&e.getResponseHeader("transfer-encoding")&&!e.getResponseHeader("content-length");y=e}if(3==c&&y)a();else if(4==c)if(y)b();else a:{try{var f=h.getResponseHeader&&h.getResponseHeader("content-type"),c=null,g=f?"application/json"==f:"text"==h.responseType;w=g?h.responseText:h.response;if(!w){204!=status&&(n=Error("Incomplete response body from server"),n.statusCode= -400,m.complete(n));break a}g&&(w=JSON.parse(String(w)),C=!0);void 0!==w.response&&(v=w.statusCode,z=400>v,c=w.headers,w=w.response)}catch(l){var n=Error("Malformed response body from server: "+l.message);n.statusCode=400;m.complete(n);break a}z?m.complete(null,w,c||f&&{"content-type":f},C):(n=w.error,n||(n=Error("Error response received from server: "+v),n.statusCode=v),m.complete(n))}}};h.send(e)};d.prototype.dispose=function(){var a=this.xhr;if(a){a.onreadystatechange=a.onerror=a.onabort=a.ontimeout= -b;this.xhr=null;var c=this.timer;c&&(clearTimeout(c),this.timer=null);this.requestComplete||a.abort()}delete g[this.id]};f()&&(ba.addUnloadListener(e),"undefined"!==typeof v&&(v.supportsAuthHeaders=h,v.Request=function(a,b,c,d,e){a=n(a,b,c,d,0);a.once("complete",e);a.exec();return a}));return d}();(function(){function e(c,d,b){K.call(this,c,d,b)}l.inherits(e,K);e.isAvailable=Y.isAvailable;e.checkConnectivity=function(e){var d=p.internetUpUrlWithoutExtension+".txt";c.logAction(c.LOG_MICRO,"XHRTransport.checkConnectivity()", -"Sending; "+d);v.Request(d,null,null,null,function(b,a){var d=!b&&"yes"==a.replace(/\n/,"");c.logAction(c.LOG_MICRO,"XHRTransport.checkConnectivity()","Result: "+d);e(null,d)})};e.tryConnect=function(f,d,b,a){var g=new e(f,d,b),h=function(b){a(b)};g.on("error",h);g.on("preconnect",function(){c.logAction(c.LOG_MINOR,"XHRTransport.tryConnect()","viable transport "+g);g.off("error",h);a(null,g)});g.connect()};e.prototype.toString=function(){return"XHRTransport; uri="+this.baseUri+"; isConnected="+this.isConnected}; -e.prototype.createRequest=Y.createRequest;"undefined"!==typeof A&&e.isAvailable()&&(A.httpTransports.xhr=A.transports.xhr=e);return e})();"undefined"!==typeof E&&(U.Rest=C,U.Realtime=E,E.ConnectionManager=A,E.BufferUtils=C.BufferUtils=y,"undefined"!==typeof Crypto&&(E.Crypto=C.Crypto=Crypto),E.Defaults=C.Defaults=p,E.Http=C.Http=v,E.Utils=C.Utils=l,E.Http=C.Http=v,E.Message=C.Message=w,E.PresenceMessage=C.PresenceMessage=z,E.ProtocolMessage=C.ProtocolMessage=x)}).call({}); +1),this.offset+=5,this.array(a);case 222:return a=this.view.getUint16(this.offset+1),this.offset+=3,this.map(a);case 223:return a=this.view.getUint32(this.offset+1),this.offset+=5,this.map(a)}throw Error("Unknown type 0x"+a.toString(16));};return h});q.protocolVersion=1;q.ENVIRONMENT="";q.REST_HOST="rest.ably.io";q.REALTIME_HOST="realtime.ably.io";q.FALLBACK_HOSTS=["A.ably-realtime.com","B.ably-realtime.com","C.ably-realtime.com","D.ably-realtime.com","E.ably-realtime.com"];q.PORT=80;q.TLS_PORT=443; +q.TIMEOUTS={disconnectedRetryTimeout:15E3,suspendedRetryTimeout:3E4,httpRequestTimeout:15E3,connectionStateTtl:6E4,realtimeRequestTimeout:1E4,recvTimeout:9E4,connectionPersistTimeout:15E3};q.httpMaxRetryCount=3;q.version="0.8.17";q.apiVersion="0.8";q.getHost=function(f,b,e){return b=e?b==f.restHost&&f.realtimeHost||b||f.realtimeHost:b||f.restHost};q.getPort=function(b,g){return g||b.tls?b.tlsPort:b.port};q.getHttpScheme=function(b){return b.tls?"https://":"http://"};q.getHosts=function(b){var g=[b.restHost], +e=b.fallbackHosts;b="undefined"!==typeof b.httpMaxRetryCount?b.httpMaxRetryCount:q.httpMaxRetryCount;e&&(g=g.concat(e.slice(0,b)));return g};q.normaliseOptions=function(f){f.host&&(b.deprecated("host","restHost"),f.restHost=f.host);f.wsHost&&(b.deprecated("wsHost","realtimeHost"),f.realtimeHost=f.wsHost);f.queueEvents&&(b.deprecated("queueEvents","queueMessages"),f.queueMessages=f.queueEvents);"queueMessages"in f||(f.queueMessages=!0);if(f.restHost)f.realtimeHost=f.realtimeHost||f.restHost;else{var g= +f.environment&&String(f.environment).toLowerCase()||q.ENVIRONMENT,e=!g||"production"===g;f.restHost=e?q.REST_HOST:g+"-"+q.REST_HOST;f.realtimeHost=e?q.REALTIME_HOST:g+"-"+q.REALTIME_HOST;f.fallbackHosts=e?q.FALLBACK_HOSTS:f.fallbackHosts}f.port=f.port||q.PORT;f.tlsPort=f.tlsPort||q.TLS_PORT;"tls"in f||(f.tls=!0);f.timeouts={};for(var a in q.TIMEOUTS)f.timeouts[a]=f[a]||q.TIMEOUTS[a];return f};var x=function(){function f(){this.any=[];this.events={};this.anyOnce=[];this.eventsOnce={}}function g(a, +c,d){try{c.apply(a,d)}catch(e){b.logAction(b.LOG_ERROR,"EventEmitter.emit()","Unexpected listener exception: "+e+"; stack = "+e.stack)}}function e(a,c,d){var b,f,n,p;for(p=0;p=d?null:c.slice(0,d).join("/"),b.data=h}}};f.fromResponseBody=function(e,a,c,d){c&&(e="msgpack"==c?g.decode(e):JSON.parse(String(e)));for(c=0;ca.code:500>a.statusCode}function g(a){return f(a)||M.isTokenErr(a)}function e(a,b,d,c,e){this.options=a;this.host=b;this.mode=d;this.connectionKey=c;this.connectionSerial=e;this.format=a.useBinaryProtocol?"msgpack":"json"}function a(c, +e){x.call(this);this.realtime=c;this.options=e;var f=e.timeouts;this.states={initialized:{state:"initialized",terminal:!1,queueEvents:!0,sendEvents:!1},connecting:{state:"connecting",terminal:!1,queueEvents:!0,sendEvents:!1,retryDelay:f.realtimeRequestTimeout,failState:"disconnected"},connected:{state:"connected",terminal:!1,queueEvents:!1,sendEvents:!0,failState:"disconnected"},synchronizing:{state:"connected",terminal:!1,queueEvents:!0,sendEvents:!1},disconnected:{state:"disconnected",terminal:!1, +queueEvents:!0,sendEvents:!1,retryDelay:f.disconnectedRetryTimeout},suspended:{state:"suspended",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:f.suspendedRetryTimeout},closing:{state:"closing",terminal:!1,queueEvents:!1,sendEvents:!1,retryDelay:f.realtimeRequestTimeout,failState:"closed"},closed:{state:"closed",terminal:!0,queueEvents:!1,sendEvents:!1},failed:{state:"failed",terminal:!0,queueEvents:!1,sendEvents:!1}};this.state=this.states.initialized;this.errorReason=null;this.queuedMessages= +new Y;this.msgSerial=0;this.connectionSerial=this.connectionKey=this.connectionId=void 0;this.httpTransports=k.intersect(e.transports||q.httpTransports,a.httpTransports);this.transports=k.intersect(e.transports||q.transports,a.transports);this.upgradeTransports=k.arrSubtract(this.transports,this.httpTransports);this.httpHosts=q.getHosts(e);this.activeProtocol=null;this.pendingTransports=[];this.host=null;b.logAction(b.LOG_MINOR,"Realtime.ConnectionManager()","started");b.logAction(b.LOG_MICRO,"Realtime.ConnectionManager()", +"requested transports = ["+(e.transports||q.transports)+"]");b.logAction(b.LOG_MICRO,"Realtime.ConnectionManager()","available http transports = ["+this.httpTransports+"]");b.logAction(b.LOG_MICRO,"Realtime.ConnectionManager()","available transports = ["+this.transports+"]");b.logAction(b.LOG_MICRO,"Realtime.ConnectionManager()","http hosts = ["+this.httpHosts+"]");if(!this.transports.length)throw b.logAction(b.LOG_ERROR,"realtime.ConnectionManager()","no requested transports available"),Error("no requested transports available"); +d&&!0===e.recover&&window.addEventListener&&window.addEventListener("beforeunload",this.persistConnection.bind(this));if("object"===typeof window&&window.addEventListener){var m=this;window.addEventListener("online",function(){if(m.state==m.states.disconnected||m.state==m.states.suspended)b.logAction(b.LOG_MINOR,"ConnectionManager caught browser \u2018online\u2019 event","reattempting connection"),m.requestState({state:"connecting"})});window.addEventListener("offline",function(){m.state==m.states.connected&& +(b.logAction(b.LOG_MINOR,"ConnectionManager caught browser \u2018offline\u2019 event","disconnecting active transport"),m.disconnectAllTransports())})}}var c="undefined"!==typeof O&&O.read,d="undefined"!==typeof O&&O.create,m="undefined"!==typeof O&&O.erase,h=w.Action,n=Z.PendingMessage,p=function(){};e.prototype.getConnectParams=function(a){a=a?k.copy(a):{};var b=this.options;switch(this.mode){case "upgrade":a.upgrade=this.connectionKey;break;case "resume":a.resume=this.connectionKey;void 0!==this.connectionSerial&& +(a.connection_serial=this.connectionSerial);break;case "recover":if(!0===b.recover){var d=c("ably-connection-key"),e=c("ably-connection-serial");null!==d&&null!==e&&(a.recover=d,a.connection_serial=e)}else if(d=b.recover.match(/^(\w+):(\w+)$/))a.recover=d[1],a.connection_serial=d[2]}void 0!==b.clientId&&(a.clientId=b.clientId);!1===b.echoMessages&&(a.echo="false");void 0!==this.format&&(a.format=this.format);void 0!==this.stream&&(a.stream=this.stream);void 0!==b.transportParams&&k.mixin(a,b.transportParams); +a.v=q.apiVersion;return a};k.inherits(a,x);a.httpTransports={};a.transports={};a.prototype.chooseTransport=function(a){b.logAction(b.LOG_MAJOR,"ConnectionManager.chooseTransport()","");if(this.activeProtocol)b.logAction(b.LOG_MINOR,"ConnectionManager.chooseTransport()","Transport already established"),a(null);else{var d=this.connectionKey?"resume":this.options.recover?"recover":"clean",c=new e(this.options,null,d,this.connectionKey,this.connectionSerial);b.logAction(b.LOG_MINOR,"ConnectionManager.chooseTransport()", +"Transport recovery mode = "+d+("clean"==d?"":"; connectionKey = "+this.connectionKey+"; connectionSerial = "+this.connectionSerial));var f=this;this.httpTransports.length?this.chooseHttpTransport(c,function(d,m){if(d)b.logAction(b.LOG_ERROR,"ConnectionManager.chooseTransport()","Unexpected error establishing transport; err = "+k.inspectError(d)),a(d);else if(b.logAction(b.LOG_MINOR,"ConnectionManager.chooseTransport()","Establishing http transport: "+m),a(null,m),f.upgradeTransports.length)m.once("connected", +function(a,d){k.nextTick(function(){b.logAction(b.LOG_MAJOR,"ConnectionManager.chooseTransport()","upgrading ... connectionKey = "+d);c=new e(f.options,c.host,"upgrade",d);f.chooseTransportForHost(c,f.upgradeTransports.slice(),p)})})}):(c.host=this.httpHosts[0],b.logAction(b.LOG_MINOR,"ConnectionManager.chooseTransport()","No http transports available; ignoring fallback hosts"),this.chooseTransportForHost(c,f.transports.slice(),a))}};a.prototype.chooseTransportForHost=function(d,c,e){var f=c.shift(); +if(f){var m=this;b.logAction(b.LOG_MICRO,"ConnectionManager.chooseTransportForHost()","trying "+f);a.transports[f].tryConnect(this,this.realtime.auth,d,function(a,h){var p=m.state;p==m.states.closing||p==m.states.closed||p==m.states.failed?(b.logAction(b.LOG_MINOR,"ConnectionManager.chooseTransportForHost()","connection closing"),h&&(b.logAction(b.LOG_MINOR,"ConnectionManager.chooseTransportForHost()","closing transport = "+h),h.close()),e(new r("Connection already closed",400,80017))):a?g(a)?e(a): +m.chooseTransportForHost(d,c,e):(b.logAction(b.LOG_MICRO,"ConnectionManager.chooseTransportForHost()","transport "+f+" connecting"),m.setTransportPending(h,d.mode),e(null,h))})}else e(new r("Unable to connect (no available transport)",8E4,404))};a.prototype.chooseHttpTransport=function(b,d){function c(){e.length?a.httpTransports[m.httpTransports[0]].checkConnectivity(function(a,f){a?d(a):f?(b.host=k.arrPopRandomElement(e),m.chooseTransportForHost(b,m.httpTransports.slice(),function(a,b){a?g(a)?d(a): +c():d(null,b)})):d(new r("Unable to connect (network unreachable)",8E4,404))}):d(new r("Unable to connect (no available host)",8E4,404))}var e=this.httpHosts.slice(),f=e.shift();if(f){b.host=f;var m=this;this.chooseTransportForHost(b,this.httpTransports.slice(),function(a,b){a?g(a)?d(a):c():d(null,b)})}else d(new r("Unable to connect (no available host)",8E4,404))};a.prototype.setTransportPending=function(a,d){b.logAction(b.LOG_MINOR,"ConnectionManager.setTransportPending()","transport = "+a+"; mode = "+ +d);this.pendingTransports.push(a);var c=this;a.on("connected",function(b,e,f,m,h){"upgrade"==d&&c.activeProtocol?c.scheduleTransportActivation(a):c.activateTransport(a,e,f,m,h)});for(var e=function(b){return function(d){c.deactivateTransport(a,b,d)}},f=["disconnected","closed","failed"],m=0;mg||300<=g?(c=c&&c.error,c||(c=Error(String(res)),c.statusCode=g),a(c)):a(null,c,f,!0))}}}function a(a){var b=[];if(a)for(var d in a)b.push(d+"="+a[d]);return b.join("&")}function c(d,c,e,f){return function(l,g,k, +z){l?b.logAction(b.LOG_MICRO,"Resource."+c+"()","Received Error; "+(e+(f?"?":"")+a(f))+"; Error: "+JSON.stringify(l)):b.logAction(b.LOG_MICRO,"Resource."+c+"()","Received; "+(e+(f?"?":"")+a(f))+"; Headers: "+a(k)+"; Body: "+(y.isBuffer(g)?g.toString():g));d&&d(l,g,k,z)}}var d="object"==typeof window?window.Ably.msgpack:(void 0)("msgpack-js");f.get=function(d,f,n,p,l,k){function t(c,e){b.shouldLog(b.LOG_MICRO)&&b.logAction(b.LOG_MICRO,"Resource.get()","Sending; "+(f+(e?"?":"")+a(e)));u.get(d,f,c,e, +function(a,b,c,e){a&&M.isTokenErr(a)?d.auth.authorise(null,{force:!0},function(a){a?k(a):g(d,n,p,k,t)}):k(a,b,c,e)})}b.shouldLog(b.LOG_MICRO)&&(k=c(k,"get",f,p));l&&(k=k&&e(k,l),(p=p||{}).envelope=l);g(d,n,p,k,t)};f.post=function(f,h,n,p,l,k,t){function z(c,e){if(b.shouldLog(b.LOG_MICRO)){var k=n;if(0<(c["content-type"]||"").indexOf("msgpack"))try{n=d.decode(n)}catch(A){b.logAction(b.LOG_MICRO,"Resource.post()","Sending MsgPack Decoding Error: "+JSON.stringify(A))}b.logAction(b.LOG_MICRO,"Resource.post()", +"Sending; "+(h+(e?"?":"")+a(e))+"; Body: "+k)}u.post(f,h,c,n,e,function(a,b,d,c){a&&M.isTokenErr(a)?f.auth.authorise(null,{force:!0},function(a){a?t(a):g(f,p,l,t,z)}):t(a,b,d,c)})}b.shouldLog(b.LOG_MICRO)&&(t=c(t,"post",h,l));k&&(t=e(t,k),l.envelope=k);g(f,p,l,t,z)};return f}(),Q=function(){function f(b,a,c,d,f){this.rest=b;this.path=a;this.headers=c;this.envelope=d;this.bodyHandler=f}function g(b,a,c){this.resource=b;this.items=a;var d=this;"first"in c&&(this.first=function(a){d.get(c.first,a)}); +"current"in c&&(this.current=function(a){d.get(c.current,a)});this.next=function(a){"next"in c?d.get(c.next,a):a(null,null)};this.hasNext=function(){return"next"in c};this.isLast=function(){return!this.hasNext()}}f.prototype.get=function(b,a){var c=this;W.get(c.rest,c.path,c.headers,b,c.envelope,function(b,e,f,n){c.handlePage(b,e,f,n,a)})};f.prototype.handlePage=function(e,a,c,d,f){if(e)b.logAction(b.LOG_ERROR,"PaginatedResource.get()","Unexpected error getting resource: err = "+JSON.stringify(e)), +f(e);else{var h,n,p;try{h=this.bodyHandler(a,c,d)}catch(l){f(l);return}if(c&&(n=c.Link||c.link)){e=n;"string"==typeof e&&(e=e.split(","));a={};for(c=0;c;\s*rel="(\w+)"$/))&&(n=(n=d[1].match(/^\.\/(\w+)\?(.*)$/))&&k.parseQueryString(n[2]))&&(a[d[2]]=n);p=a}f(null,new g(this,h,p))}};g.prototype.get=function(b,a){var c=this.resource;W.get(c.rest,c.path,c.headers,b,c.envelope,function(b,e,f,n){c.handlePage(b,e,f,n,a)})};return f}(),M=function(){function f(){}function g(a){if(!a)return""; +"string"==typeof a&&(a=JSON.parse(a));var b={},d=k.keysArray(a,!0);if(!d)return"";d.sort();for(var c=0;c=h){if(!d||!d.force){b.logAction(b.LOG_MINOR,"Auth.getToken()","using cached token; expires = "+f.expires);c(null,f);return}}else b.logAction(b.LOG_MINOR,"Auth.getToken()","deleting expired token"),e.tokenDetails=null;m()}):m()};e.prototype.requestToken=function(a,c,e){"function"!= +typeof a||e?"function"!=typeof c||e||(e=c,c=null):(e=a,c=a=null);c=k.mixin(k.copy(this.client.options),c);a=a||k.copy(this.tokenParams);e=e||f;var m=c.format||"json",h,z=this.client;if(c.authCallback)b.logAction(b.LOG_MINOR,"Auth.requestToken()","using token auth with auth_callback"),h=c.authCallback;else if(c.authUrl)b.logAction(b.LOG_MINOR,"Auth.requestToken()","using token auth with auth_url"),c.authParams||(h=c.authUrl.indexOf("?"),-1a.code};return e}(),D=function(){function f(a){if(!(this instanceof f))return new f(a);if(!a){var c="no options provided";b.logAction(b.LOG_ERROR,"Rest()",c);throw Error(c);}"string"==typeof a&&(a=-1==a.indexOf(":")?{token:a}:{key:a});this.options=q.normaliseOptions(a);y.supportsBinary&&!0===this.options.useBinaryProtocol||(this.options.useBinaryProtocol=!1);if(a.key){c=a.key.match(/^([^:\s]+):([^:.\s]+)$/);if(!c)throw c="invalid key parameter",b.logAction(b.LOG_ERROR,"Rest()",c),Error(c); +a.keyName=c[1];a.keySecret=c[2]}if("clientId"in a){if("string"!==typeof a.clientId&&null!==a.clientId)throw new r("clientId must be either a string or null",40012,400);if("*"===a.clientId)throw new r('Can\u2019t use "*" as a clientId as that string is reserved. (To change the default token request behaviour to use a wildcard clientId, use {defaultTokenParams: {clientId: "*"}})',40012,400);}a.log&&b.setLog(a.log.level,a.log.handler);b.logAction(b.LOG_MINOR,"Rest()","started");this.baseUri=this.authority= +function(b){return q.getHttpScheme(a)+b+":"+q.getPort(a,!1)};this.serverTimeOffset=null;this.auth=new M(this,a);this.channels=new g(this)}function g(a){this.rest=a;this.attached={}}var e=function(){};f.prototype.stats=function(a,b){void 0===b&&("function"==typeof a?(b=a,a=null):b=e);var d=k.copy(k.defaultGetHeaders()),f=u.supportsLinkHeaders?void 0:"json";this.options.headers&&k.mixin(d,this.options.headers);(new Q(this,"/stats",d,f,function(a,b,d){a=d?a:JSON.parse(a);for(b=0;ba.statusCode?g.complete(null,b,a.headers):(a=b.error||new r("Error response received from server",5E4,a.statusCode),g.complete(a)):g.complete(new r("Invalid server response: no envelope detected", +5E4,500))}else g.complete(null,a)};this.timer=setTimeout(function(){g.abort()},this.requestMode==N.REQ_SEND?this.timeouts.httpRequestTimeout:this.timeouts.recvTimeout);d.insertBefore(c,d.firstChild)};g.prototype.complete=function(a,b,c){c=c||{};this.requestComplete||(this.requestComplete=!0,b&&(c["content-type"]="string"==typeof b?"text/plain":"application/json",this.emit("data",b)),this.emit("complete",a,b,c,!0),this.dispose())};g.prototype.abort=function(){this.dispose()};g.prototype.dispose=function(){var b= +this.timer;b&&(clearTimeout(b),this.timer=null);b=this.script;b.parentNode&&b.parentNode.removeChild(b);delete a[this.id];this.emit("disposed")};u.Request=function(a,b,c,d,e){var f=h(a,b,c,d,N.REQ_SEND);f.once("complete",e);k.nextTick(function(){f.exec()});return f};return f})();var aa=function(){function f(){for(var a in d)d[a].dispose()}function g(){return m=window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}function e(a,b,e,f,g,m){x.call(this);e=e||{};e.rnd=k.randStr();var n,q;if(q= +h)q=n=(n=navigator.userAgent.toString().match(/MSIE\s([\d.]+)/))&&Number(n[1]);q&&10===n&&!e.envelope&&(e.envelope="json");this.uri=a+k.toQueryString(e);this.headers=b||{};this.body=f;this.requestMode=g;this.timeouts=m;this.requestComplete=!1;d[this.id=String(++c)]=this}var a=function(){},c=0,d={},m,h=window.XDomainRequest;k.inherits(e,x);e.isAvailable=g;var n=e.createRequest=function(a,b,c,d,f){var g=this&&this.timeouts||q.TIMEOUTS;return new e(a,b,k.copy(c),d,f,g)};e.prototype.complete=function(a, +b,c,d){this.requestComplete||(this.requestComplete=!0,b&&this.emit("data",b),this.emit("complete",a,b,c,d),this.dispose())};e.prototype.abort=function(){this.dispose()};e.prototype.exec=function(){function a(){v=h.responseText;for(var b=v.length-1,c,d;Cb)&&0!==h.status){if(void 0=== +u)if(u=h.status,1223===u&&(u=204),clearTimeout(d),B=400>u,204==u)m.complete();else{var e;if(e=3==m.requestMode&&B)e=h,e=e.getResponseHeader&&e.getResponseHeader("transfer-encoding")&&!e.getResponseHeader("content-length");y=e}if(3==b&&y)a();else if(4==b)if(y)c();else a:{try{var f=h.getResponseHeader&&h.getResponseHeader("content-type"),b=null,g=f?"application/json"==f:"text"==h.responseType;v=g?h.responseText:h.response;if(!v){204!=status&&(n=Error("Incomplete response body from server"),n.statusCode= +400,m.complete(n));break a}g&&(v=JSON.parse(String(v)),D=!0);void 0!==v.response&&(u=v.statusCode,B=400>u,b=v.headers,v=v.response)}catch(k){var n=Error("Malformed response body from server: "+k.message);n.statusCode=400;m.complete(n);break a}B?m.complete(null,v,b||f&&{"content-type":f},D):(n=v.error,n||(n=Error("Error response received from server: "+u),n.statusCode=u),m.complete(n))}}};h.send(e)};e.prototype.dispose=function(){var b=this.xhr;if(b){b.onreadystatechange=b.onerror=b.onabort=b.ontimeout= +a;this.xhr=null;var c=this.timer;c&&(clearTimeout(c),this.timer=null);this.requestComplete||b.abort()}delete d[this.id]};g()&&(ca.addUnloadListener(f),"undefined"!==typeof u&&(u.supportsAuthHeaders=m,u.Request=function(a,b,c,d,e){a=n(a,b,c,d,0);a.once("complete",e);a.exec();return a}));return e}();(function(){function f(b,e,a){N.call(this,b,e,a)}k.inherits(f,N);f.isAvailable=aa.isAvailable;f.checkConnectivity=function(f){var e=q.internetUpUrlWithoutExtension+".txt";b.logAction(b.LOG_MICRO,"XHRTransport.checkConnectivity()", +"Sending; "+e);u.Request(e,null,null,null,function(a,c){var d=!a&&"yes"==c.replace(/\n/,"");b.logAction(b.LOG_MICRO,"XHRTransport.checkConnectivity()","Result: "+d);f(null,d)})};f.tryConnect=function(g,e,a,c){var d=new f(g,e,a),k=function(a){c(a)};d.on("error",k);d.on("preconnect",function(){b.logAction(b.LOG_MINOR,"XHRTransport.tryConnect()","viable transport "+d);d.off("error",k);c(null,d)});d.connect()};f.prototype.toString=function(){return"XHRTransport; uri="+this.baseUri+"; isConnected="+this.isConnected}; +f.prototype.createRequest=aa.createRequest;"undefined"!==typeof C&&f.isAvailable()&&(C.httpTransports.xhr=C.transports.xhr=f);return f})();"undefined"!==typeof F&&(X.Rest=D,X.Realtime=F,F.ConnectionManager=C,F.BufferUtils=D.BufferUtils=y,"undefined"!==typeof Crypto&&(F.Crypto=D.Crypto=Crypto),F.Defaults=D.Defaults=q,F.Http=D.Http=u,F.Utils=D.Utils=k,F.Http=D.Http=u,F.Message=D.Message=v,F.PresenceMessage=D.PresenceMessage=B,F.ProtocolMessage=D.ProtocolMessage=w)}).call({}); diff --git a/browser/static/compat-pubnub.js b/browser/static/compat-pubnub.js index ce6a4a2e73..556c6680f9 100644 --- a/browser/static/compat-pubnub.js +++ b/browser/static/compat-pubnub.js @@ -1,7 +1,7 @@ /** * @license Copyright 2016, Ably * - * Ably JavaScript Library v0.8.16 + * Ably JavaScript Library v0.8.17 * https://github.com/ably/ably-js * * Ably Realtime Messaging diff --git a/browser/static/compat-pubnub.min.js b/browser/static/compat-pubnub.min.js index 38877efd9d..093d675582 100644 --- a/browser/static/compat-pubnub.min.js +++ b/browser/static/compat-pubnub.min.js @@ -1,7 +1,7 @@ /* Copyright 2016, Ably - Ably JavaScript Library v0.8.16 + Ably JavaScript Library v0.8.17 https://github.com/ably/ably-js Ably Realtime Messaging diff --git a/browser/static/compat-pusher.js b/browser/static/compat-pusher.js index bf68584ab5..6ebfc629c7 100644 --- a/browser/static/compat-pusher.js +++ b/browser/static/compat-pusher.js @@ -1,7 +1,7 @@ /** * @license Copyright 2016, Ably * - * Ably JavaScript Library v0.8.16 + * Ably JavaScript Library v0.8.17 * https://github.com/ably/ably-js * * Ably Realtime Messaging @@ -506,8 +506,8 @@ var Utils = (function() { }; }; - Utils.arrRandomElement = function(arr) { - return arr.splice(Math.floor(Math.random() * arr.length)); + Utils.arrPopRandomElement = function(arr) { + return arr.splice(Math.floor(Math.random() * arr.length), 1)[0]; }; Utils.toQueryString = function(params) { diff --git a/browser/static/compat-pusher.min.js b/browser/static/compat-pusher.min.js index 8fee8a6570..39fdaf26ba 100644 --- a/browser/static/compat-pusher.min.js +++ b/browser/static/compat-pusher.min.js @@ -1,7 +1,7 @@ /* Copyright 2016, Ably - Ably JavaScript Library v0.8.16 + Ably JavaScript Library v0.8.17 https://github.com/ably/ably-js Ably Realtime Messaging @@ -18,7 +18,7 @@ Object.prototype.toString.call(a)};b.isEmpty=function(a){for(var d in a)return!1 d)return!0;return!1};b.intersect=function(a,d){return b.isArray(d)?b.arrIntersect(a,d):b.arrIntersectOb(a,d)};b.arrIntersect=function(a,d){for(var e=[],c=0;c