diff --git a/files/assets/js/pusher.js b/files/assets/js/pusher.js index bffb3650e1..4b9d91e3bd 100644 --- a/files/assets/js/pusher.js +++ b/files/assets/js/pusher.js @@ -1 +1,2614 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Pusher=e():t.Pusher=e()}(window,(function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var o in t)n.d(r,o,function(e){return t[e]}.bind(null,o));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=2)}([function(t,e,n){"use strict";var r,o=this&&this.__extends||(r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)},function(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function t(t){void 0===t&&(t="="),this._paddingCharacter=t}return t.prototype.encodedLength=function(t){return this._paddingCharacter?(t+2)/3*4|0:(8*t+5)/6|0},t.prototype.encode=function(t){for(var e="",n=0;n>>18&63),e+=this._encodeByte(r>>>12&63),e+=this._encodeByte(r>>>6&63),e+=this._encodeByte(r>>>0&63)}var o=t.length-n;if(o>0){r=t[n]<<16|(2===o?t[n+1]<<8:0);e+=this._encodeByte(r>>>18&63),e+=this._encodeByte(r>>>12&63),e+=2===o?this._encodeByte(r>>>6&63):this._paddingCharacter||"",e+=this._paddingCharacter||""}return e},t.prototype.maxDecodedLength=function(t){return this._paddingCharacter?t/4*3|0:(6*t+7)/8|0},t.prototype.decodedLength=function(t){return this.maxDecodedLength(t.length-this._getPaddingLength(t))},t.prototype.decode=function(t){if(0===t.length)return new Uint8Array(0);for(var e=this._getPaddingLength(t),n=t.length-e,r=new Uint8Array(this.maxDecodedLength(n)),o=0,i=0,s=0,c=0,a=0,u=0,h=0;i>>4,r[o++]=a<<4|u>>>2,r[o++]=u<<6|h,s|=256&c,s|=256&a,s|=256&u,s|=256&h;if(i>>4,s|=256&c,s|=256&a),i>>2,s|=256&u),i>>8&6,e+=51-t>>>8&-75,e+=61-t>>>8&-15,e+=62-t>>>8&3,String.fromCharCode(e)},t.prototype._decodeChar=function(t){var e=256;return e+=(42-t&t-44)>>>8&-256+t-43+62,e+=(46-t&t-48)>>>8&-256+t-47+63,e+=(47-t&t-58)>>>8&-256+t-48+52,e+=(64-t&t-91)>>>8&-256+t-65+0,e+=(96-t&t-123)>>>8&-256+t-97+26},t.prototype._getPaddingLength=function(t){var e=0;if(this._paddingCharacter){for(var n=t.length-1;n>=0&&t[n]===this._paddingCharacter;n--)e++;if(t.length<4||e>2)throw new Error("Base64Coder: incorrect padding")}return e},t}();e.Coder=i;var s=new i;e.encode=function(t){return s.encode(t)},e.decode=function(t){return s.decode(t)};var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype._encodeByte=function(t){var e=t;return e+=65,e+=25-t>>>8&6,e+=51-t>>>8&-75,e+=61-t>>>8&-13,e+=62-t>>>8&49,String.fromCharCode(e)},e.prototype._decodeChar=function(t){var e=256;return e+=(44-t&t-46)>>>8&-256+t-45+62,e+=(94-t&t-96)>>>8&-256+t-95+63,e+=(47-t&t-58)>>>8&-256+t-48+52,e+=(64-t&t-91)>>>8&-256+t-65+0,e+=(96-t&t-123)>>>8&-256+t-97+26},e}(i);e.URLSafeCoder=c;var a=new c;e.encodeURLSafe=function(t){return a.encode(t)},e.decodeURLSafe=function(t){return a.decode(t)},e.encodedLength=function(t){return s.encodedLength(t)},e.maxDecodedLength=function(t){return s.maxDecodedLength(t)},e.decodedLength=function(t){return s.decodedLength(t)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r="utf8: invalid source encoding";function o(t){for(var e=0,n=0;n=t.length-1)throw new Error("utf8: invalid string");n++,e+=4}}return e}e.encode=function(t){for(var e=new Uint8Array(o(t)),n=0,r=0;r>6,e[n++]=128|63&i):i<55296?(e[n++]=224|i>>12,e[n++]=128|i>>6&63,e[n++]=128|63&i):(r++,i=(1023&i)<<10,i|=1023&t.charCodeAt(r),i+=65536,e[n++]=240|i>>18,e[n++]=128|i>>12&63,e[n++]=128|i>>6&63,e[n++]=128|63&i)}return e},e.encodedLength=o,e.decode=function(t){for(var e=[],n=0;n=t.length)throw new Error(r);if(128!=(192&(s=t[++n])))throw new Error(r);o=(31&o)<<6|63&s,i=128}else if(o<240){if(n>=t.length-1)throw new Error(r);var s=t[++n],c=t[++n];if(128!=(192&s)||128!=(192&c))throw new Error(r);o=(15&o)<<12|(63&s)<<6|63&c,i=2048}else{if(!(o<248))throw new Error(r);if(n>=t.length-2)throw new Error(r);s=t[++n],c=t[++n];var a=t[++n];if(128!=(192&s)||128!=(192&c)||128!=(192&a))throw new Error(r);o=(15&o)<<18|(63&s)<<12|(63&c)<<6|63&a,i=65536}if(o=55296&&o<=57343)throw new Error(r);if(o>=65536){if(o>1114111)throw new Error(r);o-=65536,e.push(String.fromCharCode(55296|o>>10)),o=56320|1023&o}}e.push(String.fromCharCode(o))}return e.join("")}},function(t,e,n){t.exports=n(3).default},function(t,e,n){"use strict";n.r(e);var r,o=function(){function t(t,e){this.lastId=0,this.prefix=t,this.name=e}return t.prototype.create=function(t){this.lastId++;var e=this.lastId,n=this.prefix+e,r=this.name+"["+e+"]",o=!1,i=function(){o||(t.apply(null,arguments),o=!0)};return this[e]=i,{number:e,id:n,name:r,callback:i}},t.prototype.remove=function(t){delete this[t.number]},t}(),i=new o("_pusher_script_","Pusher.ScriptReceivers"),s={VERSION:"7.2.0",PROTOCOL:7,wsPort:80,wssPort:443,wsPath:"",httpHost:"sockjs.pusher.com",httpPort:80,httpsPort:443,httpPath:"/pusher",stats_host:"stats.pusher.com",authEndpoint:"/pusher/auth",authTransport:"ajax",activityTimeout:12e4,pongTimeout:3e4,unavailableTimeout:1e4,cluster:"mt1",userAuthentication:{endpoint:"/pusher/user-auth",transport:"ajax"},channelAuthorization:{endpoint:"/pusher/auth",transport:"ajax"},cdn_http:"http://js.pusher.com",cdn_https:"https://js.pusher.com",dependency_suffix:""},c=function(){function t(t){this.options=t,this.receivers=t.receivers||i,this.loading={}}return t.prototype.load=function(t,e,n){var r=this;if(r.loading[t]&&r.loading[t].length>0)r.loading[t].push(n);else{r.loading[t]=[n];var o=Se.createScriptRequest(r.getPath(t,e)),i=r.receivers.create((function(e){if(r.receivers.remove(i),r.loading[t]){var n=r.loading[t];delete r.loading[t];for(var s=function(t){t||o.cleanup()},c=0;c>>6)+C(128|63&e):C(224|e>>>12&15)+C(128|e>>>6&63)+C(128|63&e)},L=function(t){return t.replace(/[^\x00-\x7F]/g,A)},x=function(t){var e=[0,2,1][t.length%3],n=t.charCodeAt(0)<<16|(t.length>1?t.charCodeAt(1):0)<<8|(t.length>2?t.charCodeAt(2):0);return[T.charAt(n>>>18),T.charAt(n>>>12&63),e>=2?"=":T.charAt(n>>>6&63),e>=1?"=":T.charAt(63&n)].join("")},R=window.btoa||function(t){return t.replace(/[\s\S]{1,3}/g,x)},j=function(){function t(t,e,n,r){var o=this;this.clear=e,this.timer=t((function(){o.timer&&(o.timer=r(o.timer))}),n)}return t.prototype.isRunning=function(){return null!==this.timer},t.prototype.ensureAborted=function(){this.timer&&(this.clear(this.timer),this.timer=null)},t}(),I=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}();function D(t){window.clearTimeout(t)}function N(t){window.clearInterval(t)}var H=function(t){function e(e,n){return t.call(this,setTimeout,D,e,(function(t){return n(),null}))||this}return I(e,t),e}(j),M=function(t){function e(e,n){return t.call(this,setInterval,N,e,(function(t){return n(),t}))||this}return I(e,t),e}(j),U={now:function(){return Date.now?Date.now():(new Date).valueOf()},defer:function(t){return new H(0,t)},method:function(t){for(var e=[],n=1;n0)for(r=0;r=1002&&t.code<=1004?"backoff":null:4e3===t.code?"tls_only":t.code<4100?"refused":t.code<4200?"backoff":t.code<4300?"retry":"refused"},getCloseError:function(t){return 1e3!==t.code&&1001!==t.code?{type:"PusherError",data:{code:t.code,message:t.reason||t.message}}:null}},Lt=At,xt=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Rt=function(t){function e(e,n){var r=t.call(this)||this;return r.id=e,r.transport=n,r.activityTimeout=n.activityTimeout,r.bindListeners(),r}return xt(e,t),e.prototype.handlesActivityChecks=function(){return this.transport.handlesActivityChecks()},e.prototype.send=function(t){return this.transport.send(t)},e.prototype.send_event=function(t,e,n){var r={event:t,data:e};return n&&(r.channel=n),Z.debug("Event sent",r),this.send(Lt.encodeMessage(r))},e.prototype.ping=function(){this.transport.supportsPing()?this.transport.ping():this.send_event("pusher:ping",{})},e.prototype.close=function(){this.transport.close()},e.prototype.bindListeners=function(){var t=this,e={message:function(e){var n;try{n=Lt.decodeMessage(e)}catch(n){t.emit("error",{type:"MessageParseError",error:n,data:e.data})}if(void 0!==n){switch(Z.debug("Event recd",n),n.event){case"pusher:error":t.emit("error",{type:"PusherError",data:n.data});break;case"pusher:ping":t.emit("ping");break;case"pusher:pong":t.emit("pong")}t.emit("message",n)}},activity:function(){t.emit("activity")},error:function(e){t.emit("error",e)},closed:function(e){n(),e&&e.code&&t.handleCloseEvent(e),t.transport=null,t.emit("closed")}},n=function(){F(e,(function(e,n){t.transport.unbind(n,e)}))};F(e,(function(e,n){t.transport.bind(n,e)}))},e.prototype.handleCloseEvent=function(t){var e=Lt.getCloseAction(t),n=Lt.getCloseError(t);n&&this.emit("error",n),e&&this.emit(e,{action:e,error:n})},e}(pt),jt=function(){function t(t,e){this.transport=t,this.callback=e,this.bindListeners()}return t.prototype.close=function(){this.unbindListeners(),this.transport.close()},t.prototype.bindListeners=function(){var t=this;this.onMessage=function(e){var n;t.unbindListeners();try{n=Lt.processHandshake(e)}catch(e){return t.finish("error",{error:e}),void t.transport.close()}"connected"===n.action?t.finish("connected",{connection:new Rt(n.id,t.transport),activityTimeout:n.activityTimeout}):(t.finish(n.action,{error:n.error}),t.transport.close())},this.onClosed=function(e){t.unbindListeners();var n=Lt.getCloseAction(e)||"backoff",r=Lt.getCloseError(e);t.finish(n,{error:r})},this.transport.bind("message",this.onMessage),this.transport.bind("closed",this.onClosed)},t.prototype.unbindListeners=function(){this.transport.unbind("message",this.onMessage),this.transport.unbind("closed",this.onClosed)},t.prototype.finish=function(t,e){this.callback(z({transport:this.transport,action:t},e))},t}(),It=function(){function t(t,e){this.timeline=t,this.options=e||{}}return t.prototype.send=function(t,e){this.timeline.isEmpty()||this.timeline.send(Se.TimelineTransport.getAgent(this,t),e)},t}(),Dt=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Nt=function(t){function e(e,n){var r=t.call(this,(function(t,n){Z.debug("No callbacks on "+e+" for "+t)}))||this;return r.name=e,r.pusher=n,r.subscribed=!1,r.subscriptionPending=!1,r.subscriptionCancelled=!1,r}return Dt(e,t),e.prototype.authorize=function(t,e){return e(null,{auth:""})},e.prototype.trigger=function(t,e){if(0!==t.indexOf("client-"))throw new d("Event '"+t+"' does not start with 'client-'");if(!this.subscribed){var n=p("triggeringClientEvents");Z.warn("Client event triggered before channel 'subscription_succeeded' event . "+n)}return this.pusher.send_event(t,e,this.name)},e.prototype.disconnect=function(){this.subscribed=!1,this.subscriptionPending=!1},e.prototype.handleEvent=function(t){var e=t.event,n=t.data;if("pusher_internal:subscription_succeeded"===e)this.handleSubscriptionSucceededEvent(t);else if("pusher_internal:subscription_count"===e)this.handleSubscriptionCountEvent(t);else if(0!==e.indexOf("pusher_internal:")){this.emit(e,n,{})}},e.prototype.handleSubscriptionSucceededEvent=function(t){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):this.emit("pusher:subscription_succeeded",t.data)},e.prototype.handleSubscriptionCountEvent=function(t){t.data.subscription_count&&(this.subscriptionCount=t.data.subscription_count),this.emit("pusher:subscription_count",t.data)},e.prototype.subscribe=function(){var t=this;this.subscribed||(this.subscriptionPending=!0,this.subscriptionCancelled=!1,this.authorize(this.pusher.connection.socket_id,(function(e,n){e?(t.subscriptionPending=!1,Z.error(e.toString()),t.emit("pusher:subscription_error",Object.assign({},{type:"AuthError",error:e.message},e instanceof S?{status:e.status}:{}))):t.pusher.send_event("pusher:subscribe",{auth:n.auth,channel_data:n.channel_data,channel:t.name})})))},e.prototype.unsubscribe=function(){this.subscribed=!1,this.pusher.send_event("pusher:unsubscribe",{channel:this.name})},e.prototype.cancelSubscription=function(){this.subscriptionCancelled=!0},e.prototype.reinstateSubscription=function(){this.subscriptionCancelled=!1},e}(pt),Ht=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Mt=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return Ht(e,t),e.prototype.authorize=function(t,e){return this.pusher.config.channelAuthorizer({channelName:this.name,socketId:t},e)},e}(Nt),Ut=function(){function t(){this.reset()}return t.prototype.get=function(t){return Object.prototype.hasOwnProperty.call(this.members,t)?{id:t,info:this.members[t]}:null},t.prototype.each=function(t){var e=this;F(this.members,(function(n,r){t(e.get(r))}))},t.prototype.setMyID=function(t){this.myID=t},t.prototype.onSubscription=function(t){this.members=t.presence.hash,this.count=t.presence.count,this.me=this.get(this.myID)},t.prototype.addMember=function(t){return null===this.get(t.user_id)&&this.count++,this.members[t.user_id]=t.user_info,this.get(t.user_id)},t.prototype.removeMember=function(t){var e=this.get(t.user_id);return e&&(delete this.members[t.user_id],this.count--),e},t.prototype.reset=function(){this.members={},this.count=0,this.myID=null,this.me=null},t}(),zt=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),qt=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.members=new Ut,r}return zt(e,t),e.prototype.authorize=function(e,n){var r=this;t.prototype.authorize.call(this,e,(function(t,e){if(!t){if(void 0===(e=e).channel_data){var o=p("authenticationEndpoint");return Z.error("Invalid auth response for channel '"+r.name+"',expected 'channel_data' field. "+o),void n("Invalid auth response")}var i=JSON.parse(e.channel_data);r.members.setMyID(i.user_id)}n(t,e)}))},e.prototype.handleEvent=function(t){var e=t.event;if(0===e.indexOf("pusher_internal:"))this.handleInternalEvent(t);else{var n=t.data,r={};t.user_id&&(r.user_id=t.user_id),this.emit(e,n,r)}},e.prototype.handleInternalEvent=function(t){var e=t.event,n=t.data;switch(e){case"pusher_internal:subscription_succeeded":this.handleSubscriptionSucceededEvent(t);break;case"pusher_internal:subscription_count":this.handleSubscriptionCountEvent(t);break;case"pusher_internal:member_added":var r=this.members.addMember(n);this.emit("pusher:member_added",r);break;case"pusher_internal:member_removed":var o=this.members.removeMember(n);o&&this.emit("pusher:member_removed",o)}},e.prototype.handleSubscriptionSucceededEvent=function(t){this.subscriptionPending=!1,this.subscribed=!0,this.subscriptionCancelled?this.pusher.unsubscribe(this.name):(this.members.onSubscription(t.data),this.emit("pusher:subscription_succeeded",this.members))},e.prototype.disconnect=function(){this.members.reset(),t.prototype.disconnect.call(this)},e}(Mt),Bt=n(1),Ft=n(0),Xt=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),Jt=function(t){function e(e,n,r){var o=t.call(this,e,n)||this;return o.key=null,o.nacl=r,o}return Xt(e,t),e.prototype.authorize=function(e,n){var r=this;t.prototype.authorize.call(this,e,(function(t,e){if(t)n(t,e);else{var o=e.shared_secret;o?(r.key=Object(Ft.decode)(o),delete e.shared_secret,n(null,e)):n(new Error("No shared_secret key in auth payload for encrypted channel: "+r.name),null)}}))},e.prototype.trigger=function(t,e){throw new m("Client events are not currently supported for encrypted channels")},e.prototype.handleEvent=function(e){var n=e.event,r=e.data;0!==n.indexOf("pusher_internal:")&&0!==n.indexOf("pusher:")?this.handleEncryptedEvent(n,r):t.prototype.handleEvent.call(this,e)},e.prototype.handleEncryptedEvent=function(t,e){var n=this;if(this.key)if(e.ciphertext&&e.nonce){var r=Object(Ft.decode)(e.ciphertext);if(r.length0&&this.emit("connecting_in",Math.round(t/1e3)),this.retryTimer=new H(t||0,(function(){e.disconnectInternally(),e.connect()}))},e.prototype.clearRetryTimer=function(){this.retryTimer&&(this.retryTimer.ensureAborted(),this.retryTimer=null)},e.prototype.setUnavailableTimer=function(){var t=this;this.unavailableTimer=new H(this.options.unavailableTimeout,(function(){t.updateState("unavailable")}))},e.prototype.clearUnavailableTimer=function(){this.unavailableTimer&&this.unavailableTimer.ensureAborted()},e.prototype.sendActivityCheck=function(){var t=this;this.stopActivityCheck(),this.connection.ping(),this.activityTimer=new H(this.options.pongTimeout,(function(){t.timeline.error({pong_timed_out:t.options.pongTimeout}),t.retryIn(0)}))},e.prototype.resetActivityCheck=function(){var t=this;this.stopActivityCheck(),this.connection&&!this.connection.handlesActivityChecks()&&(this.activityTimer=new H(this.activityTimeout,(function(){t.sendActivityCheck()})))},e.prototype.stopActivityCheck=function(){this.activityTimer&&this.activityTimer.ensureAborted()},e.prototype.buildConnectionCallbacks=function(t){var e=this;return z({},t,{message:function(t){e.resetActivityCheck(),e.emit("message",t)},ping:function(){e.send_event("pusher:pong",{})},activity:function(){e.resetActivityCheck()},error:function(t){e.emit("error",t)},closed:function(){e.abandonConnection(),e.shouldRetry()&&e.retryIn(1e3)}})},e.prototype.buildHandshakeCallbacks=function(t){var e=this;return z({},t,{connected:function(t){e.activityTimeout=Math.min(e.options.activityTimeout,t.activityTimeout,t.connection.activityTimeout||1/0),e.clearUnavailableTimer(),e.setConnection(t.connection),e.socket_id=e.connection.id,e.updateState("connected",{socket_id:e.socket_id})}})},e.prototype.buildErrorCallbacks=function(){var t=this,e=function(e){return function(n){n.error&&t.emit("error",{type:"WebSocketError",error:n.error}),e(n)}};return{tls_only:e((function(){t.usingTLS=!0,t.updateStrategy(),t.retryIn(0)})),refused:e((function(){t.disconnect()})),backoff:e((function(){t.retryIn(1e3)})),retry:e((function(){t.retryIn(0)}))}},e.prototype.setConnection=function(t){for(var e in this.connection=t,this.connectionCallbacks)this.connection.bind(e,this.connectionCallbacks[e]);this.resetActivityCheck()},e.prototype.abandonConnection=function(){if(this.connection){for(var t in this.stopActivityCheck(),this.connectionCallbacks)this.connection.unbind(t,this.connectionCallbacks[t]);var e=this.connection;return this.connection=null,e}},e.prototype.updateState=function(t,e){var n=this.state;if(this.state=t,n!==t){var r=t;"connected"===r&&(r+=" with new socket ID "+e.socket_id),Z.debug("State changed",n+" -> "+r),this.timeline.info({state:t,params:e}),this.emit("state_change",{previous:n,current:t}),this.emit(t,e)}},e.prototype.shouldRetry=function(){return"connecting"===this.state||"connected"===this.state},e}(pt),Vt=function(){function t(){this.channels={}}return t.prototype.add=function(t,e){return this.channels[t]||(this.channels[t]=function(t,e){if(0===t.indexOf("private-encrypted-")){if(e.config.nacl)return Qt.createEncryptedChannel(t,e,e.config.nacl);var n=p("encryptedChannelSupport");throw new m("Tried to subscribe to a private-encrypted- channel but no nacl implementation available. "+n)}if(0===t.indexOf("private-"))return Qt.createPrivateChannel(t,e);if(0===t.indexOf("presence-"))return Qt.createPresenceChannel(t,e);if(0===t.indexOf("#"))throw new y('Cannot create a channel with name "'+t+'".');return Qt.createChannel(t,e)}(t,e)),this.channels[t]},t.prototype.all=function(){return function(t){var e=[];return F(t,(function(t){e.push(t)})),e}(this.channels)},t.prototype.find=function(t){return this.channels[t]},t.prototype.remove=function(t){var e=this.channels[t];return delete this.channels[t],e},t.prototype.disconnect=function(){F(this.channels,(function(t){t.disconnect()}))},t}();var Qt={createChannels:function(){return new Vt},createConnectionManager:function(t,e){return new Gt(t,e)},createChannel:function(t,e){return new Nt(t,e)},createPrivateChannel:function(t,e){return new Mt(t,e)},createPresenceChannel:function(t,e){return new qt(t,e)},createEncryptedChannel:function(t,e,n){return new Jt(t,e,n)},createTimelineSender:function(t,e){return new It(t,e)},createHandshake:function(t,e){return new jt(t,e)},createAssistantToTheTransportManager:function(t,e,n){return new Et(t,e,n)}},Yt=function(){function t(t){this.options=t||{},this.livesLeft=this.options.lives||1/0}return t.prototype.getAssistant=function(t){return Qt.createAssistantToTheTransportManager(this,t,{minPingDelay:this.options.minPingDelay,maxPingDelay:this.options.maxPingDelay})},t.prototype.isAlive=function(){return this.livesLeft>0},t.prototype.reportDeath=function(){this.livesLeft-=1},t}(),$t=function(){function t(t,e){this.strategies=t,this.loop=Boolean(e.loop),this.failFast=Boolean(e.failFast),this.timeout=e.timeout,this.timeoutLimit=e.timeoutLimit}return t.prototype.isSupported=function(){return Q(this.strategies,U.method("isSupported"))},t.prototype.connect=function(t,e){var n=this,r=this.strategies,o=0,i=this.timeout,s=null,c=function(a,u){u?e(null,u):(o+=1,n.loop&&(o%=r.length),o0&&(o=new H(n.timeout,(function(){i.abort(),r(!0)}))),i=t.connect(e,(function(t,e){t&&o&&o.isRunning()&&!n.failFast||(o&&o.ensureAborted(),r(t,e))})),{abort:function(){o&&o.ensureAborted(),i.abort()},forceMinPriority:function(t){i.forceMinPriority(t)}}},t}(),Kt=function(){function t(t){this.strategies=t}return t.prototype.isSupported=function(){return Q(this.strategies,U.method("isSupported"))},t.prototype.connect=function(t,e){return function(t,e,n){var r=W(t,(function(t,r,o,i){return t.connect(e,n(r,i))}));return{abort:function(){J(r,Zt)},forceMinPriority:function(t){J(r,(function(e){e.forceMinPriority(t)}))}}}(this.strategies,t,(function(t,n){return function(r,o){n[t].error=r,r?function(t){return function(t,e){for(var n=0;n=U.now()){var i=this.transports[r.transport];i&&(this.timeline.info({cached:!0,transport:r.transport,latency:r.latency}),o.push(new $t([i],{timeout:2*r.latency+1e3,failFast:!0})))}var s=U.now(),c=o.pop().connect(t,(function r(i,a){i?(ne(n),o.length>0?(s=U.now(),c=o.pop().connect(t,r)):e(i)):(!function(t,e,n){var r=Se.getLocalStorage();if(r)try{r[ee(t)]=K({timestamp:U.now(),transport:e,latency:n})}catch(t){}}(n,a.transport.name,U.now()-s),e(null,a))}));return{abort:function(){c.abort()},forceMinPriority:function(e){t=e,c&&c.forceMinPriority(e)}}},t}();function ee(t){return"pusherTransport"+(t?"TLS":"NonTLS")}function ne(t){var e=Se.getLocalStorage();if(e)try{delete e[ee(t)]}catch(t){}}var re=function(){function t(t,e){var n=e.delay;this.strategy=t,this.options={delay:n}}return t.prototype.isSupported=function(){return this.strategy.isSupported()},t.prototype.connect=function(t,e){var n,r=this.strategy,o=new H(this.options.delay,(function(){n=r.connect(t,e)}));return{abort:function(){o.ensureAborted(),n&&n.abort()},forceMinPriority:function(e){t=e,n&&n.forceMinPriority(e)}}},t}(),oe=function(){function t(t,e,n){this.test=t,this.trueBranch=e,this.falseBranch=n}return t.prototype.isSupported=function(){return(this.test()?this.trueBranch:this.falseBranch).isSupported()},t.prototype.connect=function(t,e){return(this.test()?this.trueBranch:this.falseBranch).connect(t,e)},t}(),ie=function(){function t(t){this.strategy=t}return t.prototype.isSupported=function(){return this.strategy.isSupported()},t.prototype.connect=function(t,e){var n=this.strategy.connect(t,(function(t,r){r&&n.abort(),e(t,r)}));return n},t}();function se(t){return function(){return t.isSupported()}}var ce,ae=function(t,e,n){var r={};function o(e,o,i,s,c){var a=n(t,e,o,i,s,c);return r[e]=a,a}var i,s=Object.assign({},e,{hostNonTLS:t.wsHost+":"+t.wsPort,hostTLS:t.wsHost+":"+t.wssPort,httpPath:t.wsPath}),c=Object.assign({},s,{useTLS:!0}),a=Object.assign({},e,{hostNonTLS:t.httpHost+":"+t.httpPort,hostTLS:t.httpHost+":"+t.httpsPort,httpPath:t.httpPath}),u={loop:!0,timeout:15e3,timeoutLimit:6e4},h=new Yt({lives:2,minPingDelay:1e4,maxPingDelay:t.activityTimeout}),p=new Yt({lives:2,minPingDelay:1e4,maxPingDelay:t.activityTimeout}),l=o("ws","ws",3,s,h),f=o("wss","ws",3,c,h),d=o("sockjs","sockjs",1,a),y=o("xhr_streaming","xhr_streaming",1,a,p),g=o("xdr_streaming","xdr_streaming",1,a,p),v=o("xhr_polling","xhr_polling",1,a),b=o("xdr_polling","xdr_polling",1,a),m=new $t([l],u),_=new $t([f],u),w=new $t([d],u),S=new $t([new oe(se(y),y,g)],u),k=new $t([new oe(se(v),v,b)],u),C=new $t([new oe(se(S),new Kt([S,new re(k,{delay:4e3})]),k)],u),T=new oe(se(C),C,w);return i=e.useTLS?new Kt([m,new re(T,{delay:2e3})]):new Kt([m,new re(_,{delay:2e3}),new re(T,{delay:5e3})]),new te(new ie(new oe(se(l),i,T)),r,{ttl:18e5,timeline:e.timeline,useTLS:e.useTLS})},ue={getRequest:function(t){var e=new window.XDomainRequest;return e.ontimeout=function(){t.emit("error",new g),t.close()},e.onerror=function(e){t.emit("error",e),t.close()},e.onprogress=function(){e.responseText&&e.responseText.length>0&&t.onChunk(200,e.responseText)},e.onload=function(){e.responseText&&e.responseText.length>0&&t.onChunk(200,e.responseText),t.emit("finished",200),t.close()},e},abortRequest:function(t){t.ontimeout=t.onerror=t.onprogress=t.onload=null,t.abort()}},he=function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(e,n)};return function(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),pe=function(t){function e(e,n,r){var o=t.call(this)||this;return o.hooks=e,o.method=n,o.url=r,o}return he(e,t),e.prototype.start=function(t){var e=this;this.position=0,this.xhr=this.hooks.getRequest(this),this.unloader=function(){e.close()},Se.addUnloadListener(this.unloader),this.xhr.open(this.method,this.url,!0),this.xhr.setRequestHeader&&this.xhr.setRequestHeader("Content-Type","application/json"),this.xhr.send(t)},e.prototype.close=function(){this.unloader&&(Se.removeUnloadListener(this.unloader),this.unloader=null),this.xhr&&(this.hooks.abortRequest(this.xhr),this.xhr=null)},e.prototype.onChunk=function(t,e){for(;;){var n=this.advanceBuffer(e);if(!n)break;this.emit("chunk",{status:t,data:n})}this.isBufferTooLong(e)&&this.emit("buffer_too_long")},e.prototype.advanceBuffer=function(t){var e=t.slice(this.position),n=e.indexOf("\n");return-1!==n?(this.position+=n+1,e.slice(0,n)):null},e.prototype.isBufferTooLong=function(t){return this.position===t.length&&t.length>262144},e}(pt);!function(t){t[t.CONNECTING=0]="CONNECTING",t[t.OPEN=1]="OPEN",t[t.CLOSED=3]="CLOSED"}(ce||(ce={}));var le=ce,fe=1;function de(t){var e=-1===t.indexOf("?")?"?":"&";return t+e+"t="+ +new Date+"&n="+fe++}function ye(t){return Math.floor(Math.random()*t)}var ge,ve=function(){function t(t,e){this.hooks=t,this.session=ye(1e3)+"/"+function(t){for(var e=[],n=0;n0&&t.onChunk(e.status,e.responseText);break;case 4:e.responseText&&e.responseText.length>0&&t.onChunk(e.status,e.responseText),t.emit("finished",e.status),t.close()}},e},abortRequest:function(t){t.onreadystatechange=null,t.abort()}},we={createStreamingSocket:function(t){return this.createSocket(be,t)},createPollingSocket:function(t){return this.createSocket(me,t)},createSocket:function(t,e){return new ve(t,e)},createXHR:function(t,e){return this.createRequest(_e,t,e)},createRequest:function(t,e,n){return new pe(t,e,n)},createXDR:function(t,e){return this.createRequest(ue,t,e)}},Se={nextAuthCallbackID:1,auth_callbacks:{},ScriptReceivers:i,DependenciesReceivers:a,getDefaultStrategy:ae,Transports:Tt,transportConnectionInitializer:function(){var t=this;t.timeline.info(t.buildTimelineMessage({transport:t.name+(t.options.useTLS?"s":"")})),t.hooks.isInitialized()?t.changeState("initialized"):t.hooks.file?(t.changeState("initializing"),u.load(t.hooks.file,{useTLS:t.options.useTLS},(function(e,n){t.hooks.isInitialized()?(t.changeState("initialized"),n(!0)):(e&&t.onError(e),t.onClose(),n(!1))}))):t.onClose()},HTTPFactory:we,TimelineTransport:rt,getXHRAPI:function(){return window.XMLHttpRequest},getWebSocketAPI:function(){return window.WebSocket||window.MozWebSocket},setup:function(t){var e=this;window.Pusher=t;var n=function(){e.onDocumentBody(t.ready)};window.JSON?n():u.load("json2",{},n)},getDocument:function(){return document},getProtocol:function(){return this.getDocument().location.protocol},getAuthorizers:function(){return{ajax:k,jsonp:tt}},onDocumentBody:function(t){var e=this;document.body?t():setTimeout((function(){e.onDocumentBody(t)}),0)},createJSONPRequest:function(t,e){return new nt(t,e)},createScriptRequest:function(t){return new et(t)},getLocalStorage:function(){try{return window.localStorage}catch(t){return}},createXHR:function(){return this.getXHRAPI()?this.createXMLHttpRequest():this.createMicrosoftXHR()},createXMLHttpRequest:function(){return new(this.getXHRAPI())},createMicrosoftXHR:function(){return new ActiveXObject("Microsoft.XMLHTTP")},getNetwork:function(){return Ot},createWebSocket:function(t){return new(this.getWebSocketAPI())(t)},createSocketRequest:function(t,e){if(this.isXHRSupported())return this.HTTPFactory.createXHR(t,e);if(this.isXDRSupported(0===e.indexOf("https:")))return this.HTTPFactory.createXDR(t,e);throw"Cross-origin HTTP requests are not supported"},isXHRSupported:function(){var t=this.getXHRAPI();return Boolean(t)&&void 0!==(new t).withCredentials},isXDRSupported:function(t){var e=t?"https:":"http:",n=this.getProtocol();return Boolean(window.XDomainRequest)&&n===e},addUnloadListener:function(t){void 0!==window.addEventListener?window.addEventListener("unload",t,!1):void 0!==window.attachEvent&&window.attachEvent("onunload",t)},removeUnloadListener:function(t){void 0!==window.addEventListener?window.removeEventListener("unload",t,!1):void 0!==window.detachEvent&&window.detachEvent("onunload",t)}};!function(t){t[t.ERROR=3]="ERROR",t[t.INFO=6]="INFO",t[t.DEBUG=7]="DEBUG"}(ge||(ge={}));var ke=ge,Ce=function(){function t(t,e,n){this.key=t,this.session=e,this.events=[],this.options=n||{},this.sent=0,this.uniqueID=0}return t.prototype.log=function(t,e){t<=this.options.level&&(this.events.push(z({},e,{timestamp:U.now()})),this.options.limit&&this.events.length>this.options.limit&&this.events.shift())},t.prototype.error=function(t){this.log(ke.ERROR,t)},t.prototype.info=function(t){this.log(ke.INFO,t)},t.prototype.debug=function(t){this.log(ke.DEBUG,t)},t.prototype.isEmpty=function(){return 0===this.events.length},t.prototype.send=function(t,e){var n=this,r=z({session:this.session,bundle:this.sent+1,key:this.key,lib:"js",version:this.options.version,cluster:this.options.cluster,features:this.options.features,timeline:this.events},this.options.params);return this.events=[],t(r,(function(t,r){t||n.sent++,e&&e(t,r)})),!0},t.prototype.generateUniqueID=function(){return this.uniqueID++,this.uniqueID},t}(),Te=function(){function t(t,e,n,r){this.name=t,this.priority=e,this.transport=n,this.options=r||{}}return t.prototype.isSupported=function(){return this.transport.isSupported({useTLS:this.options.useTLS})},t.prototype.connect=function(t,e){var n=this;if(!this.isSupported())return Pe(new w,e);if(this.priority result for the + // current iteration. + result.value = unwrapped; + resolve(result); + }, function(error) { + // If a rejected Promise was yielded, throw the rejection back + // into the async generator function so it can be handled there. + return invoke("throw", error, resolve, reject); + }); + } + } + + var previousPromise; + + function enqueue(method, arg) { + function callInvokeWithMethodAndArg() { + return new Promise(function(resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + + return previousPromise = + // If enqueue has been called before, then we want to wait until + // all previous Promises have been resolved before calling invoke, + // so that results are always delivered in the correct order. If + // enqueue has not been called before, then it is important to + // call invoke immediately, without waiting on a callback to fire, + // so that the async generator function has the opportunity to do + // any necessary setup in a predictable way. This predictability + // is why the Promise constructor synchronously invokes its + // executor callback, and why async functions synchronously + // execute code before the first await. Since we implement simple + // async functions in terms of async generators, it is especially + // important to get this right, even though it requires care. + previousPromise ? previousPromise.then( + callInvokeWithMethodAndArg, + // Avoid propagating failures to Promises returned by later + // invocations of the iterator. + callInvokeWithMethodAndArg + ) : callInvokeWithMethodAndArg(); + } + + // Define the unified helper method that is used to implement .next, + // .throw, and .return (see defineIteratorMethods). + this._invoke = enqueue; + } + + defineIteratorMethods(AsyncIterator.prototype); + AsyncIterator.prototype[asyncIteratorSymbol] = function () { + return this; + }; + exports.AsyncIterator = AsyncIterator; + + // Note that simple async functions are implemented on top of + // AsyncIterator objects; they just return a Promise for the value of + // the final result produced by the iterator. + exports.async = function(innerFn, outerFn, self, tryLocsList) { + var iter = new AsyncIterator( + wrap(innerFn, outerFn, self, tryLocsList) + ); + + return exports.isGeneratorFunction(outerFn) + ? iter // If outerFn is a generator, return the full iterator. + : iter.next().then(function(result) { + return result.done ? result.value : iter.next(); + }); + }; + + function makeInvokeMethod(innerFn, self, context) { + var state = GenStateSuspendedStart; + + return function invoke(method, arg) { + if (state === GenStateExecuting) { + throw new Error("Generator is already running"); + } + + if (state === GenStateCompleted) { + if (method === "throw") { + throw arg; + } + + // Be forgiving, per 25.3.3.3.3 of the spec: + // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume + return doneResult(); + } + + context.method = method; + context.arg = arg; + + while (true) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + + if (context.method === "next") { + // Setting context._sent for legacy support of Babel's + // function.sent implementation. + context.sent = context._sent = context.arg; + + } else if (context.method === "throw") { + if (state === GenStateSuspendedStart) { + state = GenStateCompleted; + throw context.arg; + } + + context.dispatchException(context.arg); + + } else if (context.method === "return") { + context.abrupt("return", context.arg); + } + + state = GenStateExecuting; + + var record = tryCatch(innerFn, self, context); + if (record.type === "normal") { + // If an exception is thrown from innerFn, we leave state === + // GenStateExecuting and loop back for another invocation. + state = context.done + ? GenStateCompleted + : GenStateSuspendedYield; + + if (record.arg === ContinueSentinel) { + continue; + } + + return { + value: record.arg, + done: context.done + }; + + } else if (record.type === "throw") { + state = GenStateCompleted; + // Dispatch the exception by looping back around to the + // context.dispatchException(context.arg) call above. + context.method = "throw"; + context.arg = record.arg; + } + } + }; + } + + // Call delegate.iterator[context.method](context.arg) and handle the + // result, either by returning a { value, done } result from the + // delegate iterator, or by modifying context.method and context.arg, + // setting context.delegate to null, and returning the ContinueSentinel. + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (method === undefined$1) { + // A .throw or .return when the delegate iterator has no .throw + // method always terminates the yield* loop. + context.delegate = null; + + if (context.method === "throw") { + // Note: ["return"] must be used for ES3 parsing compatibility. + if (delegate.iterator["return"]) { + // If the delegate iterator has a return method, give it a + // chance to clean up. + context.method = "return"; + context.arg = undefined$1; + maybeInvokeDelegate(delegate, context); + + if (context.method === "throw") { + // If maybeInvokeDelegate(context) changed context.method from + // "return" to "throw", let that override the TypeError below. + return ContinueSentinel; + } + } + + context.method = "throw"; + context.arg = new TypeError( + "The iterator does not provide a 'throw' method"); + } + + return ContinueSentinel; + } + + var record = tryCatch(method, delegate.iterator, context.arg); + + if (record.type === "throw") { + context.method = "throw"; + context.arg = record.arg; + context.delegate = null; + return ContinueSentinel; + } + + var info = record.arg; + + if (! info) { + context.method = "throw"; + context.arg = new TypeError("iterator result is not an object"); + context.delegate = null; + return ContinueSentinel; + } + + if (info.done) { + // Assign the result of the finished delegate to the temporary + // variable specified by delegate.resultName (see delegateYield). + context[delegate.resultName] = info.value; + + // Resume execution at the desired location (see delegateYield). + context.next = delegate.nextLoc; + + // If context.method was "throw" but the delegate handled the + // exception, let the outer generator proceed normally. If + // context.method was "next", forget context.arg since it has been + // "consumed" by the delegate iterator. If context.method was + // "return", allow the original .return call to continue in the + // outer generator. + if (context.method !== "return") { + context.method = "next"; + context.arg = undefined$1; + } + + } else { + // Re-yield the result returned by the delegate method. + return info; + } + + // The delegate iterator is finished, so forget it and continue with + // the outer generator. + context.delegate = null; + return ContinueSentinel; + } + + // Define Generator.prototype.{next,throw,return} in terms of the + // unified ._invoke helper method. + defineIteratorMethods(Gp); + + Gp[toStringTagSymbol] = "Generator"; + + // A Generator should always return itself as the iterator object when the + // @@iterator function is called on it. Some browsers' implementations of the + // iterator prototype chain incorrectly implement this, causing the Generator + // object to not be returned from this call. This ensures that doesn't happen. + // See https://github.com/facebook/regenerator/issues/274 for more details. + Gp[iteratorSymbol] = function() { + return this; + }; + + Gp.toString = function() { + return "[object Generator]"; + }; + + function pushTryEntry(locs) { + var entry = { tryLoc: locs[0] }; + + if (1 in locs) { + entry.catchLoc = locs[1]; + } + + if (2 in locs) { + entry.finallyLoc = locs[2]; + entry.afterLoc = locs[3]; + } + + this.tryEntries.push(entry); + } + + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal"; + delete record.arg; + entry.completion = record; + } + + function Context(tryLocsList) { + // The root entry object (effectively a try statement without a catch + // or a finally block) gives us a place to store values thrown from + // locations where there is no enclosing try statement. + this.tryEntries = [{ tryLoc: "root" }]; + tryLocsList.forEach(pushTryEntry, this); + this.reset(true); + } + + exports.keys = function(object) { + var keys = []; + for (var key in object) { + keys.push(key); + } + keys.reverse(); + + // Rather than returning an object with a next method, we keep + // things simple and return the next function itself. + return function next() { + while (keys.length) { + var key = keys.pop(); + if (key in object) { + next.value = key; + next.done = false; + return next; + } + } + + // To avoid creating an additional object, we just hang the .value + // and .done properties off the next function object itself. This + // also ensures that the minifier will not anonymize the function. + next.done = true; + return next; + }; + }; + + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) { + return iteratorMethod.call(iterable); + } + + if (typeof iterable.next === "function") { + return iterable; + } + + if (!isNaN(iterable.length)) { + var i = -1, next = function next() { + while (++i < iterable.length) { + if (hasOwn.call(iterable, i)) { + next.value = iterable[i]; + next.done = false; + return next; + } + } + + next.value = undefined$1; + next.done = true; + + return next; + }; + + return next.next = next; + } + } + + // Return an iterator with no values. + return { next: doneResult }; + } + exports.values = values; + + function doneResult() { + return { value: undefined$1, done: true }; + } + + Context.prototype = { + constructor: Context, + + reset: function(skipTempReset) { + this.prev = 0; + this.next = 0; + // Resetting context._sent for legacy support of Babel's + // function.sent implementation. + this.sent = this._sent = undefined$1; + this.done = false; + this.delegate = null; + + this.method = "next"; + this.arg = undefined$1; + + this.tryEntries.forEach(resetTryEntry); + + if (!skipTempReset) { + for (var name in this) { + // Not sure about the optimal order of these conditions: + if (name.charAt(0) === "t" && + hasOwn.call(this, name) && + !isNaN(+name.slice(1))) { + this[name] = undefined$1; + } + } + } + }, + + stop: function() { + this.done = true; + + var rootEntry = this.tryEntries[0]; + var rootRecord = rootEntry.completion; + if (rootRecord.type === "throw") { + throw rootRecord.arg; + } + + return this.rval; + }, + + dispatchException: function(exception) { + if (this.done) { + throw exception; + } + + var context = this; + function handle(loc, caught) { + record.type = "throw"; + record.arg = exception; + context.next = loc; + + if (caught) { + // If the dispatched exception was caught by a catch block, + // then let that catch block handle the exception normally. + context.method = "next"; + context.arg = undefined$1; + } + + return !! caught; + } + + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + var record = entry.completion; + + if (entry.tryLoc === "root") { + // Exception thrown outside of any try block that could handle + // it, so set the completion value of the entire function to + // throw the exception. + return handle("end"); + } + + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"); + var hasFinally = hasOwn.call(entry, "finallyLoc"); + + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } else if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else if (hasCatch) { + if (this.prev < entry.catchLoc) { + return handle(entry.catchLoc, true); + } + + } else if (hasFinally) { + if (this.prev < entry.finallyLoc) { + return handle(entry.finallyLoc); + } + + } else { + throw new Error("try statement without catch or finally"); + } + } + } + }, + + abrupt: function(type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && + hasOwn.call(entry, "finallyLoc") && + this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + + if (finallyEntry && + (type === "break" || + type === "continue") && + finallyEntry.tryLoc <= arg && + arg <= finallyEntry.finallyLoc) { + // Ignore the finally entry if control is not jumping to a + // location outside the try/catch block. + finallyEntry = null; + } + + var record = finallyEntry ? finallyEntry.completion : {}; + record.type = type; + record.arg = arg; + + if (finallyEntry) { + this.method = "next"; + this.next = finallyEntry.finallyLoc; + return ContinueSentinel; + } + + return this.complete(record); + }, + + complete: function(record, afterLoc) { + if (record.type === "throw") { + throw record.arg; + } + + if (record.type === "break" || + record.type === "continue") { + this.next = record.arg; + } else if (record.type === "return") { + this.rval = this.arg = record.arg; + this.method = "return"; + this.next = "end"; + } else if (record.type === "normal" && afterLoc) { + this.next = afterLoc; + } + + return ContinueSentinel; + }, + + finish: function(finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) { + this.complete(entry.completion, entry.afterLoc); + resetTryEntry(entry); + return ContinueSentinel; + } + } + }, + + "catch": function(tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if (record.type === "throw") { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + + // The context.catch method must only be called with a location + // argument that corresponds to a known catch block. + throw new Error("illegal catch attempt"); + }, + + delegateYield: function(iterable, resultName, nextLoc) { + this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }; + + if (this.method === "next") { + // Deliberately forget the last sent value so that we don't + // accidentally pass it on to the delegate. + this.arg = undefined$1; + } + + return ContinueSentinel; + } + }; + + // Regardless of whether this script is executing as a CommonJS module + // or not, return the runtime object so that we can declare the variable + // regeneratorRuntime in the outer scope, which allows this module to be + // injected easily by `bin/regenerator --include-runtime script.js`. + return exports; + + }( + // If this script is executing as a CommonJS module, use module.exports + // as the regeneratorRuntime namespace. Otherwise create a new empty + // object. Either way, the resulting object will be used to initialize + // the regeneratorRuntime variable at the top of this file. + module.exports + )); + + try { + regeneratorRuntime = runtime; + } catch (accidentalStrictMode) { + // This module should not be running in strict mode, so the above + // assignment should always work unless something is misconfigured. Just + // in case runtime.js accidentally runs in strict mode, we can escape + // strict mode using a global Function call. This could conceivably fail + // if a Content Security Policy forbids using Function, but in that case + // the proper solution is to fix the accidental strict mode problem. If + // you've misconfigured your bundler to force strict mode and applied a + // CSP to forbid Function, and you're not willing to fix either of those + // problems, please detail your unique predicament in a GitHub issue. + Function("r", "regeneratorRuntime = r")(runtime); + } + }); + + var regenerator = runtime_1; + + function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } + } + + function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + + _next(undefined); + }); + }; + } + + var asyncToGenerator = _asyncToGenerator; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + var classCallCheck = _classCallCheck; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + var createClass = _createClass; + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + var defineProperty = _defineProperty; + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + defineProperty(target, key, source[key]); + }); + } + + return target; + } + + var objectSpread = _objectSpread; + + function doRequest(_ref) { + var method = _ref.method, + path = _ref.path, + _ref$body = _ref.body, + body = _ref$body === void 0 ? null : _ref$body, + _ref$headers = _ref.headers, + headers = _ref$headers === void 0 ? {} : _ref$headers; + var options = { + method: method, + headers: headers + }; + + if (body !== null) { + options.body = JSON.stringify(body); + options.headers = objectSpread({ + 'Content-Type': 'application/json' + }, headers); + } + + return fetch(path, options).then( + /*#__PURE__*/ + function () { + var _ref2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee(response) { + return regenerator.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (response.ok) { + _context.next = 3; + break; + } + + _context.next = 3; + return handleError(response); + + case 3: + _context.prev = 3; + _context.next = 6; + return response.json(); + + case 6: + return _context.abrupt("return", _context.sent); + + case 9: + _context.prev = 9; + _context.t0 = _context["catch"](3); + return _context.abrupt("return", null); + + case 12: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[3, 9]]); + })); + + return function (_x) { + return _ref2.apply(this, arguments); + }; + }()); + } + + function handleError(_x2) { + return _handleError.apply(this, arguments); + } + + function _handleError() { + _handleError = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee2(response) { + var errorMessage, _ref3, _ref3$error, error, _ref3$description, description; + + return regenerator.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + _context2.prev = 0; + _context2.next = 3; + return response.json(); + + case 3: + _ref3 = _context2.sent; + _ref3$error = _ref3.error; + error = _ref3$error === void 0 ? 'Unknown error' : _ref3$error; + _ref3$description = _ref3.description; + description = _ref3$description === void 0 ? 'No description' : _ref3$description; + errorMessage = "Unexpected status code ".concat(response.status, ": ").concat(error, ", ").concat(description); + _context2.next = 14; + break; + + case 11: + _context2.prev = 11; + _context2.t0 = _context2["catch"](0); + errorMessage = "Unexpected status code ".concat(response.status, ": Cannot parse error response"); + + case 14: + throw new Error(errorMessage); + + case 15: + case "end": + return _context2.stop(); + } + } + }, _callee2, null, [[0, 11]]); + })); + return _handleError.apply(this, arguments); + } + + var TokenProvider = + /*#__PURE__*/ + function () { + function TokenProvider() { + var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + url = _ref.url, + queryParams = _ref.queryParams, + headers = _ref.headers; + + classCallCheck(this, TokenProvider); + + this.url = url; + this.queryParams = queryParams; + this.headers = headers; + } + + createClass(TokenProvider, [{ + key: "fetchToken", + value: function () { + var _fetchToken = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee(userId) { + var queryParams, encodedParams, options, response; + return regenerator.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + queryParams = objectSpread({ + user_id: userId + }, this.queryParams); + encodedParams = Object.entries(queryParams).map(function (kv) { + return kv.map(encodeURIComponent).join('='); + }).join('&'); + options = { + method: 'GET', + path: "".concat(this.url, "?").concat(encodedParams), + headers: this.headers + }; + _context.next = 5; + return doRequest(options); + + case 5: + response = _context.sent; + return _context.abrupt("return", response); + + case 7: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function fetchToken(_x) { + return _fetchToken.apply(this, arguments); + } + + return fetchToken; + }() + }]); + + return TokenProvider; + }(); + + var DeviceStateStore = + /*#__PURE__*/ + function () { + function DeviceStateStore(instanceId) { + classCallCheck(this, DeviceStateStore); + + this._instanceId = instanceId; + this._dbConn = null; + } + + createClass(DeviceStateStore, [{ + key: "connect", + value: function connect() { + var _this = this; + + return new Promise(function (resolve, reject) { + var request = indexedDB.open(_this._dbName); + + request.onsuccess = function (event) { + var db = event.target.result; + _this._dbConn = db; + + _this._readState().then(function (state) { + return state === null ? _this.clear() : Promise.resolve(); + }).then(resolve); + }; + + request.onupgradeneeded = function (event) { + var db = event.target.result; + db.createObjectStore('beams', { + keyPath: 'instance_id' + }); + }; + + request.onerror = function (event) { + var error = new Error("Database error: ".concat(event.target.error)); + reject(error); + }; + }); + } + }, { + key: "clear", + value: function clear() { + return this._writeState({ + instance_id: this._instanceId, + device_id: null, + token: null, + user_id: null + }); + } + }, { + key: "_readState", + value: function _readState() { + var _this2 = this; + + if (!this.isConnected) { + throw new Error('Cannot read value: DeviceStateStore not connected to IndexedDB'); + } + + return new Promise(function (resolve, reject) { + var request = _this2._dbConn.transaction('beams').objectStore('beams').get(_this2._instanceId); + + request.onsuccess = function (event) { + var state = event.target.result; + + if (!state) { + resolve(null); + } + + resolve(state); + }; + + request.onerror = function (event) { + reject(event.target.error); + }; + }); + } + }, { + key: "_readProperty", + value: function () { + var _readProperty2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee(name) { + var state; + return regenerator.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return this._readState(); + + case 2: + state = _context.sent; + + if (!(state === null)) { + _context.next = 5; + break; + } + + return _context.abrupt("return", null); + + case 5: + return _context.abrupt("return", state[name] || null); + + case 6: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function _readProperty(_x) { + return _readProperty2.apply(this, arguments); + } + + return _readProperty; + }() + }, { + key: "_writeState", + value: function _writeState(state) { + var _this3 = this; + + if (!this.isConnected) { + throw new Error('Cannot write value: DeviceStateStore not connected to IndexedDB'); + } + + return new Promise(function (resolve, reject) { + var request = _this3._dbConn.transaction('beams', 'readwrite').objectStore('beams').put(state); + + request.onsuccess = function (_) { + resolve(); + }; + + request.onerror = function (event) { + reject(event.target.error); + }; + }); + } + }, { + key: "_writeProperty", + value: function () { + var _writeProperty2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee2(name, value) { + var state; + return regenerator.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return this._readState(); + + case 2: + state = _context2.sent; + state[name] = value; + _context2.next = 6; + return this._writeState(state); + + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function _writeProperty(_x2, _x3) { + return _writeProperty2.apply(this, arguments); + } + + return _writeProperty; + }() + }, { + key: "getToken", + value: function getToken() { + return this._readProperty('token'); + } + }, { + key: "setToken", + value: function setToken(token) { + return this._writeProperty('token', token); + } + }, { + key: "getDeviceId", + value: function getDeviceId() { + return this._readProperty('device_id'); + } + }, { + key: "setDeviceId", + value: function setDeviceId(deviceId) { + return this._writeProperty('device_id', deviceId); + } + }, { + key: "getUserId", + value: function getUserId() { + return this._readProperty('user_id'); + } + }, { + key: "setUserId", + value: function setUserId(userId) { + return this._writeProperty('user_id', userId); + } + }, { + key: "getLastSeenSdkVersion", + value: function getLastSeenSdkVersion() { + return this._readProperty('last_seen_sdk_version'); + } + }, { + key: "setLastSeenSdkVersion", + value: function setLastSeenSdkVersion(sdkVersion) { + return this._writeProperty('last_seen_sdk_version', sdkVersion); + } + }, { + key: "getLastSeenUserAgent", + value: function getLastSeenUserAgent() { + return this._readProperty('last_seen_user_agent'); + } + }, { + key: "setLastSeenUserAgent", + value: function setLastSeenUserAgent(userAgent) { + return this._writeProperty('last_seen_user_agent', userAgent); + } + }, { + key: "_dbName", + get: function get() { + return "beams-".concat(this._instanceId); + } + }, { + key: "isConnected", + get: function get() { + return this._dbConn !== null; + } + }]); + + return DeviceStateStore; + }(); + + var version = "1.0.3"; + + var INTERESTS_REGEX = new RegExp('^(_|\\-|=|@|,|\\.|;|[A-Z]|[a-z]|[0-9])*$'); + var MAX_INTEREST_LENGTH = 164; + var MAX_INTERESTS_NUM = 5000; + var SERVICE_WORKER_URL = "/service-worker.js?v=1&pusherBeamsWebSDKVersion=".concat(version); + var RegistrationState = Object.freeze({ + PERMISSION_PROMPT_REQUIRED: 'PERMISSION_PROMPT_REQUIRED', + PERMISSION_GRANTED_NOT_REGISTERED_WITH_BEAMS: 'PERMISSION_GRANTED_NOT_REGISTERED_WITH_BEAMS', + PERMISSION_GRANTED_REGISTERED_WITH_BEAMS: 'PERMISSION_GRANTED_REGISTERED_WITH_BEAMS', + PERMISSION_DENIED: 'PERMISSION_DENIED' + }); + var Client = + /*#__PURE__*/ + function () { + function Client(config) { + classCallCheck(this, Client); + + if (!config) { + throw new Error('Config object required'); + } + + var instanceId = config.instanceId, + _config$endpointOverr = config.endpointOverride, + endpointOverride = _config$endpointOverr === void 0 ? null : _config$endpointOverr, + _config$serviceWorker = config.serviceWorkerRegistration, + serviceWorkerRegistration = _config$serviceWorker === void 0 ? null : _config$serviceWorker; + + if (instanceId === undefined) { + throw new Error('Instance ID is required'); + } + + if (typeof instanceId !== 'string') { + throw new Error('Instance ID must be a string'); + } + + if (instanceId.length === 0) { + throw new Error('Instance ID cannot be empty'); + } + + if (!('indexedDB' in window)) { + throw new Error('Pusher Beams does not support this browser version (IndexedDB not supported)'); + } + + if (!window.isSecureContext) { + throw new Error('Pusher Beams relies on Service Workers, which only work in secure contexts. Check that your page is being served from localhost/over HTTPS'); + } + + if (!('serviceWorker' in navigator)) { + throw new Error('Pusher Beams does not support this browser version (Service Workers not supported)'); + } + + if (!('PushManager' in window)) { + throw new Error('Pusher Beams does not support this browser version (Web Push not supported)'); + } + + if (serviceWorkerRegistration) { + var serviceWorkerScope = serviceWorkerRegistration.scope; + var currentURL = location.href; + var scopeMatchesCurrentPage = currentURL.startsWith(serviceWorkerScope); + + if (!scopeMatchesCurrentPage) { + throw new Error("Could not initialize Pusher web push: current page not in serviceWorkerRegistration scope (".concat(serviceWorkerScope, ")")); + } + } + + this.instanceId = instanceId; + this._deviceId = null; + this._token = null; + this._userId = null; + this._serviceWorkerRegistration = serviceWorkerRegistration; + this._deviceStateStore = new DeviceStateStore(instanceId); + this._endpoint = endpointOverride; // Internal only + + this._ready = this._init(); + } + + createClass(Client, [{ + key: "_init", + value: function () { + var _init2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee() { + return regenerator.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (!(this._deviceId !== null)) { + _context.next = 2; + break; + } + + return _context.abrupt("return"); + + case 2: + _context.next = 4; + return this._deviceStateStore.connect(); + + case 4: + if (!this._serviceWorkerRegistration) { + _context.next = 9; + break; + } + + _context.next = 7; + return window.navigator.serviceWorker.ready; + + case 7: + _context.next = 12; + break; + + case 9: + _context.next = 11; + return getServiceWorkerRegistration(); + + case 11: + this._serviceWorkerRegistration = _context.sent; + + case 12: + _context.next = 14; + return this._detectSubscriptionChange(); + + case 14: + _context.next = 16; + return this._deviceStateStore.getDeviceId(); + + case 16: + this._deviceId = _context.sent; + _context.next = 19; + return this._deviceStateStore.getToken(); + + case 19: + this._token = _context.sent; + _context.next = 22; + return this._deviceStateStore.getUserId(); + + case 22: + this._userId = _context.sent; + + case 23: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + + function _init() { + return _init2.apply(this, arguments); + } + + return _init; + }() // Ensure SDK is loaded and is consistent + + }, { + key: "_resolveSDKState", + value: function () { + var _resolveSDKState2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee2() { + return regenerator.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return this._ready; + + case 2: + _context2.next = 4; + return this._detectSubscriptionChange(); + + case 4: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + + function _resolveSDKState() { + return _resolveSDKState2.apply(this, arguments); + } + + return _resolveSDKState; + }() + }, { + key: "_detectSubscriptionChange", + value: function () { + var _detectSubscriptionChange2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee3() { + var storedToken, actualToken, pushTokenHasChanged; + return regenerator.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return this._deviceStateStore.getToken(); + + case 2: + storedToken = _context3.sent; + _context3.next = 5; + return getWebPushToken(this._serviceWorkerRegistration); + + case 5: + actualToken = _context3.sent; + pushTokenHasChanged = storedToken !== actualToken; + + if (!pushTokenHasChanged) { + _context3.next = 13; + break; + } + + _context3.next = 10; + return this._deviceStateStore.clear(); + + case 10: + this._deviceId = null; + this._token = null; + this._userId = null; + + case 13: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + + function _detectSubscriptionChange() { + return _detectSubscriptionChange2.apply(this, arguments); + } + + return _detectSubscriptionChange; + }() + }, { + key: "getDeviceId", + value: function () { + var _getDeviceId = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee4() { + var _this = this; + + return regenerator.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + _context4.next = 2; + return this._resolveSDKState(); + + case 2: + return _context4.abrupt("return", this._ready.then(function () { + return _this._deviceId; + })); + + case 3: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + + function getDeviceId() { + return _getDeviceId.apply(this, arguments); + } + + return getDeviceId; + }() + }, { + key: "getToken", + value: function () { + var _getToken = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee5() { + var _this2 = this; + + return regenerator.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + _context5.next = 2; + return this._resolveSDKState(); + + case 2: + return _context5.abrupt("return", this._ready.then(function () { + return _this2._token; + })); + + case 3: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + + function getToken() { + return _getToken.apply(this, arguments); + } + + return getToken; + }() + }, { + key: "getUserId", + value: function () { + var _getUserId = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee6() { + var _this3 = this; + + return regenerator.wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + _context6.next = 2; + return this._resolveSDKState(); + + case 2: + return _context6.abrupt("return", this._ready.then(function () { + return _this3._userId; + })); + + case 3: + case "end": + return _context6.stop(); + } + } + }, _callee6, this); + })); + + function getUserId() { + return _getUserId.apply(this, arguments); + } + + return getUserId; + }() + }, { + key: "_throwIfNotStarted", + value: function _throwIfNotStarted(message) { + if (!this._deviceId) { + throw new Error("".concat(message, ". SDK not registered with Beams. Did you call .start?")); + } + } + }, { + key: "start", + value: function () { + var _start = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee7() { + var _ref, publicKey, token, deviceId; + + return regenerator.wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + _context7.next = 2; + return this._resolveSDKState(); + + case 2: + if (isSupportedBrowser()) { + _context7.next = 4; + break; + } + + return _context7.abrupt("return", this); + + case 4: + if (!(this._deviceId !== null)) { + _context7.next = 6; + break; + } + + return _context7.abrupt("return", this); + + case 6: + _context7.next = 8; + return this._getPublicKey(); + + case 8: + _ref = _context7.sent; + publicKey = _ref.vapidPublicKey; + _context7.next = 12; + return this._getPushToken(publicKey); + + case 12: + token = _context7.sent; + _context7.next = 15; + return this._registerDevice(token); + + case 15: + deviceId = _context7.sent; + _context7.next = 18; + return this._deviceStateStore.setToken(token); + + case 18: + _context7.next = 20; + return this._deviceStateStore.setDeviceId(deviceId); + + case 20: + _context7.next = 22; + return this._deviceStateStore.setLastSeenSdkVersion(version); + + case 22: + _context7.next = 24; + return this._deviceStateStore.setLastSeenUserAgent(window.navigator.userAgent); + + case 24: + this._token = token; + this._deviceId = deviceId; + return _context7.abrupt("return", this); + + case 27: + case "end": + return _context7.stop(); + } + } + }, _callee7, this); + })); + + function start() { + return _start.apply(this, arguments); + } + + return start; + }() + }, { + key: "getRegistrationState", + value: function () { + var _getRegistrationState = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee8() { + return regenerator.wrap(function _callee8$(_context8) { + while (1) { + switch (_context8.prev = _context8.next) { + case 0: + _context8.next = 2; + return this._resolveSDKState(); + + case 2: + if (!(Notification.permission === 'denied')) { + _context8.next = 4; + break; + } + + return _context8.abrupt("return", RegistrationState.PERMISSION_DENIED); + + case 4: + if (!(Notification.permission === 'granted' && this._deviceId !== null)) { + _context8.next = 6; + break; + } + + return _context8.abrupt("return", RegistrationState.PERMISSION_GRANTED_REGISTERED_WITH_BEAMS); + + case 6: + if (!(Notification.permission === 'granted' && this._deviceId === null)) { + _context8.next = 8; + break; + } + + return _context8.abrupt("return", RegistrationState.PERMISSION_GRANTED_NOT_REGISTERED_WITH_BEAMS); + + case 8: + return _context8.abrupt("return", RegistrationState.PERMISSION_PROMPT_REQUIRED); + + case 9: + case "end": + return _context8.stop(); + } + } + }, _callee8, this); + })); + + function getRegistrationState() { + return _getRegistrationState.apply(this, arguments); + } + + return getRegistrationState; + }() + }, { + key: "addDeviceInterest", + value: function () { + var _addDeviceInterest = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee9(interest) { + var path, options; + return regenerator.wrap(function _callee9$(_context9) { + while (1) { + switch (_context9.prev = _context9.next) { + case 0: + _context9.next = 2; + return this._resolveSDKState(); + + case 2: + this._throwIfNotStarted('Could not add Device Interest'); + + validateInterestName(interest); + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/devices/web/").concat(this._deviceId, "/interests/").concat(encodeURIComponent(interest)); + options = { + method: 'POST', + path: path + }; + _context9.next = 8; + return doRequest(options); + + case 8: + case "end": + return _context9.stop(); + } + } + }, _callee9, this); + })); + + function addDeviceInterest(_x) { + return _addDeviceInterest.apply(this, arguments); + } + + return addDeviceInterest; + }() + }, { + key: "removeDeviceInterest", + value: function () { + var _removeDeviceInterest = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee10(interest) { + var path, options; + return regenerator.wrap(function _callee10$(_context10) { + while (1) { + switch (_context10.prev = _context10.next) { + case 0: + _context10.next = 2; + return this._resolveSDKState(); + + case 2: + this._throwIfNotStarted('Could not remove Device Interest'); + + validateInterestName(interest); + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/devices/web/").concat(this._deviceId, "/interests/").concat(encodeURIComponent(interest)); + options = { + method: 'DELETE', + path: path + }; + _context10.next = 8; + return doRequest(options); + + case 8: + case "end": + return _context10.stop(); + } + } + }, _callee10, this); + })); + + function removeDeviceInterest(_x2) { + return _removeDeviceInterest.apply(this, arguments); + } + + return removeDeviceInterest; + }() + }, { + key: "getDeviceInterests", + value: function () { + var _getDeviceInterests = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee11() { + var path, options; + return regenerator.wrap(function _callee11$(_context11) { + while (1) { + switch (_context11.prev = _context11.next) { + case 0: + _context11.next = 2; + return this._resolveSDKState(); + + case 2: + this._throwIfNotStarted('Could not get Device Interests'); + + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/devices/web/").concat(this._deviceId, "/interests"); + options = { + method: 'GET', + path: path + }; + _context11.next = 7; + return doRequest(options); + + case 7: + _context11.t0 = _context11.sent['interests']; + + if (_context11.t0) { + _context11.next = 10; + break; + } + + _context11.t0 = []; + + case 10: + return _context11.abrupt("return", _context11.t0); + + case 11: + case "end": + return _context11.stop(); + } + } + }, _callee11, this); + })); + + function getDeviceInterests() { + return _getDeviceInterests.apply(this, arguments); + } + + return getDeviceInterests; + }() + }, { + key: "setDeviceInterests", + value: function () { + var _setDeviceInterests = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee12(interests) { + var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, interest, uniqueInterests, path, options; + + return regenerator.wrap(function _callee12$(_context12) { + while (1) { + switch (_context12.prev = _context12.next) { + case 0: + _context12.next = 2; + return this._resolveSDKState(); + + case 2: + this._throwIfNotStarted('Could not set Device Interests'); + + if (!(interests === undefined || interests === null)) { + _context12.next = 5; + break; + } + + throw new Error('interests argument is required'); + + case 5: + if (Array.isArray(interests)) { + _context12.next = 7; + break; + } + + throw new Error('interests argument must be an array'); + + case 7: + if (!(interests.length > MAX_INTERESTS_NUM)) { + _context12.next = 9; + break; + } + + throw new Error("Number of interests (".concat(interests.length, ") exceeds maximum of ").concat(MAX_INTERESTS_NUM)); + + case 9: + _iteratorNormalCompletion = true; + _didIteratorError = false; + _iteratorError = undefined; + _context12.prev = 12; + + for (_iterator = interests[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + interest = _step.value; + validateInterestName(interest); + } + + _context12.next = 20; + break; + + case 16: + _context12.prev = 16; + _context12.t0 = _context12["catch"](12); + _didIteratorError = true; + _iteratorError = _context12.t0; + + case 20: + _context12.prev = 20; + _context12.prev = 21; + + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + + case 23: + _context12.prev = 23; + + if (!_didIteratorError) { + _context12.next = 26; + break; + } + + throw _iteratorError; + + case 26: + return _context12.finish(23); + + case 27: + return _context12.finish(20); + + case 28: + uniqueInterests = Array.from(new Set(interests)); + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/devices/web/").concat(this._deviceId, "/interests"); + options = { + method: 'PUT', + path: path, + body: { + interests: uniqueInterests + } + }; + _context12.next = 33; + return doRequest(options); + + case 33: + case "end": + return _context12.stop(); + } + } + }, _callee12, this, [[12, 16, 20, 28], [21,, 23, 27]]); + })); + + function setDeviceInterests(_x3) { + return _setDeviceInterests.apply(this, arguments); + } + + return setDeviceInterests; + }() + }, { + key: "clearDeviceInterests", + value: function () { + var _clearDeviceInterests = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee13() { + return regenerator.wrap(function _callee13$(_context13) { + while (1) { + switch (_context13.prev = _context13.next) { + case 0: + _context13.next = 2; + return this._resolveSDKState(); + + case 2: + this._throwIfNotStarted('Could not clear Device Interests'); + + _context13.next = 5; + return this.setDeviceInterests([]); + + case 5: + case "end": + return _context13.stop(); + } + } + }, _callee13, this); + })); + + function clearDeviceInterests() { + return _clearDeviceInterests.apply(this, arguments); + } + + return clearDeviceInterests; + }() + }, { + key: "setUserId", + value: function () { + var _setUserId = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee14(userId, tokenProvider) { + var error, path, _ref2, beamsAuthToken, options; + + return regenerator.wrap(function _callee14$(_context14) { + while (1) { + switch (_context14.prev = _context14.next) { + case 0: + _context14.next = 2; + return this._resolveSDKState(); + + case 2: + if (isSupportedBrowser()) { + _context14.next = 4; + break; + } + + return _context14.abrupt("return"); + + case 4: + if (!(this._deviceId === null)) { + _context14.next = 7; + break; + } + + error = new Error('.start must be called before .setUserId'); + return _context14.abrupt("return", Promise.reject(error)); + + case 7: + if (!(typeof userId !== 'string')) { + _context14.next = 9; + break; + } + + throw new Error("User ID must be a string (was ".concat(userId, ")")); + + case 9: + if (!(userId === '')) { + _context14.next = 11; + break; + } + + throw new Error('User ID cannot be the empty string'); + + case 11: + if (!(this._userId !== null && this._userId !== userId)) { + _context14.next = 13; + break; + } + + throw new Error('Changing the `userId` is not allowed.'); + + case 13: + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/devices/web/").concat(this._deviceId, "/user"); + _context14.next = 16; + return tokenProvider.fetchToken(userId); + + case 16: + _ref2 = _context14.sent; + beamsAuthToken = _ref2.token; + options = { + method: 'PUT', + path: path, + headers: { + Authorization: "Bearer ".concat(beamsAuthToken) + } + }; + _context14.next = 21; + return doRequest(options); + + case 21: + this._userId = userId; + return _context14.abrupt("return", this._deviceStateStore.setUserId(userId)); + + case 23: + case "end": + return _context14.stop(); + } + } + }, _callee14, this); + })); + + function setUserId(_x4, _x5) { + return _setUserId.apply(this, arguments); + } + + return setUserId; + }() + }, { + key: "stop", + value: function () { + var _stop = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee15() { + return regenerator.wrap(function _callee15$(_context15) { + while (1) { + switch (_context15.prev = _context15.next) { + case 0: + _context15.next = 2; + return this._resolveSDKState(); + + case 2: + if (isSupportedBrowser()) { + _context15.next = 4; + break; + } + + return _context15.abrupt("return"); + + case 4: + if (!(this._deviceId === null)) { + _context15.next = 6; + break; + } + + return _context15.abrupt("return"); + + case 6: + _context15.next = 8; + return this._deleteDevice(); + + case 8: + _context15.next = 10; + return this._deviceStateStore.clear(); + + case 10: + this._clearPushToken()["catch"](function () {}); // Not awaiting this, best effort. + + + this._deviceId = null; + this._token = null; + this._userId = null; + + case 14: + case "end": + return _context15.stop(); + } + } + }, _callee15, this); + })); + + function stop() { + return _stop.apply(this, arguments); + } + + return stop; + }() + }, { + key: "clearAllState", + value: function () { + var _clearAllState = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee16() { + return regenerator.wrap(function _callee16$(_context16) { + while (1) { + switch (_context16.prev = _context16.next) { + case 0: + if (isSupportedBrowser()) { + _context16.next = 2; + break; + } + + return _context16.abrupt("return"); + + case 2: + _context16.next = 4; + return this.stop(); + + case 4: + _context16.next = 6; + return this.start(); + + case 6: + case "end": + return _context16.stop(); + } + } + }, _callee16, this); + })); + + function clearAllState() { + return _clearAllState.apply(this, arguments); + } + + return clearAllState; + }() + }, { + key: "_getPublicKey", + value: function () { + var _getPublicKey2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee17() { + var path, options; + return regenerator.wrap(function _callee17$(_context17) { + while (1) { + switch (_context17.prev = _context17.next) { + case 0: + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/web-vapid-public-key"); + options = { + method: 'GET', + path: path + }; + return _context17.abrupt("return", doRequest(options)); + + case 3: + case "end": + return _context17.stop(); + } + } + }, _callee17, this); + })); + + function _getPublicKey() { + return _getPublicKey2.apply(this, arguments); + } + + return _getPublicKey; + }() + }, { + key: "_getPushToken", + value: function () { + var _getPushToken2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee18(publicKey) { + var sub; + return regenerator.wrap(function _callee18$(_context18) { + while (1) { + switch (_context18.prev = _context18.next) { + case 0: + _context18.prev = 0; + _context18.next = 3; + return this._clearPushToken(); + + case 3: + _context18.next = 5; + return this._serviceWorkerRegistration.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: urlBase64ToUInt8Array(publicKey) + }); + + case 5: + sub = _context18.sent; + return _context18.abrupt("return", btoa(JSON.stringify(sub))); + + case 9: + _context18.prev = 9; + _context18.t0 = _context18["catch"](0); + return _context18.abrupt("return", Promise.reject(_context18.t0)); + + case 12: + case "end": + return _context18.stop(); + } + } + }, _callee18, this, [[0, 9]]); + })); + + function _getPushToken(_x6) { + return _getPushToken2.apply(this, arguments); + } + + return _getPushToken; + }() + }, { + key: "_clearPushToken", + value: function () { + var _clearPushToken2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee19() { + return regenerator.wrap(function _callee19$(_context19) { + while (1) { + switch (_context19.prev = _context19.next) { + case 0: + return _context19.abrupt("return", navigator.serviceWorker.ready.then(function (reg) { + return reg.pushManager.getSubscription(); + }).then(function (sub) { + if (sub) sub.unsubscribe(); + })); + + case 1: + case "end": + return _context19.stop(); + } + } + }, _callee19); + })); + + function _clearPushToken() { + return _clearPushToken2.apply(this, arguments); + } + + return _clearPushToken; + }() + }, { + key: "_registerDevice", + value: function () { + var _registerDevice2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee20(token) { + var path, device, options, response; + return regenerator.wrap(function _callee20$(_context20) { + while (1) { + switch (_context20.prev = _context20.next) { + case 0: + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/devices/web"); + device = { + token: token, + metadata: { + sdkVersion: version + } + }; + options = { + method: 'POST', + path: path, + body: device + }; + _context20.next = 5; + return doRequest(options); + + case 5: + response = _context20.sent; + return _context20.abrupt("return", response.id); + + case 7: + case "end": + return _context20.stop(); + } + } + }, _callee20, this); + })); + + function _registerDevice(_x7) { + return _registerDevice2.apply(this, arguments); + } + + return _registerDevice; + }() + }, { + key: "_deleteDevice", + value: function () { + var _deleteDevice2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee21() { + var path, options; + return regenerator.wrap(function _callee21$(_context21) { + while (1) { + switch (_context21.prev = _context21.next) { + case 0: + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/devices/web/").concat(encodeURIComponent(this._deviceId)); + options = { + method: 'DELETE', + path: path + }; + _context21.next = 4; + return doRequest(options); + + case 4: + case "end": + return _context21.stop(); + } + } + }, _callee21, this); + })); + + function _deleteDevice() { + return _deleteDevice2.apply(this, arguments); + } + + return _deleteDevice; + }() + /** + * Submit SDK version and browser details (via the user agent) to Pusher Beams. + */ + + }, { + key: "_updateDeviceMetadata", + value: function () { + var _updateDeviceMetadata2 = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee22() { + var userAgent, storedUserAgent, storedSdkVersion, path, metadata, options; + return regenerator.wrap(function _callee22$(_context22) { + while (1) { + switch (_context22.prev = _context22.next) { + case 0: + userAgent = window.navigator.userAgent; + _context22.next = 3; + return this._deviceStateStore.getLastSeenUserAgent(); + + case 3: + storedUserAgent = _context22.sent; + _context22.next = 6; + return this._deviceStateStore.getLastSeenSdkVersion(); + + case 6: + storedSdkVersion = _context22.sent; + + if (!(userAgent === storedUserAgent && version === storedSdkVersion)) { + _context22.next = 9; + break; + } + + return _context22.abrupt("return"); + + case 9: + path = "".concat(this._baseURL, "/device_api/v1/instances/").concat(encodeURIComponent(this.instanceId), "/devices/web/").concat(this._deviceId, "/metadata"); + metadata = { + sdkVersion: version + }; + options = { + method: 'PUT', + path: path, + body: metadata + }; + _context22.next = 14; + return doRequest(options); + + case 14: + _context22.next = 16; + return this._deviceStateStore.setLastSeenSdkVersion(version); + + case 16: + _context22.next = 18; + return this._deviceStateStore.setLastSeenUserAgent(userAgent); + + case 18: + case "end": + return _context22.stop(); + } + } + }, _callee22, this); + })); + + function _updateDeviceMetadata() { + return _updateDeviceMetadata2.apply(this, arguments); + } + + return _updateDeviceMetadata; + }() + }, { + key: "_baseURL", + get: function get() { + if (this._endpoint !== null) { + return this._endpoint; + } + + return "https://".concat(this.instanceId, ".pushnotifications.pusher.com"); + } + }]); + + return Client; + }(); + + var validateInterestName = function validateInterestName(interest) { + if (interest === undefined || interest === null) { + throw new Error('Interest name is required'); + } + + if (typeof interest !== 'string') { + throw new Error("Interest ".concat(interest, " is not a string")); + } + + if (!INTERESTS_REGEX.test(interest)) { + throw new Error("interest \"".concat(interest, "\" contains a forbidden character. ") + 'Allowed characters are: ASCII upper/lower-case letters, ' + 'numbers or one of _-=@,.;'); + } + + if (interest.length > MAX_INTEREST_LENGTH) { + throw new Error("Interest is longer than the maximum of ".concat(MAX_INTEREST_LENGTH, " chars")); + } + }; + + function getServiceWorkerRegistration() { + return _getServiceWorkerRegistration.apply(this, arguments); + } + + function _getServiceWorkerRegistration() { + _getServiceWorkerRegistration = asyncToGenerator( + /*#__PURE__*/ + regenerator.mark(function _callee23() { + var _ref3, swStatusCode; + + return regenerator.wrap(function _callee23$(_context23) { + while (1) { + switch (_context23.prev = _context23.next) { + case 0: + _context23.next = 2; + return fetch(SERVICE_WORKER_URL); + + case 2: + _ref3 = _context23.sent; + swStatusCode = _ref3.status; + + if (!(swStatusCode !== 200)) { + _context23.next = 6; + break; + } + + throw new Error('Cannot start SDK, service worker missing: No file found at /service-worker.js'); + + case 6: + window.navigator.serviceWorker.register(SERVICE_WORKER_URL, { + // explicitly opting out of `importScripts` caching just in case our + // customers decides to host and serve the imported scripts and + // accidentally set `Cache-Control` to something other than `max-age=0` + updateViaCache: 'none' + }); + return _context23.abrupt("return", window.navigator.serviceWorker.ready); + + case 8: + case "end": + return _context23.stop(); + } + } + }, _callee23); + })); + return _getServiceWorkerRegistration.apply(this, arguments); + } + + function getWebPushToken(swReg) { + return swReg.pushManager.getSubscription().then(function (sub) { + return !sub ? null : encodeSubscription(sub); + }); + } + + function encodeSubscription(sub) { + return btoa(JSON.stringify(sub)); + } + + function urlBase64ToUInt8Array(base64String) { + var padding = '='.repeat((4 - base64String.length % 4) % 4); + var base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); + var rawData = window.atob(base64); + return Uint8Array.from(toConsumableArray(rawData).map(function (_char) { + return _char.charCodeAt(0); + })); + } + + function isSupportedBrowser() { + var winNav = window.navigator; + var vendorName = winNav.vendor; + var isChromium = window.chrome !== null && typeof window.chrome !== 'undefined'; + var isOpera = winNav.userAgent.indexOf('OPR') > -1; + var isEdge = winNav.userAgent.indexOf('Edg') > -1; + var isFirefox = winNav.userAgent.indexOf('Firefox') > -1; + var isChrome = isChromium && vendorName === 'Google Inc.' && !isEdge && !isOpera; + var isSupported = isChrome || isOpera || isFirefox || isEdge; + + if (!isSupported) { + console.warn('Pusher Web Push Notifications supports Chrome, Firefox, Edge and Opera.'); + } + + return isSupported; + } + + exports.Client = Client; + exports.RegistrationState = RegistrationState; + exports.TokenProvider = TokenProvider; + + return exports; + + }({})); + + +const pusherid = document.getElementById('pusherid').innerHTML; +const beamsClient = new PusherPushNotifications.Client({instanceId: pusherid}); +const strid = document.getElementById('strid').innerHTML; + +beamsClient.start() +.then((beamsClient) => beamsClient.getDeviceId()) +.then(() => beamsClient.addDeviceInterest(strid)) +.then(() => beamsClient.getDeviceInterests()) +.catch(console.error); \ No newline at end of file diff --git a/files/templates/home.html b/files/templates/home.html index 46a9c96c6a..0a779ec1b0 100644 --- a/files/templates/home.html +++ b/files/templates/home.html @@ -184,7 +184,7 @@ {% if PUSHER_ID != 'blahblahblah' and v %}
{{SITE}}{{v.id}}
{{PUSHER_ID}}
- +