diff --git a/extensions/realtime/js/dist/forum.js b/extensions/realtime/js/dist/forum.js index 2c07c357c2..31d6c93487 100644 --- a/extensions/realtime/js/dist/forum.js +++ b/extensions/realtime/js/dist/forum.js @@ -1,3 +1,3 @@ /*! For license information please see forum.js.LICENSE.txt */ -(()=>{var t={474(t){var e;window,e=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.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 i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));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,i=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])},r(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 o=256,s=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 i=t.length-n;return i>0&&(r=t[n]<<16|(2===i?t[n+1]<<8:0),e+=this._encodeByte(r>>>18&63),e+=this._encodeByte(r>>>12&63),e+=2===i?this._encodeByte(r>>>6&63):this._paddingCharacter||"",e+=this._paddingCharacter||""),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)),i=0,s=0,a=0,c=0,u=0,l=0,h=0;s>>4,r[i++]=u<<4|l>>>2,r[i++]=l<<6|h,a|=c&o,a|=u&o,a|=l&o,a|=h&o;if(s>>4,a|=c&o,a|=u&o),s>>2,a|=l&o),s>>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=o;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)+((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=s;var a=new s;e.encode=function(t){return a.encode(t)},e.decode=function(t){return a.decode(t)};var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(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=o;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)+((96-t&t-123)>>>8&-256+t-97+26)},e}(s);e.URLSafeCoder=c;var u=new c;e.encodeURLSafe=function(t){return u.encode(t)},e.decodeURLSafe=function(t){return u.decode(t)},e.encodedLength=function(t){return a.encodedLength(t)},e.maxDecodedLength=function(t){return a.maxDecodedLength(t)},e.decodedLength=function(t){return a.decodedLength(t)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r="utf8: invalid string",i="utf8: invalid source encoding";function o(t){for(var e=0,n=0;n=t.length-1)throw new Error(r);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(i);if(128!=(192&(s=t[++n])))throw new Error(i);r=(31&r)<<6|63&s,o=128}else if(r<240){if(n>=t.length-1)throw new Error(i);var s=t[++n],a=t[++n];if(128!=(192&s)||128!=(192&a))throw new Error(i);r=(15&r)<<12|(63&s)<<6|63&a,o=2048}else{if(!(r<248))throw new Error(i);if(n>=t.length-2)throw new Error(i);s=t[++n],a=t[++n];var c=t[++n];if(128!=(192&s)||128!=(192&a)||128!=(192&c))throw new Error(i);r=(15&r)<<18|(63&s)<<12|(63&a)<<6|63&c,o=65536}if(r=55296&&r<=57343)throw new Error(i);if(r>=65536){if(r>1114111)throw new Error(i);r-=65536,e.push(String.fromCharCode(55296|r>>10)),r=56320|1023&r}}e.push(String.fromCharCode(r))}return e.join("")}},function(t,e,n){t.exports=n(3).default},function(t,e,n){"use strict";n.r(e);var r,i=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+"]",i=!1,o=function(){i||(t.apply(null,arguments),i=!0)};return this[e]=o,{number:e,id:n,name:r,callback:o}},t.prototype.remove=function(t){delete this[t.number]},t}(),o=new i("_pusher_script_","Pusher.ScriptReceivers"),s="7.6.0",a=7,c=80,u=443,l="",h="sockjs.pusher.com",p=80,d=443,f="/pusher",m="stats.pusher.com",y="/pusher/auth",v="ajax",b=12e4,g=3e4,w=1e4,_="mt1",k={endpoint:"/pusher/user-auth",transport:"ajax"},S={endpoint:"/pusher/auth",transport:"ajax"},C="http://js.pusher.com",T="https://js.pusher.com",P="",O=function(){function t(t){this.options=t,this.receivers=t.receivers||o,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 i=qe.createScriptRequest(r.getPath(t,e)),o=r.receivers.create(function(e){if(r.receivers.remove(o),r.loading[t]){var n=r.loading[t];delete r.loading[t];for(var s=function(t){t||i.cleanup()},a=0;a>>6)+W(128|63&e):W(224|e>>>12&15)+W(128|e>>>6&63)+W(128|63&e)},V=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[X.charAt(n>>>18),X.charAt(n>>>12&63),e>=2?"=":X.charAt(n>>>6&63),e>=1?"=":X.charAt(63&n)].join("")},Q=window.btoa||function(t){return t.replace(/[\s\S]{1,3}/g,V)},Y=function(){function t(t,e,n,r){var i=this;this.clear=e,this.timer=t(function(){i.timer&&(i.timer=r(i.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}(),K=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])},t(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 Z(t){window.clearTimeout(t)}function tt(t){window.clearInterval(t)}var et=function(t){function e(e,n){return t.call(this,setTimeout,Z,e,function(t){return n(),null})||this}return K(e,t),e}(Y),nt=function(t){function e(e,n){return t.call(this,setInterval,tt,e,function(t){return n(),t})||this}return K(e,t),e}(Y),rt={now:function(){return Date.now?Date.now():(new Date).valueOf()},defer:function(t){return new et(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}},Qt=Vt,Yt=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])},t(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)}}(),Kt=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 Yt(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),bt.debug("Event sent",r),this.send(Qt.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=Qt.decodeMessage(e)}catch(n){t.emit("error",{type:"MessageParseError",error:n,data:e.data})}if(void 0!==n){switch(bt.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(){ct(e,function(e,n){t.transport.unbind(n,e)})};ct(e,function(e,n){t.transport.bind(n,e)})},e.prototype.handleCloseEvent=function(t){var e=Qt.getCloseAction(t),n=Qt.getCloseError(t);n&&this.emit("error",n),e&&this.emit(e,{action:e,error:n})},e}(jt),Zt=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=Qt.processHandshake(e)}catch(e){return t.finish("error",{error:e}),void t.transport.close()}"connected"===n.action?t.finish("connected",{connection:new Kt(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=Qt.getCloseAction(e)||"backoff",r=Qt.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(ot({transport:this.transport,action:t},e))},t}(),te=function(){function t(t,e){this.timeline=t,this.options=e||{}}return t.prototype.send=function(t,e){this.timeline.isEmpty()||this.timeline.send(qe.TimelineTransport.getAgent(this,t),e)},t}(),ee=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])},t(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)}}(),ne=function(t){function e(e,n){var r=t.call(this,function(t,n){bt.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 ee(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 N("Event '"+t+"' does not start with 'client-'");if(!this.subscribed){var n=L("triggeringClientEvents");bt.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;"pusher_internal:subscription_succeeded"===e?this.handleSubscriptionSucceededEvent(t):"pusher_internal:subscription_count"===e?this.handleSubscriptionCountEvent(t):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,bt.error(e.toString()),t.emit("pusher:subscription_error",Object.assign({},{type:"AuthError",error:e.message},e instanceof q?{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}(jt),re=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])},t(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)}}(),ie=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return re(e,t),e.prototype.authorize=function(t,e){return this.pusher.config.channelAuthorizer({channelName:this.name,socketId:t},e)},e}(ne),oe=ie,se=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;ct(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}(),ae=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])},t(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)}}(),ce=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.members=new se,r}return ae(e,t),e.prototype.authorize=function(e,n){var r=this;t.prototype.authorize.call(this,e,function(t,e){return i=r,o=void 0,a=function(){var r,i;return function(t,e){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&this.emit("connecting_in",Math.round(t/1e3)),this.retryTimer=new et(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 et(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 et(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 et(this.activityTimeout,function(){t.sendActivityCheck()}))},e.prototype.stopActivityCheck=function(){this.activityTimer&&this.activityTimer.ensureAborted()},e.prototype.buildConnectionCallbacks=function(t){var e=this;return ot({},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 ot({},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),bt.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}(jt),me=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 ye.createEncryptedChannel(t,e,e.config.nacl);var n=L("encryptedChannelSupport");throw new H("Tried to subscribe to a private-encrypted- channel but no nacl implementation available. "+n)}if(0===t.indexOf("private-"))return ye.createPrivateChannel(t,e);if(0===t.indexOf("presence-"))return ye.createPresenceChannel(t,e);if(0===t.indexOf("#"))throw new I('Cannot create a channel with name "'+t+'".');return ye.createChannel(t,e)}(t,e)),this.channels[t]},t.prototype.all=function(){return t=this.channels,e=[],ct(t,function(t){e.push(t)}),e;var t,e},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(){ct(this.channels,function(t){t.disconnect()})},t}(),ye={createChannels:function(){return new me},createConnectionManager:function(t,e){return new fe(t,e)},createChannel:function(t,e){return new ne(t,e)},createPrivateChannel:function(t,e){return new oe(t,e)},createPresenceChannel:function(t,e){return new ce(t,e)},createEncryptedChannel:function(t,e,n){return new pe(t,e,n)},createTimelineSender:function(t,e){return new te(t,e)},createHandshake:function(t,e){return new Zt(t,e)},createAssistantToTheTransportManager:function(t,e,n){return new $t(t,e,n)}},ve=function(){function t(t){this.options=t||{},this.livesLeft=this.options.lives||1/0}return t.prototype.getAssistant=function(t){return ye.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}(),be=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 ft(this.strategies,it.method("isSupported"))},t.prototype.connect=function(t,e){var n=this,r=this.strategies,i=0,o=this.timeout,s=null,a=function(c,u){u?e(null,u):(i+=1,n.loop&&(i%=r.length),i0&&(i=new et(n.timeout,function(){o.abort(),r(!0)})),o=t.connect(e,function(t,e){t&&i&&i.isRunning()&&!n.failFast||(i&&i.ensureAborted(),r(t,e))}),{abort:function(){i&&i.ensureAborted(),o.abort()},forceMinPriority:function(t){o.forceMinPriority(t)}}},t}(),ge=function(){function t(t){this.strategies=t}return t.prototype.isSupported=function(){return ft(this.strategies,it.method("isSupported"))},t.prototype.connect=function(t,e){return function(t,n){var r=ht(t,function(t,r,i,o){return t.connect(n,function(t,n){return function(r,i){n[t].error=r,r?function(t){return function(t,e){for(var n=0;n=it.now()){var o=this.transports[r.transport];o&&(this.timeline.info({cached:!0,transport:r.transport,latency:r.latency}),i.push(new be([o],{timeout:2*r.latency+1e3,failFast:!0})))}var s=it.now(),a=i.pop().connect(t,function r(o,c){o?(Ce(n),i.length>0?(s=it.now(),a=i.pop().connect(t,r)):e(o)):(function(t,e,n){var r=qe.getLocalStorage();if(r)try{r[Se(t)]=yt({timestamp:it.now(),transport:e,latency:n})}catch(t){}}(n,c.transport.name,it.now()-s),e(null,c))});return{abort:function(){a.abort()},forceMinPriority:function(e){t=e,a&&a.forceMinPriority(e)}}},t}(),ke=_e;function Se(t){return"pusherTransport"+(t?"TLS":"NonTLS")}function Ce(t){var e=qe.getLocalStorage();if(e)try{delete e[Se(t)]}catch(t){}}var Te=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,i=new et(this.options.delay,function(){n=r.connect(t,e)});return{abort:function(){i.ensureAborted(),n&&n.abort()},forceMinPriority:function(e){t=e,n&&n.forceMinPriority(e)}}},t}(),Pe=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}(),Oe=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 Ee(t){return function(){return t.isSupported()}}var xe,je={getRequest:function(t){var e=new window.XDomainRequest;return e.ontimeout=function(){t.emit("error",new D),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()}},Le=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])},t(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)}}(),Ae=function(t){function e(e,n,r){var i=t.call(this)||this;return i.hooks=e,i.method=n,i.url=r,i}return Le(e,t),e.prototype.start=function(t){var e=this;this.position=0,this.xhr=this.hooks.getRequest(this),this.unloader=function(){e.close()},qe.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&&(qe.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}(jt);!function(t){t[t.CONNECTING=0]="CONNECTING",t[t.OPEN=1]="OPEN",t[t.CLOSED=3]="CLOSED"}(xe||(xe={}));var Re=xe,Ne=1;function Ie(t){var e=-1===t.indexOf("?")?"?":"&";return t+e+"t="+ +new Date+"&n="+Ne++}function De(t){return qe.randomInt(t)}var Ue,Me=function(){function t(t,e){this.hooks=t,this.session=De(1e3)+"/"+function(){for(var t=[],e=0;e<8;e++)t.push(De(32).toString(32));return t.join("")}(),this.location=function(t){var e=/([^\?]*)\/*(\??.*)/.exec(t);return{base:e[1],queryString:e[2]}}(e),this.readyState=Re.CONNECTING,this.openStream()}return t.prototype.send=function(t){return this.sendRaw(JSON.stringify([t]))},t.prototype.ping=function(){this.hooks.sendHeartbeat(this)},t.prototype.close=function(t,e){this.onClose(t,e,!0)},t.prototype.sendRaw=function(t){if(this.readyState!==Re.OPEN)return!1;try{return qe.createSocketRequest("POST",Ie((e=this.location,n=this.session,e.base+"/"+n+"/xhr_send"))).start(t),!0}catch(t){return!1}var e,n},t.prototype.reconnect=function(){this.closeStream(),this.openStream()},t.prototype.onClose=function(t,e,n){this.closeStream(),this.readyState=Re.CLOSED,this.onclose&&this.onclose({code:t,reason:e,wasClean:n})},t.prototype.onChunk=function(t){var e;if(200===t.status)switch(this.readyState===Re.OPEN&&this.onActivity(),t.data.slice(0,1)){case"o":e=JSON.parse(t.data.slice(1)||"{}"),this.onOpen(e);break;case"a":e=JSON.parse(t.data.slice(1)||"[]");for(var 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()}},qe={nextAuthCallbackID:1,auth_callbacks:{},ScriptReceivers:o,DependenciesReceivers:E,getDefaultStrategy:function(t,e,n){var r={};function i(e,i,o,s,a){var c=n(t,e,i,o,s,a);return r[e]=c,c}var o,s=Object.assign({},e,{hostNonTLS:t.wsHost+":"+t.wsPort,hostTLS:t.wsHost+":"+t.wssPort,httpPath:t.wsPath}),a=Object.assign({},s,{useTLS:!0}),c=Object.assign({},e,{hostNonTLS:t.httpHost+":"+t.httpPort,hostTLS:t.httpHost+":"+t.httpsPort,httpPath:t.httpPath}),u={loop:!0,timeout:15e3,timeoutLimit:6e4},l=new ve({lives:2,minPingDelay:1e4,maxPingDelay:t.activityTimeout}),h=new ve({lives:2,minPingDelay:1e4,maxPingDelay:t.activityTimeout}),p=i("ws","ws",3,s,l),d=i("wss","ws",3,a,l),f=i("sockjs","sockjs",1,c),m=i("xhr_streaming","xhr_streaming",1,c,h),y=i("xdr_streaming","xdr_streaming",1,c,h),v=i("xhr_polling","xhr_polling",1,c),b=i("xdr_polling","xdr_polling",1,c),g=new be([p],u),w=new be([d],u),_=new be([f],u),k=new be([new Pe(Ee(m),m,y)],u),S=new be([new Pe(Ee(v),v,b)],u),C=new be([new Pe(Ee(k),new ge([k,new Te(S,{delay:4e3})]),S)],u),T=new Pe(Ee(C),C,_);return o=e.useTLS?new ge([g,new Te(T,{delay:2e3})]):new ge([g,new Te(w,{delay:2e3}),new Te(T,{delay:5e3})]),new ke(new Oe(new Pe(Ee(p),o,T)),r,{ttl:18e5,timeline:e.timeline,useTLS:e.useTLS})},Transports:Xt,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"),x.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:{createStreamingSocket:function(t){return this.createSocket(He,t)},createPollingSocket:function(t){return this.createSocket(Be,t)},createSocket:function(t,e){return new Me(t,e)},createXHR:function(t,e){return this.createRequest(ze,t,e)},createRequest:function(t,e,n){return new Ae(t,e,n)},createXDR:function(t,e){return this.createRequest(je,t,e)}},TimelineTransport:kt,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():x.load("json2",{},n)},getDocument:function(){return document},getProtocol:function(){return this.getDocument().location.protocol},getAuthorizers:function(){return{ajax:F,jsonp:gt}},onDocumentBody:function(t){var e=this;document.body?t():setTimeout(function(){e.onDocumentBody(t)},0)},createJSONPRequest:function(t,e){return new _t(t,e)},createScriptRequest:function(t){return new wt(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 Gt},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)},randomInt:function(t){return Math.floor((window.crypto||window.msCrypto).getRandomValues(new Uint32Array(1))[0]/Math.pow(2,32)*t)}};!function(t){t[t.ERROR=3]="ERROR",t[t.INFO=6]="INFO",t[t.DEBUG=7]="DEBUG"}(Ue||(Ue={}));var Fe=Ue,We=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(ot({},e,{timestamp:it.now()})),this.options.limit&&this.events.length>this.options.limit&&this.events.shift())},t.prototype.error=function(t){this.log(Fe.ERROR,t)},t.prototype.info=function(t){this.log(Fe.INFO,t)},t.prototype.debug=function(t){this.log(Fe.DEBUG,t)},t.prototype.isEmpty=function(){return 0===this.events.length},t.prototype.send=function(t,e){var n=this,r=ot({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}(),Xe=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 Je(new z,e);if(this.priority{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var r={};(()=>{"use strict";n.r(r),n.d(r,{extend:()=>Lt});const t=flarum.reg.get("core","forum/app");var e=n.n(t);const i=flarum.reg.get("core","common/extend");var o=n(474),s=n.n(o);const a=flarum.reg.get("core","common/Application");var c=n.n(a);function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function l(t,e,n){return(e=function(t){var e=function(t){if("object"!=u(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,"string");if("object"!=u(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==u(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}const h=new class{constructor(){l(this,"userChannelCallbacks",[]),l(this,"publicChannelCallbacks",[]),l(this,"discussionStreamEventNames",new Set),l(this,"userChannel",null),l(this,"publicChannel",null)}registerDiscussionStreamEvents(t){for(const e of t)this.discussionStreamEventNames.add(e)}onUserChannelReady(t){this.userChannel?t(this.userChannel):this.userChannelCallbacks.push(t)}onPublicChannelReady(t){this.publicChannel?t(this.publicChannel):this.publicChannelCallbacks.push(t)}getDiscussionStreamEventNames(){return Array.from(this.discussionStreamEventNames)}notifyUserChannelReady(t){this.userChannel=t;for(const e of this.userChannelCallbacks)e(t);this.userChannelCallbacks=[]}notifyPublicChannelReady(t){this.publicChannel=t;for(const e of this.publicChannelCallbacks)e(t);this.publicChannelCallbacks=[]}},p=flarum.reg.get("core","common/Component");var d=n.n(p);const f=flarum.reg.get("core","forum/components/NotificationType");var y=n.n(f);const v=flarum.reg.get("core","common/models/Discussion");var b=n.n(v);const g=flarum.reg.get("core","common/components/Link");var w=n.n(g);class _ extends(d()){view(){const t=this.attrs.state.all();return t.length?m("div",{className:"NotificationToasts","aria-live":"polite","aria-label":e().translator.trans("core.forum.notifications.title")},t.map(t=>{const n=function(t){const e=t.subject();return e?e instanceof b()?e:"function"==typeof e.discussion&&null!=(n=e.discussion())?n:null:null;var n}(t.notification);return m("div",{key:t.id,className:"NotificationToast",onclick:()=>this.attrs.state.dismiss(t.id)},n&&m("div",{className:"NotificationToast-context"},m(w(),{href:e().route.discussion(n)},n.title())),m(y(),{notification:t.notification}))})):null}}flarum.reg.add("flarum-realtime","forum/components/NotificationToast",_);let k=0;class S{constructor(){l(this,"toasts",[])}all(){return this.toasts}push(t){var n,r,i;const o=null!=(i=(null!=(n=null==(r=e().data)?void 0:r.settings)?n:{})["flarum-realtime.notification-toast-dismiss-after"])?i:10;if(0===o)return;const s=k++;this.toasts.push({id:s,notification:t}),m.redraw(),setTimeout(()=>this.dismiss(s),1e3*o)}dismiss(t){const e=this.toasts.findIndex(e=>e.id===t);-1!==e&&(this.toasts.splice(e,1),m.redraw())}}flarum.reg.add("flarum-realtime","forum/states/NotificationToastState",S);const C=flarum.reg.get("core","forum/components/DiscussionPage");var T=n.n(C);const P="Flarum\\Post\\Event\\Posted",O="discussionRenamed",E="revisedEvent",x=flarum.reg.get("core","common/utils/Stream");var j=n.n(x);const L=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)},A="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;var R="object"==typeof self&&self&&self.Object===Object&&self;const N=A||R||Function("return this")(),I=function(){return N.Date.now()};var D=/\s/;var U=/^\s+/;const M=function(t){return t?t.slice(0,function(t){for(var e=t.length;e--&&D.test(t.charAt(e)););return e}(t)+1).replace(U,""):t},H=N.Symbol;var B=Object.prototype,z=B.hasOwnProperty,q=B.toString,F=H?H.toStringTag:void 0;var W=Object.prototype.toString;var X=H?H.toStringTag:void 0;const J=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":X&&X in Object(t)?function(t){var e=z.call(t,F),n=t[F];try{t[F]=void 0;var r=!0}catch(t){}var i=q.call(t);return r&&(e?t[F]=n:delete t[F]),i}(t):function(t){return W.call(t)}(t)};var G=/^[-+]0x[0-9a-f]+$/i,V=/^0b[01]+$/i,Q=/^0o[0-7]+$/i,Y=parseInt;const K=function(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return null!=t&&"object"==typeof t}(t)&&"[object Symbol]"==J(t)}(t))return NaN;if(L(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=L(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=M(t);var n=V.test(t);return n||Q.test(t)?Y(t.slice(2),n?2:8):G.test(t)?NaN:+t};var Z=Math.max,tt=Math.min;const et=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new TypeError("Expected a function");return L(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),function(t,e,n){var r,i,o,s,a,c,u=0,l=!1,h=!1,p=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function d(e){var n=r,o=i;return r=i=void 0,u=e,s=t.apply(o,n)}function f(t){var n=t-c;return void 0===c||n>=e||n<0||h&&t-u>=o}function m(){var t=I();if(f(t))return y(t);a=setTimeout(m,function(t){var n=e-(t-c);return h?tt(n,o-(t-u)):n}(t))}function y(t){return a=void 0,p&&r?d(t):(r=i=void 0,s)}function v(){var t=I(),n=f(t);if(r=arguments,i=this,c=t,n){if(void 0===a)return function(t){return u=t,a=setTimeout(m,e),l?d(t):s}(c);if(h)return clearTimeout(a),a=setTimeout(m,e),d(c)}return void 0===a&&(a=setTimeout(m,e)),s}return e=K(e)||0,L(n)&&(l=!!n.leading,o=(h="maxWait"in n)?Z(K(n.maxWait)||0,e):o,p="trailing"in n?!!n.trailing:p),v.cancel=function(){void 0!==a&&clearTimeout(a),u=0,r=c=i=a=void 0},v.flush=function(){return void 0===a?s:y(I())},v}(t,e,{leading:r,maxWait:e,trailing:i})},nt=flarum.reg.get("core","common/components/Icon");var rt=n.n(nt);const it=flarum.reg.get("core","common/utils/classList");var ot=n.n(it);function st(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)}return n}function at(t){for(var e=1;e{var n;if(e().store.pushPayload(t).id()===(null==(n=this.discussion)?void 0:n.id())&&this.stream){const t=this.discussion.commentCount();e().store.find("discussions",this.discussion.id()).then(()=>{this.stream.update().then(()=>m.redraw()),document.hasFocus()||(e().setTitleCount(Math.max(0,this.discussion.commentCount()-t)),$(window).one("focus",()=>{e().setTitleCount(0)}))})}},this.websocketEventStreamUpdate=t=>{var n;e().store.pushPayload(t).id()===(null==(n=this.discussion)?void 0:n.id())&&this.stream&&e().store.find("discussions",this.discussion.id()).then(()=>{this.stream.update().then(()=>m.redraw())})}}),(0,i.extend)(T().prototype,"oncreate",function(){var t,n,r,i,o,s;null==(t=e().websocket_channels.public)||t.bind(P,this.websocketEventPosted.bind(this)),null==(n=e().websocket_channels.user)||n.bind(P,this.websocketEventPosted.bind(this)),null==(r=e().websocket_channels.public)||r.bind(O,this.websocketEventStreamUpdate.bind(this)),null==(i=e().websocket_channels.user)||i.bind(O,this.websocketEventStreamUpdate.bind(this)),null==(o=e().websocket_channels.public)||o.bind(E,this.websocketEventPosted.bind(this)),null==(s=e().websocket_channels.user)||s.bind(E,this.websocketEventPosted.bind(this));for(const t of h.getDiscussionStreamEventNames()){var a,c;null==(a=e().websocket_channels.public)||a.bind(t,this.websocketEventStreamUpdate.bind(this)),null==(c=e().websocket_channels.user)||c.bind(t,this.websocketEventStreamUpdate.bind(this))}}),(0,i.extend)(T().prototype,"onremove",function(){var t,n,r,i,o,s;null==(t=e().websocket_channels.public)||t.unbind(P),null==(n=e().websocket_channels.user)||n.unbind(P),null==(r=e().websocket_channels.public)||r.unbind(O),null==(i=e().websocket_channels.user)||i.unbind(O),null==(o=e().websocket_channels.public)||o.unbind(E),null==(s=e().websocket_channels.user)||s.unbind(E);for(const t of h.getDiscussionStreamEventNames()){var a,c;null==(a=e().websocket_channels.public)||a.unbind(t),null==(c=e().websocket_channels.user)||c.unbind(t)}}),e().data["flarum-realtime.typing-indicator"]&&((0,i.extend)("flarum/forum/components/PostStream","endItems",function(t){if(this.discussion.attribute("canViewWhoTypes")){var n;const o=Object.keys(this.getTypingUsers()),s=o.length,a=3,c=ot()(["TypingUsersContainer",s>0&&"TypingUsersContainer-active"]),u=s>0?"fas fa-ellipsis-h fa-beat":"fas fa-pause",l=o.slice(0,a).join(", ");let h=!0;var r,i;null!=(n=e().session)&&n.user&&(h=null==(r=null==(i=e().session.user.preferences())?void 0:i["flarum-realtime.typing-indicator-full"])||r),t.add("usersTyping",m("div",{className:c,key:"typing"},m("div",{className:"TypingUsers"},m(rt(),{name:u}),s>0?h?e().translator.trans("flarum-realtime.forum.typing-indicator.users-are-typing",{users:l,count:s,others:Math.max(s-a,0)}):e().translator.trans("flarum-realtime.forum.typing-indicator.people-are-typing",{number:s}):e().translator.trans("flarum-realtime.forum.typing-indicator.no-activity"))),70)}}),(0,i.extend)("flarum/forum/components/PostStream","oninit",function(){this.previousContent=j()(""),this.usersTyping=j()({}),this.typingTruncationListener=null,this.typingListener=null,this.getTypingUsers=()=>{const t=Date.now()-6e3,e=at({},this.usersTyping());let n=null;for(const r of Object.keys(e))e[r]m.redraw(),n-Date.now())),e},this.userTyping=t=>{const n=at({},this.usersTyping());t.discloseOnline||(t.displayName=String(e().translator.trans("flarum-realtime.forum.typing-indicator.anonymous-user"))),n[t.displayName]=t.time,this.usersTyping(n),m.redraw()},this.actorIsTyping=()=>{var t,n,r;const i=null==(t=e().session.user)||null==(t=t.preferences())?void 0:t.discloseOnline;null==(n=e().websocket_channels.discussion)||n.trigger("client-typing",{displayName:i?null==(r=e().session.user)?void 0:r.displayName():"[anonymous]",discloseOnline:i,time:Date.now()})},this.checkTyping=()=>{var t,n;if(!e().composer.composingReplyTo(this.discussion))return;const r=null==(t=e().composer.fields)||null==(n=t.content)?void 0:n.call(t);this.previousContent()!==r&&(this.actorIsTyping(),this.previousContent(r))}}),(0,i.extend)("flarum/forum/components/PostStream","view",function(){if(!e().forum.attribute("websocket.disallow_connection")){if(this.discussion&&e().composer.editor&&!this.typingListener){const t=et(()=>this.checkTyping(),2e3);this.typingListener=setInterval(t,1e3)}this.discussion&&(e().websocket_channels.discussion=e().websocket.subscribe("private-typing="+m.route.param("id").match(/[0-9]+/)),this.discussion.attribute("canViewWhoTypes")&&e().websocket_channels.discussion.bind("client-typing",t=>{this.userTyping(t)}))}}),(0,i.extend)("flarum/forum/components/PostStream","onremove",function(){this.typingListener&&clearInterval(this.typingListener),this.typingTruncationListener&&clearTimeout(this.typingTruncationListener)}))}flarum.reg.add("flarum-realtime","forum/extend/Discussion",ct);const ut=flarum.reg.get("core","common/models/Post");var lt=n.n(ut);const ht=flarum.reg.get("core","forum/components/IndexPage");var pt=n.n(ht);const dt=flarum.reg.get("core","common/components/Button");var ft=n.n(dt);class mt{constructor(){l(this,"discussions",{}),l(this,"releaseInterval",e().forum.attribute("flarum-realtime.release-discussion-updates-interval")),l(this,"timer",void 0),l(this,"onTimerCallback",null),l(this,"seconds",this.releaseInterval)}length(){return Object.keys(this.discussions).length}push(t){this.discussions[t.id()]=t}remove(t){delete this.discussions[t.id()]}has(t){return!!this.discussions[t.id()]}isEmpty(){return 0===this.length()}reset(){this.discussions={}}getReleaseInterval(){return this.releaseInterval}release(t){Object.keys(this.discussions).forEach(e=>{t.addDiscussion(this.discussions[e])}),this.reset(),e().setTitleCount(0)}startTimer(){this.autoRelease()&&(clearInterval(this.timer),this.seconds=this.getReleaseInterval(),this.timer=window.setInterval(()=>{if(this.seconds<0&&this.timer)return clearInterval(this.timer);this.seconds--,this.onTimerCallback&&this.onTimerCallback(this.seconds)},1e3))}onTimer(t){this.onTimerCallback=t}autoRelease(){return this.releaseInterval>0}}flarum.reg.add("flarum-realtime","forum/extend/DiscussionList/WebsocketUpdates",mt);const yt=flarum.reg.get("core","common/utils/extractText");var vt=n.n(yt);function bt(){e().data["flarum-realtime.release-discussion-updates"]&&((0,i.extend)(pt().prototype,"oninit",function(){this._realtimeWebsocketUpdates=new mt,this._realtimeReleaseTimeout=this._realtimeWebsocketUpdates.getReleaseInterval(),this._realtimeWebsocketEventPosted=t=>{var n;const r=e().discussions.getParams(),i=r.tags?e().store.getBy("tags","slug",r.tags):null,o=0===Object.keys(null!=(n=r.filter)?n:{}).length;if(!r.q&&!r.sort&&(i||o)){var s,a,c,u,l,h,p,d,f,y,v,g,w,_,k,S,C,T,P,O;const n=e().store.pushPayload(t);let o=n instanceof b()?n:null;if(!o&&n instanceof lt()&&(o=n.discussion()),!o)return;if(!("byobuPrivate"!==e().current.data.routeName||null!=(s=(a=o).recipientUsers)&&s.call(a)&&null!=(c=(u=o).recipientGroups)&&c.call(u)))return;if("byobuPrivate"===e().current.data.routeName&&0===(null==(l=(h=o).recipientUsers)||null==(l=l.call(h))?void 0:l.length)&&0===(null==(p=(d=o).recipientGroups)||null==(p=p.call(d))?void 0:p.length))return;if("byobuUserPrivate"===e().current.data.routeName)return;if("user.discussions"===e().current.data.routeName)return;if(i&&null!=(f=(y=o).tags)&&f.call(y)&&!o.tags().map(t=>t.id()).includes(i.id()))return;if(null!=(v=(g=o).tags)&&v.call(g)&&o.tags().find(t=>{var e,n;return!(i&&i.id()===t.id()||(i||null==(e=t.isHidden)||!e.call(t))&&"hide"!==(null==(n=t.subscription)?void 0:n.call(t)))}))return;if("ignore"===(null==(w=(_=o).subscription)?void 0:w.call(_)))return;const L=null==(k=(S=o).tags)||null==(k=k.call(S))?void 0:k.find(t=>{var e,n;return"lurk"===(null==(e=t.subscription)?void 0:e.call(t))||"follow"===(null==(n=t.subscription)?void 0:n.call(t))});var E,x,j;if("following"===e().current.get("routeName")&&(null!=(E=r.filter)&&E["following-tag"]&&!L||"follow"!==(null==(x=(j=o).subscription)?void 0:x.call(j))))return;const A=this._realtimeWebsocketUpdates;if(A.has(o))return;if((null==(C=e().discussions.getPages()[0])||null==(C=C.items[0])?void 0:C.id())===o.id())return;const R=!e().current.get("discussion"),N=o.id()===(null==(T=e().current.get("discussion"))?void 0:T.id())||L||"follow"===(null==(P=(O=o).subscription)?void 0:P.call(O));(R||N)&&(A.push(o),e().setTitleCount(A.length()),m.redraw())}}}),(0,i.extend)(pt().prototype,"oncreate",function(){var t,n,r,i;null==(t=e().websocket_channels.public)||t.bind("Flarum\\Discussion\\Event\\Started",this._realtimeWebsocketEventPosted.bind(this)),null==(n=e().websocket_channels.public)||n.bind("Flarum\\Post\\Event\\Posted",this._realtimeWebsocketEventPosted.bind(this)),null==(r=e().websocket_channels.user)||r.bind("Flarum\\Discussion\\Event\\Started",this._realtimeWebsocketEventPosted.bind(this)),null==(i=e().websocket_channels.user)||i.bind("Flarum\\Post\\Event\\Posted",this._realtimeWebsocketEventPosted.bind(this))}),(0,i.extend)(pt().prototype,"onremove",function(){var t,n,r,i;null==(t=e().websocket_channels.public)||t.unbind("Flarum\\Discussion\\Event\\Started"),null==(n=e().websocket_channels.public)||n.unbind("Flarum\\Post\\Event\\Posted"),null==(r=e().websocket_channels.user)||r.unbind("Flarum\\Discussion\\Event\\Started"),null==(i=e().websocket_channels.user)||i.unbind("Flarum\\Post\\Event\\Posted")}),(0,i.extend)(pt().prototype,"contentItems",function(t){const n=this._realtimeWebsocketUpdates;if(!n||n.isEmpty())return;const r=()=>{n.release(e().discussions),e().setTitleCount(0),m.redraw()},i=t=>n.autoRelease()?e().translator.trans("flarum-realtime.forum.push.discussion-list-new-activity-with-auto-release",{count:n.length(),releaseTimeout:t}):e().translator.trans("flarum-realtime.forum.push.discussion-list-new-activity",{count:n.length()});n.startTimer(),n.onTimer(t=>{if(0===t)return r();this.$(".DiscussionList-update > .Button-label").text(vt()(i(t)))}),t.add("realtimeNewActivity",ft().component({className:"Button DiscussionList-update","aria-live":"polite","aria-atomic":"true",onclick:r},i(this._realtimeReleaseTimeout)),95)}),(0,i.extend)(pt().prototype,"actionItems",t=>{t.remove("refresh")}))}flarum.reg.add("flarum-realtime","forum/extend/DiscussionList",bt);const gt=flarum.reg.get("core","common/components/FieldSet");var wt=n.n(gt);const _t=flarum.reg.get("core","common/utils/ItemList");var kt=n.n(_t);const St=flarum.reg.get("core","common/components/Switch");var Ct=n.n(St);function Tt(t){var n;const r=new(kt());let i=!1;return r.add("typing-indicator",[m(Ct(),{state:null==(n=t.preferences())?void 0:n["flarum-realtime.typing-indicator-full"],onchange:e=>{i=!0,t.savePreferences({"flarum-realtime.typing-indicator-full":e}).then(()=>{i=!1,m.redraw()})},loading:i},e().translator.trans("flarum-realtime.forum.user.settings.typing-indicator-type.label")),m("p",{className:"helpText"},e().translator.trans("flarum-realtime.forum.user.settings.typing-indicator-type.help"))],80),r}function Pt(){e().data["flarum-realtime.typing-indicator"]&&(0,i.extend)("flarum/forum/components/SettingsPage","settingsItems",function(t){const n=this.user;n&&n.canViewWhoTypes()&&t.add("realtimeItems",m(wt(),{className:"Settings-realtime",label:e().translator.trans("flarum-realtime.forum.user.settings.heading")},Tt(n).toArray()),55)})}flarum.reg.add("flarum-realtime","forum/extend/User/RealtimeUserPreferences",Tt),flarum.reg.add("flarum-realtime","forum/extend/User/extendUserPreferences",Pt);const Ot=flarum.reg.get("core","common/extenders");var Et=n.n(Ot);const xt=flarum.reg.get("core","common/models/User");var jt=n.n(xt);const Lt=[new(Et().Model)(jt()).attribute("canViewWhoTypes")];flarum.reg.add("flarum-realtime","forum/extenders/Realtime",class{constructor(){l(this,"discussionStreamEvents",[]),l(this,"channelBindings",[])}onDiscussionStreamEvent(t){return this.discussionStreamEvents.push({eventName:t}),this}onUserChannelEvent(t,e){return this.channelBindings.push({channel:"user",eventName:t,callback:e}),this}onPublicChannelEvent(t,e){return this.channelBindings.push({channel:"public",eventName:t,callback:e}),this}onBothChannelsEvent(t,e){return this.channelBindings.push({channel:"both",eventName:t,callback:e}),this}extend(t,e){if(this.discussionStreamEvents.length||this.channelBindings.length){h.registerDiscussionStreamEvents(this.discussionStreamEvents.map(t=>t.eventName));for(const t of this.channelBindings)"user"!==t.channel&&"both"!==t.channel||h.onUserChannelReady(e=>{e.bind(t.eventName,t.callback)}),"public"!==t.channel&&"both"!==t.channel||h.onPublicChannelReady(e=>{e.bind(t.eventName,t.callback)})}}}),flarum.reg.add("flarum-realtime","forum/RealtimeState",h),e().initializers.add("flarum-realtime",()=>{(0,i.extend)(c().prototype,"mount",function(){s().logToConsole=this.forum.attribute("debug");const t=this.forum.attribute("websocket.host"),n=this.forum.attribute("websocket.secure");e().websocket=new(s())(this.forum.attribute("websocket.key"),{channelAuthorization:{endpoint:this.forum.attribute("apiUrl")+"/websocket/auth",transport:"ajax"},wsHost:t,wsPort:this.forum.attribute("websocket.port"),wssPort:this.forum.attribute("websocket.port"),enabledTransports:["wss","ws"],forceTLS:n}),e().websocket_channels={public:null,user:null};const r=new S,i=document.createElement("div");if(document.body.appendChild(i),m.mount(i,{view:()=>m(_,{state:r})}),e().session.user){const t=e().websocket.subscribe("private-user="+e().session.user.id());e().websocket_channels.user=t,h.notifyUserChannelReady(t),t.bind("notification",t=>{const n=e().store.pushPayload(t);if(n){var i,o;const t=e().session.user;null==t||t.pushAttributes({unreadNotificationCount:(null!=(i=t.unreadNotificationCount())?i:0)+1,newNotificationCount:(null!=(o=t.newNotificationCount())?o:0)+1}),r.push(n)}})}else if(!this.forum.attribute("websocket.disallow_connection")){const t=e().websocket.subscribe("public");e().websocket_channels.public=t,h.notifyPublicChannelReady(t)}}),ct(),bt(),Pt()})})(),module.exports=r})(); +(()=>{var t={474(t){var e;window,e=function(){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.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 i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));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,i=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])},r(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 o=256,s=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 i=t.length-n;return i>0&&(r=t[n]<<16|(2===i?t[n+1]<<8:0),e+=this._encodeByte(r>>>18&63),e+=this._encodeByte(r>>>12&63),e+=2===i?this._encodeByte(r>>>6&63):this._paddingCharacter||"",e+=this._paddingCharacter||""),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)),i=0,s=0,a=0,c=0,u=0,l=0,h=0;s>>4,r[i++]=u<<4|l>>>2,r[i++]=l<<6|h,a|=c&o,a|=u&o,a|=l&o,a|=h&o;if(s>>4,a|=c&o,a|=u&o),s>>2,a|=l&o),s>>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=o;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)+((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=s;var a=new s;e.encode=function(t){return a.encode(t)},e.decode=function(t){return a.decode(t)};var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(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=o;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)+((96-t&t-123)>>>8&-256+t-97+26)},e}(s);e.URLSafeCoder=c;var u=new c;e.encodeURLSafe=function(t){return u.encode(t)},e.decodeURLSafe=function(t){return u.decode(t)},e.encodedLength=function(t){return a.encodedLength(t)},e.maxDecodedLength=function(t){return a.maxDecodedLength(t)},e.decodedLength=function(t){return a.decodedLength(t)}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r="utf8: invalid string",i="utf8: invalid source encoding";function o(t){for(var e=0,n=0;n=t.length-1)throw new Error(r);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(i);if(128!=(192&(s=t[++n])))throw new Error(i);r=(31&r)<<6|63&s,o=128}else if(r<240){if(n>=t.length-1)throw new Error(i);var s=t[++n],a=t[++n];if(128!=(192&s)||128!=(192&a))throw new Error(i);r=(15&r)<<12|(63&s)<<6|63&a,o=2048}else{if(!(r<248))throw new Error(i);if(n>=t.length-2)throw new Error(i);s=t[++n],a=t[++n];var c=t[++n];if(128!=(192&s)||128!=(192&a)||128!=(192&c))throw new Error(i);r=(15&r)<<18|(63&s)<<12|(63&a)<<6|63&c,o=65536}if(r=55296&&r<=57343)throw new Error(i);if(r>=65536){if(r>1114111)throw new Error(i);r-=65536,e.push(String.fromCharCode(55296|r>>10)),r=56320|1023&r}}e.push(String.fromCharCode(r))}return e.join("")}},function(t,e,n){t.exports=n(3).default},function(t,e,n){"use strict";n.r(e);var r,i=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+"]",i=!1,o=function(){i||(t.apply(null,arguments),i=!0)};return this[e]=o,{number:e,id:n,name:r,callback:o}},t.prototype.remove=function(t){delete this[t.number]},t}(),o=new i("_pusher_script_","Pusher.ScriptReceivers"),s="7.6.0",a=7,c=80,u=443,l="",h="sockjs.pusher.com",p=80,d=443,f="/pusher",m="stats.pusher.com",y="/pusher/auth",v="ajax",b=12e4,g=3e4,w=1e4,_="mt1",k={endpoint:"/pusher/user-auth",transport:"ajax"},S={endpoint:"/pusher/auth",transport:"ajax"},C="http://js.pusher.com",T="https://js.pusher.com",P="",O=function(){function t(t){this.options=t,this.receivers=t.receivers||o,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 i=qe.createScriptRequest(r.getPath(t,e)),o=r.receivers.create(function(e){if(r.receivers.remove(o),r.loading[t]){var n=r.loading[t];delete r.loading[t];for(var s=function(t){t||i.cleanup()},a=0;a>>6)+W(128|63&e):W(224|e>>>12&15)+W(128|e>>>6&63)+W(128|63&e)},V=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[X.charAt(n>>>18),X.charAt(n>>>12&63),e>=2?"=":X.charAt(n>>>6&63),e>=1?"=":X.charAt(63&n)].join("")},Q=window.btoa||function(t){return t.replace(/[\s\S]{1,3}/g,V)},Y=function(){function t(t,e,n,r){var i=this;this.clear=e,this.timer=t(function(){i.timer&&(i.timer=r(i.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}(),K=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])},t(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 Z(t){window.clearTimeout(t)}function tt(t){window.clearInterval(t)}var et=function(t){function e(e,n){return t.call(this,setTimeout,Z,e,function(t){return n(),null})||this}return K(e,t),e}(Y),nt=function(t){function e(e,n){return t.call(this,setInterval,tt,e,function(t){return n(),t})||this}return K(e,t),e}(Y),rt={now:function(){return Date.now?Date.now():(new Date).valueOf()},defer:function(t){return new et(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}},Qt=Vt,Yt=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])},t(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)}}(),Kt=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 Yt(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),bt.debug("Event sent",r),this.send(Qt.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=Qt.decodeMessage(e)}catch(n){t.emit("error",{type:"MessageParseError",error:n,data:e.data})}if(void 0!==n){switch(bt.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(){ct(e,function(e,n){t.transport.unbind(n,e)})};ct(e,function(e,n){t.transport.bind(n,e)})},e.prototype.handleCloseEvent=function(t){var e=Qt.getCloseAction(t),n=Qt.getCloseError(t);n&&this.emit("error",n),e&&this.emit(e,{action:e,error:n})},e}(jt),Zt=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=Qt.processHandshake(e)}catch(e){return t.finish("error",{error:e}),void t.transport.close()}"connected"===n.action?t.finish("connected",{connection:new Kt(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=Qt.getCloseAction(e)||"backoff",r=Qt.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(ot({transport:this.transport,action:t},e))},t}(),te=function(){function t(t,e){this.timeline=t,this.options=e||{}}return t.prototype.send=function(t,e){this.timeline.isEmpty()||this.timeline.send(qe.TimelineTransport.getAgent(this,t),e)},t}(),ee=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])},t(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)}}(),ne=function(t){function e(e,n){var r=t.call(this,function(t,n){bt.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 ee(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 N("Event '"+t+"' does not start with 'client-'");if(!this.subscribed){var n=L("triggeringClientEvents");bt.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;"pusher_internal:subscription_succeeded"===e?this.handleSubscriptionSucceededEvent(t):"pusher_internal:subscription_count"===e?this.handleSubscriptionCountEvent(t):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,bt.error(e.toString()),t.emit("pusher:subscription_error",Object.assign({},{type:"AuthError",error:e.message},e instanceof q?{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}(jt),re=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])},t(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)}}(),ie=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return re(e,t),e.prototype.authorize=function(t,e){return this.pusher.config.channelAuthorizer({channelName:this.name,socketId:t},e)},e}(ne),oe=ie,se=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;ct(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}(),ae=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])},t(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)}}(),ce=function(t){function e(e,n){var r=t.call(this,e,n)||this;return r.members=new se,r}return ae(e,t),e.prototype.authorize=function(e,n){var r=this;t.prototype.authorize.call(this,e,function(t,e){return i=r,o=void 0,a=function(){var r,i;return function(t,e){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!((i=(i=s.trys).length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&this.emit("connecting_in",Math.round(t/1e3)),this.retryTimer=new et(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 et(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 et(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 et(this.activityTimeout,function(){t.sendActivityCheck()}))},e.prototype.stopActivityCheck=function(){this.activityTimer&&this.activityTimer.ensureAborted()},e.prototype.buildConnectionCallbacks=function(t){var e=this;return ot({},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 ot({},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),bt.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}(jt),me=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 ye.createEncryptedChannel(t,e,e.config.nacl);var n=L("encryptedChannelSupport");throw new H("Tried to subscribe to a private-encrypted- channel but no nacl implementation available. "+n)}if(0===t.indexOf("private-"))return ye.createPrivateChannel(t,e);if(0===t.indexOf("presence-"))return ye.createPresenceChannel(t,e);if(0===t.indexOf("#"))throw new I('Cannot create a channel with name "'+t+'".');return ye.createChannel(t,e)}(t,e)),this.channels[t]},t.prototype.all=function(){return t=this.channels,e=[],ct(t,function(t){e.push(t)}),e;var t,e},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(){ct(this.channels,function(t){t.disconnect()})},t}(),ye={createChannels:function(){return new me},createConnectionManager:function(t,e){return new fe(t,e)},createChannel:function(t,e){return new ne(t,e)},createPrivateChannel:function(t,e){return new oe(t,e)},createPresenceChannel:function(t,e){return new ce(t,e)},createEncryptedChannel:function(t,e,n){return new pe(t,e,n)},createTimelineSender:function(t,e){return new te(t,e)},createHandshake:function(t,e){return new Zt(t,e)},createAssistantToTheTransportManager:function(t,e,n){return new $t(t,e,n)}},ve=function(){function t(t){this.options=t||{},this.livesLeft=this.options.lives||1/0}return t.prototype.getAssistant=function(t){return ye.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}(),be=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 ft(this.strategies,it.method("isSupported"))},t.prototype.connect=function(t,e){var n=this,r=this.strategies,i=0,o=this.timeout,s=null,a=function(c,u){u?e(null,u):(i+=1,n.loop&&(i%=r.length),i0&&(i=new et(n.timeout,function(){o.abort(),r(!0)})),o=t.connect(e,function(t,e){t&&i&&i.isRunning()&&!n.failFast||(i&&i.ensureAborted(),r(t,e))}),{abort:function(){i&&i.ensureAborted(),o.abort()},forceMinPriority:function(t){o.forceMinPriority(t)}}},t}(),ge=function(){function t(t){this.strategies=t}return t.prototype.isSupported=function(){return ft(this.strategies,it.method("isSupported"))},t.prototype.connect=function(t,e){return function(t,n){var r=ht(t,function(t,r,i,o){return t.connect(n,function(t,n){return function(r,i){n[t].error=r,r?function(t){return function(t,e){for(var n=0;n=it.now()){var o=this.transports[r.transport];o&&(this.timeline.info({cached:!0,transport:r.transport,latency:r.latency}),i.push(new be([o],{timeout:2*r.latency+1e3,failFast:!0})))}var s=it.now(),a=i.pop().connect(t,function r(o,c){o?(Ce(n),i.length>0?(s=it.now(),a=i.pop().connect(t,r)):e(o)):(function(t,e,n){var r=qe.getLocalStorage();if(r)try{r[Se(t)]=yt({timestamp:it.now(),transport:e,latency:n})}catch(t){}}(n,c.transport.name,it.now()-s),e(null,c))});return{abort:function(){a.abort()},forceMinPriority:function(e){t=e,a&&a.forceMinPriority(e)}}},t}(),ke=_e;function Se(t){return"pusherTransport"+(t?"TLS":"NonTLS")}function Ce(t){var e=qe.getLocalStorage();if(e)try{delete e[Se(t)]}catch(t){}}var Te=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,i=new et(this.options.delay,function(){n=r.connect(t,e)});return{abort:function(){i.ensureAborted(),n&&n.abort()},forceMinPriority:function(e){t=e,n&&n.forceMinPriority(e)}}},t}(),Pe=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}(),Oe=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 Ee(t){return function(){return t.isSupported()}}var xe,je={getRequest:function(t){var e=new window.XDomainRequest;return e.ontimeout=function(){t.emit("error",new D),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()}},Le=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])},t(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)}}(),Ae=function(t){function e(e,n,r){var i=t.call(this)||this;return i.hooks=e,i.method=n,i.url=r,i}return Le(e,t),e.prototype.start=function(t){var e=this;this.position=0,this.xhr=this.hooks.getRequest(this),this.unloader=function(){e.close()},qe.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&&(qe.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}(jt);!function(t){t[t.CONNECTING=0]="CONNECTING",t[t.OPEN=1]="OPEN",t[t.CLOSED=3]="CLOSED"}(xe||(xe={}));var Re=xe,Ne=1;function Ie(t){var e=-1===t.indexOf("?")?"?":"&";return t+e+"t="+ +new Date+"&n="+Ne++}function De(t){return qe.randomInt(t)}var Ue,Me=function(){function t(t,e){this.hooks=t,this.session=De(1e3)+"/"+function(){for(var t=[],e=0;e<8;e++)t.push(De(32).toString(32));return t.join("")}(),this.location=function(t){var e=/([^\?]*)\/*(\??.*)/.exec(t);return{base:e[1],queryString:e[2]}}(e),this.readyState=Re.CONNECTING,this.openStream()}return t.prototype.send=function(t){return this.sendRaw(JSON.stringify([t]))},t.prototype.ping=function(){this.hooks.sendHeartbeat(this)},t.prototype.close=function(t,e){this.onClose(t,e,!0)},t.prototype.sendRaw=function(t){if(this.readyState!==Re.OPEN)return!1;try{return qe.createSocketRequest("POST",Ie((e=this.location,n=this.session,e.base+"/"+n+"/xhr_send"))).start(t),!0}catch(t){return!1}var e,n},t.prototype.reconnect=function(){this.closeStream(),this.openStream()},t.prototype.onClose=function(t,e,n){this.closeStream(),this.readyState=Re.CLOSED,this.onclose&&this.onclose({code:t,reason:e,wasClean:n})},t.prototype.onChunk=function(t){var e;if(200===t.status)switch(this.readyState===Re.OPEN&&this.onActivity(),t.data.slice(0,1)){case"o":e=JSON.parse(t.data.slice(1)||"{}"),this.onOpen(e);break;case"a":e=JSON.parse(t.data.slice(1)||"[]");for(var 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()}},qe={nextAuthCallbackID:1,auth_callbacks:{},ScriptReceivers:o,DependenciesReceivers:E,getDefaultStrategy:function(t,e,n){var r={};function i(e,i,o,s,a){var c=n(t,e,i,o,s,a);return r[e]=c,c}var o,s=Object.assign({},e,{hostNonTLS:t.wsHost+":"+t.wsPort,hostTLS:t.wsHost+":"+t.wssPort,httpPath:t.wsPath}),a=Object.assign({},s,{useTLS:!0}),c=Object.assign({},e,{hostNonTLS:t.httpHost+":"+t.httpPort,hostTLS:t.httpHost+":"+t.httpsPort,httpPath:t.httpPath}),u={loop:!0,timeout:15e3,timeoutLimit:6e4},l=new ve({lives:2,minPingDelay:1e4,maxPingDelay:t.activityTimeout}),h=new ve({lives:2,minPingDelay:1e4,maxPingDelay:t.activityTimeout}),p=i("ws","ws",3,s,l),d=i("wss","ws",3,a,l),f=i("sockjs","sockjs",1,c),m=i("xhr_streaming","xhr_streaming",1,c,h),y=i("xdr_streaming","xdr_streaming",1,c,h),v=i("xhr_polling","xhr_polling",1,c),b=i("xdr_polling","xdr_polling",1,c),g=new be([p],u),w=new be([d],u),_=new be([f],u),k=new be([new Pe(Ee(m),m,y)],u),S=new be([new Pe(Ee(v),v,b)],u),C=new be([new Pe(Ee(k),new ge([k,new Te(S,{delay:4e3})]),S)],u),T=new Pe(Ee(C),C,_);return o=e.useTLS?new ge([g,new Te(T,{delay:2e3})]):new ge([g,new Te(w,{delay:2e3}),new Te(T,{delay:5e3})]),new ke(new Oe(new Pe(Ee(p),o,T)),r,{ttl:18e5,timeline:e.timeline,useTLS:e.useTLS})},Transports:Xt,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"),x.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:{createStreamingSocket:function(t){return this.createSocket(He,t)},createPollingSocket:function(t){return this.createSocket(Be,t)},createSocket:function(t,e){return new Me(t,e)},createXHR:function(t,e){return this.createRequest(ze,t,e)},createRequest:function(t,e,n){return new Ae(t,e,n)},createXDR:function(t,e){return this.createRequest(je,t,e)}},TimelineTransport:kt,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():x.load("json2",{},n)},getDocument:function(){return document},getProtocol:function(){return this.getDocument().location.protocol},getAuthorizers:function(){return{ajax:F,jsonp:gt}},onDocumentBody:function(t){var e=this;document.body?t():setTimeout(function(){e.onDocumentBody(t)},0)},createJSONPRequest:function(t,e){return new _t(t,e)},createScriptRequest:function(t){return new wt(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 Gt},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)},randomInt:function(t){return Math.floor((window.crypto||window.msCrypto).getRandomValues(new Uint32Array(1))[0]/Math.pow(2,32)*t)}};!function(t){t[t.ERROR=3]="ERROR",t[t.INFO=6]="INFO",t[t.DEBUG=7]="DEBUG"}(Ue||(Ue={}));var Fe=Ue,We=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(ot({},e,{timestamp:it.now()})),this.options.limit&&this.events.length>this.options.limit&&this.events.shift())},t.prototype.error=function(t){this.log(Fe.ERROR,t)},t.prototype.info=function(t){this.log(Fe.INFO,t)},t.prototype.debug=function(t){this.log(Fe.DEBUG,t)},t.prototype.isEmpty=function(){return 0===this.events.length},t.prototype.send=function(t,e){var n=this,r=ot({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}(),Xe=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 Je(new z,e);if(this.priority{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var r={};(()=>{"use strict";n.r(r),n.d(r,{extend:()=>Lt});const t=flarum.reg.get("core","forum/app");var e=n.n(t);const i=flarum.reg.get("core","common/extend");var o=n(474),s=n.n(o);const a=flarum.reg.get("core","common/Application");var c=n.n(a);function u(t){return u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},u(t)}function l(t,e,n){return(e=function(t){var e=function(t){if("object"!=u(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var n=e.call(t,"string");if("object"!=u(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==u(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}const h=new class{constructor(){l(this,"userChannelCallbacks",[]),l(this,"publicChannelCallbacks",[]),l(this,"discussionStreamEventNames",new Set),l(this,"userChannel",null),l(this,"publicChannel",null)}registerDiscussionStreamEvents(t){for(const e of t)this.discussionStreamEventNames.add(e)}onUserChannelReady(t){this.userChannel?t(this.userChannel):this.userChannelCallbacks.push(t)}onPublicChannelReady(t){this.publicChannel?t(this.publicChannel):this.publicChannelCallbacks.push(t)}getDiscussionStreamEventNames(){return Array.from(this.discussionStreamEventNames)}notifyUserChannelReady(t){this.userChannel=t;for(const e of this.userChannelCallbacks)e(t);this.userChannelCallbacks=[]}notifyPublicChannelReady(t){this.publicChannel=t;for(const e of this.publicChannelCallbacks)e(t);this.publicChannelCallbacks=[]}},p=flarum.reg.get("core","common/Component");var d=n.n(p);const f=flarum.reg.get("core","forum/components/NotificationType");var y=n.n(f);const v=flarum.reg.get("core","common/models/Discussion");var b=n.n(v);const g=flarum.reg.get("core","common/components/Link");var w=n.n(g);class _ extends(d()){view(){const t=this.attrs.state.all();return t.length?m("div",{className:"NotificationToasts","aria-live":"polite","aria-label":e().translator.trans("core.forum.notifications.title")},t.map(t=>{const n=function(t){const e=t.subject();return e?e instanceof b()?e:"function"==typeof e.discussion&&null!=(n=e.discussion())?n:null:null;var n}(t.notification);return m("div",{key:t.id,className:"NotificationToast",onclick:()=>this.attrs.state.dismiss(t.id)},n&&m("div",{className:"NotificationToast-context"},m(w(),{href:e().route.discussion(n)},n.title())),m(y(),{notification:t.notification}))})):null}}flarum.reg.add("flarum-realtime","forum/components/NotificationToast",_);let k=0;class S{constructor(){l(this,"toasts",[])}all(){return this.toasts}push(t){var n,r,i;const o=null!=(i=(null!=(n=null==(r=e().data)?void 0:r.settings)?n:{})["flarum-realtime.notification-toast-dismiss-after"])?i:10;if(0===o)return;const s=k++;this.toasts.push({id:s,notification:t}),m.redraw(),setTimeout(()=>this.dismiss(s),1e3*o)}dismiss(t){const e=this.toasts.findIndex(e=>e.id===t);-1!==e&&(this.toasts.splice(e,1),m.redraw())}}flarum.reg.add("flarum-realtime","forum/states/NotificationToastState",S);const C=flarum.reg.get("core","forum/components/DiscussionPage");var T=n.n(C);const P="Flarum\\Post\\Event\\Posted",O="discussionRenamed",E="revisedEvent",x=flarum.reg.get("core","common/utils/Stream");var j=n.n(x);const L=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)},A="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g;var R="object"==typeof self&&self&&self.Object===Object&&self;const N=A||R||Function("return this")(),I=function(){return N.Date.now()};var D=/\s/;var U=/^\s+/;const M=function(t){return t?t.slice(0,function(t){for(var e=t.length;e--&&D.test(t.charAt(e)););return e}(t)+1).replace(U,""):t},H=N.Symbol;var B=Object.prototype,z=B.hasOwnProperty,q=B.toString,F=H?H.toStringTag:void 0;var W=Object.prototype.toString;var X=H?H.toStringTag:void 0;const J=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":X&&X in Object(t)?function(t){var e=z.call(t,F),n=t[F];try{t[F]=void 0;var r=!0}catch(t){}var i=q.call(t);return r&&(e?t[F]=n:delete t[F]),i}(t):function(t){return W.call(t)}(t)};var G=/^[-+]0x[0-9a-f]+$/i,V=/^0b[01]+$/i,Q=/^0o[0-7]+$/i,Y=parseInt;const K=function(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return null!=t&&"object"==typeof t}(t)&&"[object Symbol]"==J(t)}(t))return NaN;if(L(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=L(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=M(t);var n=V.test(t);return n||Q.test(t)?Y(t.slice(2),n?2:8):G.test(t)?NaN:+t};var Z=Math.max,tt=Math.min;const et=function(t,e,n){var r=!0,i=!0;if("function"!=typeof t)throw new TypeError("Expected a function");return L(n)&&(r="leading"in n?!!n.leading:r,i="trailing"in n?!!n.trailing:i),function(t,e,n){var r,i,o,s,a,c,u=0,l=!1,h=!1,p=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function d(e){var n=r,o=i;return r=i=void 0,u=e,s=t.apply(o,n)}function f(t){var n=t-c;return void 0===c||n>=e||n<0||h&&t-u>=o}function m(){var t=I();if(f(t))return y(t);a=setTimeout(m,function(t){var n=e-(t-c);return h?tt(n,o-(t-u)):n}(t))}function y(t){return a=void 0,p&&r?d(t):(r=i=void 0,s)}function v(){var t=I(),n=f(t);if(r=arguments,i=this,c=t,n){if(void 0===a)return function(t){return u=t,a=setTimeout(m,e),l?d(t):s}(c);if(h)return clearTimeout(a),a=setTimeout(m,e),d(c)}return void 0===a&&(a=setTimeout(m,e)),s}return e=K(e)||0,L(n)&&(l=!!n.leading,o=(h="maxWait"in n)?Z(K(n.maxWait)||0,e):o,p="trailing"in n?!!n.trailing:p),v.cancel=function(){void 0!==a&&clearTimeout(a),u=0,r=c=i=a=void 0},v.flush=function(){return void 0===a?s:y(I())},v}(t,e,{leading:r,maxWait:e,trailing:i})},nt=flarum.reg.get("core","common/components/Icon");var rt=n.n(nt);const it=flarum.reg.get("core","common/utils/classList");var ot=n.n(it);function st(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),n.push.apply(n,r)}return n}function at(t){for(var e=1;e{var n;if(e().store.pushPayload(t).id()===(null==(n=this.discussion)?void 0:n.id())&&this.stream){const t=this.discussion.commentCount();e().store.find("discussions",this.discussion.id()).then(()=>{this.stream.update().then(()=>m.redraw()),document.hasFocus()||(e().setTitleCount(Math.max(0,this.discussion.commentCount()-t)),$(window).one("focus",()=>{e().setTitleCount(0)}))})}},this.websocketEventStreamUpdate=t=>{var n;e().store.pushPayload(t).id()===(null==(n=this.discussion)?void 0:n.id())&&this.stream&&e().store.find("discussions",this.discussion.id()).then(()=>{this.stream.update().then(()=>m.redraw())})}}),(0,i.extend)(T().prototype,"oncreate",function(){var t,n,r,i,o,s;null==(t=e().websocket_channels.public)||t.bind(P,this.websocketEventPosted.bind(this)),null==(n=e().websocket_channels.user)||n.bind(P,this.websocketEventPosted.bind(this)),null==(r=e().websocket_channels.public)||r.bind(O,this.websocketEventStreamUpdate.bind(this)),null==(i=e().websocket_channels.user)||i.bind(O,this.websocketEventStreamUpdate.bind(this)),null==(o=e().websocket_channels.public)||o.bind(E,this.websocketEventPosted.bind(this)),null==(s=e().websocket_channels.user)||s.bind(E,this.websocketEventPosted.bind(this));for(const t of h.getDiscussionStreamEventNames()){var a,c;null==(a=e().websocket_channels.public)||a.bind(t,this.websocketEventStreamUpdate.bind(this)),null==(c=e().websocket_channels.user)||c.bind(t,this.websocketEventStreamUpdate.bind(this))}}),(0,i.extend)(T().prototype,"onremove",function(){var t,n,r,i,o,s;null==(t=e().websocket_channels.public)||t.unbind(P),null==(n=e().websocket_channels.user)||n.unbind(P),null==(r=e().websocket_channels.public)||r.unbind(O),null==(i=e().websocket_channels.user)||i.unbind(O),null==(o=e().websocket_channels.public)||o.unbind(E),null==(s=e().websocket_channels.user)||s.unbind(E);for(const t of h.getDiscussionStreamEventNames()){var a,c;null==(a=e().websocket_channels.public)||a.unbind(t),null==(c=e().websocket_channels.user)||c.unbind(t)}}),e().data["flarum-realtime.typing-indicator"]&&((0,i.extend)("flarum/forum/components/PostStream","endItems",function(t){if(this.discussion.attribute("canViewWhoTypes")){var n;const o=Object.keys(this.getTypingUsers()),s=o.length,a=3,c=ot()(["TypingUsersContainer",s>0&&"TypingUsersContainer-active"]),u=s>0?"fas fa-ellipsis-h fa-beat":"fas fa-pause",l=o.slice(0,a).join(", ");let h=!0;var r,i;null!=(n=e().session)&&n.user&&(h=null==(r=null==(i=e().session.user.preferences())?void 0:i["flarum-realtime.typing-indicator-full"])||r),t.add("usersTyping",m("div",{className:c,key:"typing"},m("div",{className:"TypingUsers"},m(rt(),{name:u}),s>0?h?e().translator.trans("flarum-realtime.forum.typing-indicator.users-are-typing",{users:l,count:s,others:Math.max(s-a,0)}):e().translator.trans("flarum-realtime.forum.typing-indicator.people-are-typing",{number:s}):e().translator.trans("flarum-realtime.forum.typing-indicator.no-activity"))),70)}}),(0,i.extend)("flarum/forum/components/PostStream","oninit",function(){this.previousContent=j()(""),this.usersTyping=j()({}),this.typingTruncationListener=null,this.typingListener=null,this.getTypingUsers=()=>{const t=Date.now()-6e3,e=at({},this.usersTyping());let n=null;for(const r of Object.keys(e))e[r]m.redraw(),n-Date.now())),e},this.userTyping=t=>{const n=at({},this.usersTyping());t.discloseOnline||(t.displayName=String(e().translator.trans("flarum-realtime.forum.typing-indicator.anonymous-user"))),n[t.displayName]=t.time,this.usersTyping(n),m.redraw()},this.actorIsTyping=()=>{var t,n,r;const i=null==(t=e().session.user)||null==(t=t.preferences())?void 0:t.discloseOnline;null==(n=e().websocket_channels.discussion)||n.trigger("client-typing",{displayName:i?null==(r=e().session.user)?void 0:r.displayName():"[anonymous]",discloseOnline:i,time:Date.now()})},this.checkTyping=()=>{var t,n;if(!e().composer.composingReplyTo(this.discussion))return;const r=null==(t=e().composer.fields)||null==(n=t.content)?void 0:n.call(t);this.previousContent()!==r&&(this.actorIsTyping(),this.previousContent(r))}}),(0,i.extend)("flarum/forum/components/PostStream","view",function(){if(!e().forum.attribute("websocket.disallow_connection")){if(this.discussion&&e().composer.editor&&!this.typingListener){const t=et(()=>this.checkTyping(),2e3);this.typingListener=setInterval(t,1e3)}this.discussion&&(e().websocket_channels.discussion=e().websocket.subscribe("private-typing="+m.route.param("id").match(/[0-9]+/)),this.discussion.attribute("canViewWhoTypes")&&e().websocket_channels.discussion.bind("client-typing",t=>{this.userTyping(t)}))}}),(0,i.extend)("flarum/forum/components/PostStream","onremove",function(){this.typingListener&&clearInterval(this.typingListener),this.typingTruncationListener&&clearTimeout(this.typingTruncationListener)}))}flarum.reg.add("flarum-realtime","forum/extend/Discussion",ct);const ut=flarum.reg.get("core","common/models/Post");var lt=n.n(ut);const ht=flarum.reg.get("core","forum/components/IndexPage");var pt=n.n(ht);const dt=flarum.reg.get("core","common/components/Button");var ft=n.n(dt);class mt{constructor(){l(this,"discussions",{}),l(this,"releaseInterval",e().forum.attribute("flarum-realtime.release-discussion-updates-interval")),l(this,"timer",void 0),l(this,"onTimerCallback",null),l(this,"seconds",this.releaseInterval)}length(){return Object.keys(this.discussions).length}push(t){this.discussions[t.id()]=t}remove(t){delete this.discussions[t.id()]}has(t){return!!this.discussions[t.id()]}isEmpty(){return 0===this.length()}reset(){this.discussions={}}getReleaseInterval(){return this.releaseInterval}release(t){Object.keys(this.discussions).forEach(e=>{t.addDiscussion(this.discussions[e])}),this.reset(),e().setTitleCount(0)}startTimer(){this.autoRelease()&&(clearInterval(this.timer),this.seconds=this.getReleaseInterval(),this.timer=window.setInterval(()=>{if(this.seconds<0&&this.timer)return clearInterval(this.timer);this.seconds--,this.onTimerCallback&&this.onTimerCallback(this.seconds)},1e3))}onTimer(t){this.onTimerCallback=t}autoRelease(){return this.releaseInterval>0}}flarum.reg.add("flarum-realtime","forum/extend/DiscussionList/WebsocketUpdates",mt);const yt=flarum.reg.get("core","common/utils/extractText");var vt=n.n(yt);function bt(){e().data["flarum-realtime.release-discussion-updates"]&&((0,i.extend)(pt().prototype,"oninit",function(){this._realtimeWebsocketUpdates=new mt,this._realtimeReleaseTimeout=this._realtimeWebsocketUpdates.getReleaseInterval(),this._realtimeWebsocketEventPosted=t=>{var n;const r=e().discussions.getParams(),i=r.tags?e().store.getBy("tags","slug",r.tags):null,o=0===Object.keys(null!=(n=r.filter)?n:{}).length;if(!r.q&&!r.sort&&(i||o)){var s,a,c,u,l,h,p,d,f,y,v,g,w,_,k,S,C,T,P,O;const n=e().store.pushPayload(t);let o=n instanceof b()?n:null;if(!o&&n instanceof lt()&&(o=n.discussion()),!o)return;if(!("byobuPrivate"!==e().current.data.routeName||null!=(s=(a=o).recipientUsers)&&s.call(a)&&null!=(c=(u=o).recipientGroups)&&c.call(u)))return;if("byobuPrivate"===e().current.data.routeName&&0===(null==(l=(h=o).recipientUsers)||null==(l=l.call(h))?void 0:l.length)&&0===(null==(p=(d=o).recipientGroups)||null==(p=p.call(d))?void 0:p.length))return;if("byobuUserPrivate"===e().current.data.routeName)return;if("user.discussions"===e().current.data.routeName)return;if(i&&null!=(f=(y=o).tags)&&f.call(y)&&!o.tags().map(t=>t.id()).includes(i.id()))return;if(null!=(v=(g=o).tags)&&v.call(g)&&o.tags().find(t=>{var e,n;return!(i&&i.id()===t.id()||(i||null==(e=t.isHidden)||!e.call(t))&&"hide"!==(null==(n=t.subscription)?void 0:n.call(t)))}))return;if("ignore"===(null==(w=(_=o).subscription)?void 0:w.call(_)))return;const L=null==(k=(S=o).tags)||null==(k=k.call(S))?void 0:k.find(t=>{var e,n;return"lurk"===(null==(e=t.subscription)?void 0:e.call(t))||"follow"===(null==(n=t.subscription)?void 0:n.call(t))});var E,x,j;if("following"===e().current.get("routeName")&&(null!=(E=r.filter)&&E["following-tag"]&&!L||"follow"!==(null==(x=(j=o).subscription)?void 0:x.call(j))))return;const A=this._realtimeWebsocketUpdates;if(A.has(o))return;if((null==(C=e().discussions.getPages()[0])||null==(C=C.items[0])?void 0:C.id())===o.id())return;const R=!e().current.get("discussion"),N=o.id()===(null==(T=e().current.get("discussion"))?void 0:T.id())||L||"follow"===(null==(P=(O=o).subscription)?void 0:P.call(O));(R||N)&&(A.push(o),e().setTitleCount(A.length()),m.redraw())}}}),(0,i.extend)(pt().prototype,"oncreate",function(){var t,n,r,i;null==(t=e().websocket_channels.public)||t.bind("Flarum\\Discussion\\Event\\Started",this._realtimeWebsocketEventPosted.bind(this)),null==(n=e().websocket_channels.public)||n.bind("Flarum\\Post\\Event\\Posted",this._realtimeWebsocketEventPosted.bind(this)),null==(r=e().websocket_channels.user)||r.bind("Flarum\\Discussion\\Event\\Started",this._realtimeWebsocketEventPosted.bind(this)),null==(i=e().websocket_channels.user)||i.bind("Flarum\\Post\\Event\\Posted",this._realtimeWebsocketEventPosted.bind(this))}),(0,i.extend)(pt().prototype,"onremove",function(){var t,n,r,i;null==(t=e().websocket_channels.public)||t.unbind("Flarum\\Discussion\\Event\\Started"),null==(n=e().websocket_channels.public)||n.unbind("Flarum\\Post\\Event\\Posted"),null==(r=e().websocket_channels.user)||r.unbind("Flarum\\Discussion\\Event\\Started"),null==(i=e().websocket_channels.user)||i.unbind("Flarum\\Post\\Event\\Posted")}),(0,i.extend)(pt().prototype,"contentItems",function(t){const n=this._realtimeWebsocketUpdates;if(!n||n.isEmpty())return;const r=()=>{n.release(e().discussions),e().setTitleCount(0),m.redraw()},i=t=>n.autoRelease()?e().translator.trans("flarum-realtime.forum.push.discussion-list-new-activity-with-auto-release",{count:n.length(),releaseTimeout:t}):e().translator.trans("flarum-realtime.forum.push.discussion-list-new-activity",{count:n.length()});n.startTimer(),n.onTimer(t=>{if(0===t)return r();this.$(".DiscussionList-update > .Button-label").text(vt()(i(t)))}),t.add("realtimeNewActivity",ft().component({className:"Button DiscussionList-update","aria-live":"polite","aria-atomic":"true",onclick:r},i(this._realtimeReleaseTimeout)),95)}),(0,i.extend)(pt().prototype,"actionItems",t=>{t.remove("refresh")}))}flarum.reg.add("flarum-realtime","forum/extend/DiscussionList",bt);const gt=flarum.reg.get("core","common/components/FieldSet");var wt=n.n(gt);const _t=flarum.reg.get("core","common/utils/ItemList");var kt=n.n(_t);const St=flarum.reg.get("core","common/components/Switch");var Ct=n.n(St);function Tt(t){var n;const r=new(kt());let i=!1;return r.add("typing-indicator",[m(Ct(),{state:null==(n=t.preferences())?void 0:n["flarum-realtime.typing-indicator-full"],onchange:e=>{i=!0,t.savePreferences({"flarum-realtime.typing-indicator-full":e}).then(()=>{i=!1,m.redraw()})},loading:i},e().translator.trans("flarum-realtime.forum.user.settings.typing-indicator-type.label")),m("p",{className:"helpText"},e().translator.trans("flarum-realtime.forum.user.settings.typing-indicator-type.help"))],80),r}function Pt(){e().data["flarum-realtime.typing-indicator"]&&(0,i.extend)("flarum/forum/components/SettingsPage","settingsItems",function(t){const n=this.user;n&&n.canViewWhoTypes()&&t.add("realtimeItems",m(wt(),{className:"Settings-realtime",label:e().translator.trans("flarum-realtime.forum.user.settings.heading")},Tt(n).toArray()),55)})}flarum.reg.add("flarum-realtime","forum/extend/User/RealtimeUserPreferences",Tt),flarum.reg.add("flarum-realtime","forum/extend/User/extendUserPreferences",Pt);const Ot=flarum.reg.get("core","common/extenders");var Et=n.n(Ot);const xt=flarum.reg.get("core","common/models/User");var jt=n.n(xt);const Lt=[new(Et().Model)(jt()).attribute("canViewWhoTypes")];flarum.reg.add("flarum-realtime","forum/extenders/Realtime",class{constructor(){l(this,"discussionStreamEvents",[]),l(this,"channelBindings",[])}onDiscussionStreamEvent(t){return this.discussionStreamEvents.push({eventName:t}),this}onUserChannelEvent(t,e){return this.channelBindings.push({channel:"user",eventName:t,callback:e}),this}onPublicChannelEvent(t,e){return this.channelBindings.push({channel:"public",eventName:t,callback:e}),this}onBothChannelsEvent(t,e){return this.channelBindings.push({channel:"both",eventName:t,callback:e}),this}extend(t,e){if(this.discussionStreamEvents.length||this.channelBindings.length){h.registerDiscussionStreamEvents(this.discussionStreamEvents.map(t=>t.eventName));for(const t of this.channelBindings)"user"!==t.channel&&"both"!==t.channel||h.onUserChannelReady(e=>{e.bind(t.eventName,t.callback)}),"public"!==t.channel&&"both"!==t.channel||h.onPublicChannelReady(e=>{e.bind(t.eventName,t.callback)})}}}),flarum.reg.add("flarum-realtime","forum/RealtimeState",h),e().initializers.add("flarum-realtime",()=>{(0,i.extend)(c().prototype,"mount",function(){s().logToConsole=this.forum.attribute("debug");const t=this.forum.attribute("websocket.host"),n=this.forum.attribute("websocket.secure");e().websocket=new(s())(this.forum.attribute("websocket.key"),{channelAuthorization:{endpoint:this.forum.attribute("apiUrl")+"/websocket/auth",transport:"ajax"},wsHost:t,wsPort:this.forum.attribute("websocket.port"),wssPort:this.forum.attribute("websocket.port"),enabledTransports:["wss","ws"],forceTLS:n}),e().websocket_channels={public:null,user:null};const r=new S,i=document.createElement("div");if(document.body.appendChild(i),m.mount(i,{view:()=>m(_,{state:r})}),e().session.user){const t=e().websocket.subscribe("private-user="+e().session.user.id());e().websocket_channels.user=t,h.notifyUserChannelReady(t),t.bind("notification",t=>{const n=e().store.pushPayload(t);if(n){var i,o;const t=e().session.user;null==t||t.pushAttributes({unreadNotificationCount:(null!=(i=t.unreadNotificationCount())?i:0)+1,newNotificationCount:(null!=(o=t.newNotificationCount())?o:0)+1}),r.push(n)}})}else if(!this.forum.attribute("websocket.disallow_connection")){const t=e().websocket.subscribe("public");e().websocket_channels.public=t,h.notifyPublicChannelReady(t)}let o=null;const a=()=>{if(!e().websocket)return;const t=e().websocket.connection,n=()=>{var r,i;null==t||t.unbind("connected",n),null==(r=e().discussions)||null==(i=r.refresh)||i.call(r)};null==t||t.bind("connected",n),e().websocket.disconnect(),setTimeout(()=>{var t;return null==(t=e().websocket)?void 0:t.connect()},100)};document.addEventListener("visibilitychange",()=>{if("hidden"===document.visibilityState)return void(o=Date.now());if(null===o)return;const t=Date.now()-o;o=null,t>5e3&&a()}),window.addEventListener("pageshow",t=>{t.persisted&&a()})}),ct(),bt(),Pt()})})(),module.exports=r})(); //# sourceMappingURL=forum.js.map \ No newline at end of file diff --git a/extensions/realtime/js/dist/forum.js.map b/extensions/realtime/js/dist/forum.js.map index 1bc86a61b4..717a1783ac 100644 --- a/extensions/realtime/js/dist/forum.js.map +++ b/extensions/realtime/js/dist/forum.js.map @@ -1 +1 @@ -{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@flarum/realtime/Pusher/webpack/universalModuleDefinition","webpack://@flarum/realtime/Pusher/webpack/bootstrap","webpack://@flarum/realtime/Pusher/node_modules/@stablelib/base64/base64.ts","webpack://@flarum/realtime/Pusher/node_modules/@stablelib/utf8/utf8.ts","webpack://@flarum/realtime/Pusher/src/core/pusher.js","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/script_receiver_factory.ts","webpack://@flarum/realtime/Pusher/src/core/auth/options.ts","webpack://@flarum/realtime/Pusher/src/core/defaults.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/dependency_loader.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/dependencies.ts","webpack://@flarum/realtime/Pusher/src/core/utils/url_store.ts","webpack://@flarum/realtime/Pusher/src/core/base64.ts","webpack://@flarum/realtime/Pusher/src/core/errors.ts","webpack://@flarum/realtime/Pusher/src/runtimes/isomorphic/auth/xhr_auth.ts","webpack://@flarum/realtime/Pusher/src/core/utils/timers/abstract_timer.ts","webpack://@flarum/realtime/Pusher/src/core/utils/timers/index.ts","webpack://@flarum/realtime/Pusher/src/core/util.ts","webpack://@flarum/realtime/Pusher/src/core/utils/collections.ts","webpack://@flarum/realtime/Pusher/src/core/logger.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/auth/jsonp_auth.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/script_request.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/jsonp_request.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/timeline/jsonp_timeline.ts","webpack://@flarum/realtime/Pusher/src/core/transports/url_schemes.ts","webpack://@flarum/realtime/Pusher/src/core/events/callback_registry.ts","webpack://@flarum/realtime/Pusher/src/core/events/dispatcher.ts","webpack://@flarum/realtime/Pusher/src/core/transports/transport_connection.ts","webpack://@flarum/realtime/Pusher/src/core/transports/transport.ts","webpack://@flarum/realtime/Pusher/src/runtimes/isomorphic/transports/transports.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/transports/transports.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/net_info.ts","webpack://@flarum/realtime/Pusher/src/core/transports/assistant_to_the_transport_manager.ts","webpack://@flarum/realtime/Pusher/src/core/connection/protocol/protocol.ts","webpack://@flarum/realtime/Pusher/src/core/connection/connection.ts","webpack://@flarum/realtime/Pusher/src/core/connection/handshake/index.ts","webpack://@flarum/realtime/Pusher/src/core/timeline/timeline_sender.ts","webpack://@flarum/realtime/Pusher/src/core/channels/channel.ts","webpack://@flarum/realtime/Pusher/src/core/channels/private_channel.ts","webpack://@flarum/realtime/Pusher/src/core/channels/members.ts","webpack://@flarum/realtime/Pusher/src/core/channels/presence_channel.ts","webpack://@flarum/realtime/Pusher/src/core/channels/encrypted_channel.ts","webpack://@flarum/realtime/Pusher/src/core/connection/connection_manager.ts","webpack://@flarum/realtime/Pusher/src/core/channels/channels.ts","webpack://@flarum/realtime/Pusher/src/core/utils/factory.ts","webpack://@flarum/realtime/Pusher/src/core/transports/transport_manager.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/sequential_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/best_connected_ever_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/cached_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/delayed_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/if_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/first_connected_strategy.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/default_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/http/state.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/http/http_xdomain_request.ts","webpack://@flarum/realtime/Pusher/src/core/http/http_request.ts","webpack://@flarum/realtime/Pusher/src/core/http/http_socket.ts","webpack://@flarum/realtime/Pusher/src/core/timeline/level.ts","webpack://@flarum/realtime/Pusher/src/core/http/http_streaming_socket.ts","webpack://@flarum/realtime/Pusher/src/core/http/http_polling_socket.ts","webpack://@flarum/realtime/Pusher/src/runtimes/isomorphic/http/http_xhr_request.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/runtime.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/transports/transport_connection_initializer.ts","webpack://@flarum/realtime/Pusher/src/runtimes/isomorphic/http/http.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/http/http.ts","webpack://@flarum/realtime/Pusher/src/core/timeline/timeline.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/transport_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/strategy_builder.ts","webpack://@flarum/realtime/Pusher/src/core/config.ts","webpack://@flarum/realtime/Pusher/src/core/auth/user_authenticator.ts","webpack://@flarum/realtime/Pusher/src/core/auth/deprecated_channel_authorizer.ts","webpack://@flarum/realtime/Pusher/src/core/auth/channel_authorizer.ts","webpack://@flarum/realtime/Pusher/src/core/watchlist.ts","webpack://@flarum/realtime/Pusher/src/core/user.ts","webpack://@flarum/realtime/Pusher/src/core/utils/flat_promise.ts","webpack://@flarum/realtime/Pusher/src/core/pusher.ts","webpack://@flarum/realtime/webpack/bootstrap","webpack://@flarum/realtime/webpack/runtime/compat get default export","webpack://@flarum/realtime/webpack/runtime/define property getters","webpack://@flarum/realtime/webpack/runtime/global","webpack://@flarum/realtime/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/realtime/webpack/runtime/make namespace object","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'forum/app')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/extend')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/Application')\"","webpack://@flarum/realtime/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://@flarum/realtime/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@flarum/realtime/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://@flarum/realtime/../../../js-packages/webpack-config/node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://@flarum/realtime/./src/forum/RealtimeState.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/Component')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'forum/components/NotificationType')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/models/Discussion')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/Link')\"","webpack://@flarum/realtime/./src/forum/components/NotificationToast.tsx","webpack://@flarum/realtime/./src/forum/states/NotificationToastState.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'forum/components/DiscussionPage')\"","webpack://@flarum/realtime/./src/forum/extend/Discussion/NewActivity.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/utils/Stream')\"","webpack://@flarum/realtime/../../../node_modules/lodash-es/isObject.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_freeGlobal.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_root.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/now.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_trimmedEndIndex.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_baseTrim.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_Symbol.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_getRawTag.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_objectToString.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_baseGetTag.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/toNumber.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/isSymbol.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/isObjectLike.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/debounce.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/throttle.js","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/Icon')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/utils/classList')\"","webpack://@flarum/realtime/./src/forum/extend/Discussion/TypingIndicator.tsx","webpack://@flarum/realtime/./src/forum/extend/Discussion.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/models/Post')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'forum/components/IndexPage')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/Button')\"","webpack://@flarum/realtime/./src/forum/extend/DiscussionList/WebsocketUpdates.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/utils/extractText')\"","webpack://@flarum/realtime/./src/forum/extend/DiscussionList.ts","webpack://@flarum/realtime/./src/forum/extend/DiscussionList/NewActivity.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/FieldSet')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/utils/ItemList')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/Switch')\"","webpack://@flarum/realtime/./src/forum/extend/User/RealtimeUserPreferences.tsx","webpack://@flarum/realtime/./src/forum/extend/User/extendUserPreferences.tsx","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/extenders')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/models/User')\"","webpack://@flarum/realtime/./src/forum/extend.ts","webpack://@flarum/realtime/./src/forum/index.ts","webpack://@flarum/realtime/./src/forum/extenders/Realtime.ts","webpack://@flarum/realtime/./src/forum/extend/Application.ts","webpack://@flarum/realtime/./src/forum/extend/User.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Pusher\"] = factory();\n\telse\n\t\troot[\"Pusher\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\n\n/**\n * Package base64 implements Base64 encoding and decoding.\n */\n\n// Invalid character used in decoding to indicate\n// that the character to decode is out of range of\n// alphabet and cannot be decoded.\nconst INVALID_BYTE = 256;\n\n/**\n * Implements standard Base64 encoding.\n *\n * Operates in constant time.\n */\nexport class Coder {\n // TODO(dchest): methods to encode chunk-by-chunk.\n\n constructor(private _paddingCharacter = \"=\") { }\n\n encodedLength(length: number): number {\n if (!this._paddingCharacter) {\n return (length * 8 + 5) / 6 | 0;\n }\n return (length + 2) / 3 * 4 | 0;\n }\n\n encode(data: Uint8Array): string {\n let out = \"\";\n\n let i = 0;\n for (; i < data.length - 2; i += 3) {\n let c = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2]);\n out += this._encodeByte((c >>> 3 * 6) & 63);\n out += this._encodeByte((c >>> 2 * 6) & 63);\n out += this._encodeByte((c >>> 1 * 6) & 63);\n out += this._encodeByte((c >>> 0 * 6) & 63);\n }\n\n const left = data.length - i;\n if (left > 0) {\n let c = (data[i] << 16) | (left === 2 ? data[i + 1] << 8 : 0);\n out += this._encodeByte((c >>> 3 * 6) & 63);\n out += this._encodeByte((c >>> 2 * 6) & 63);\n if (left === 2) {\n out += this._encodeByte((c >>> 1 * 6) & 63);\n } else {\n out += this._paddingCharacter || \"\";\n }\n out += this._paddingCharacter || \"\";\n }\n\n return out;\n }\n\n maxDecodedLength(length: number): number {\n if (!this._paddingCharacter) {\n return (length * 6 + 7) / 8 | 0;\n }\n return length / 4 * 3 | 0;\n }\n\n decodedLength(s: string): number {\n return this.maxDecodedLength(s.length - this._getPaddingLength(s));\n }\n\n decode(s: string): Uint8Array {\n if (s.length === 0) {\n return new Uint8Array(0);\n }\n const paddingLength = this._getPaddingLength(s);\n const length = s.length - paddingLength;\n const out = new Uint8Array(this.maxDecodedLength(length));\n let op = 0;\n let i = 0;\n let haveBad = 0;\n let v0 = 0, v1 = 0, v2 = 0, v3 = 0;\n for (; i < length - 4; i += 4) {\n v0 = this._decodeChar(s.charCodeAt(i + 0));\n v1 = this._decodeChar(s.charCodeAt(i + 1));\n v2 = this._decodeChar(s.charCodeAt(i + 2));\n v3 = this._decodeChar(s.charCodeAt(i + 3));\n out[op++] = (v0 << 2) | (v1 >>> 4);\n out[op++] = (v1 << 4) | (v2 >>> 2);\n out[op++] = (v2 << 6) | v3;\n haveBad |= v0 & INVALID_BYTE;\n haveBad |= v1 & INVALID_BYTE;\n haveBad |= v2 & INVALID_BYTE;\n haveBad |= v3 & INVALID_BYTE;\n }\n if (i < length - 1) {\n v0 = this._decodeChar(s.charCodeAt(i));\n v1 = this._decodeChar(s.charCodeAt(i + 1));\n out[op++] = (v0 << 2) | (v1 >>> 4);\n haveBad |= v0 & INVALID_BYTE;\n haveBad |= v1 & INVALID_BYTE;\n }\n if (i < length - 2) {\n v2 = this._decodeChar(s.charCodeAt(i + 2));\n out[op++] = (v1 << 4) | (v2 >>> 2);\n haveBad |= v2 & INVALID_BYTE;\n }\n if (i < length - 3) {\n v3 = this._decodeChar(s.charCodeAt(i + 3));\n out[op++] = (v2 << 6) | v3;\n haveBad |= v3 & INVALID_BYTE;\n }\n if (haveBad !== 0) {\n throw new Error(\"Base64Coder: incorrect characters for decoding\");\n }\n return out;\n }\n\n // Standard encoding have the following encoded/decoded ranges,\n // which we need to convert between.\n //\n // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 + /\n // Index: 0 - 25 26 - 51 52 - 61 62 63\n // ASCII: 65 - 90 97 - 122 48 - 57 43 47\n //\n\n // Encode 6 bits in b into a new character.\n protected _encodeByte(b: number): string {\n // Encoding uses constant time operations as follows:\n //\n // 1. Define comparison of A with B using (A - B) >>> 8:\n // if A > B, then result is positive integer\n // if A <= B, then result is 0\n //\n // 2. Define selection of C or 0 using bitwise AND: X & C:\n // if X == 0, then result is 0\n // if X != 0, then result is C\n //\n // 3. Start with the smallest comparison (b >= 0), which is always\n // true, so set the result to the starting ASCII value (65).\n //\n // 4. Continue comparing b to higher ASCII values, and selecting\n // zero if comparison isn't true, otherwise selecting a value\n // to add to result, which:\n //\n // a) undoes the previous addition\n // b) provides new value to add\n //\n let result = b;\n // b >= 0\n result += 65;\n // b > 25\n result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n // b > 51\n result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n // b > 61\n result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 43);\n // b > 62\n result += ((62 - b) >>> 8) & ((62 - 43) - 63 + 47);\n\n return String.fromCharCode(result);\n }\n\n // Decode a character code into a byte.\n // Must return 256 if character is out of alphabet range.\n protected _decodeChar(c: number): number {\n // Decoding works similar to encoding: using the same comparison\n // function, but now it works on ranges: result is always incremented\n // by value, but this value becomes zero if the range is not\n // satisfied.\n //\n // Decoding starts with invalid value, 256, which is then\n // subtracted when the range is satisfied. If none of the ranges\n // apply, the function returns 256, which is then checked by\n // the caller to throw error.\n let result = INVALID_BYTE; // start with invalid character\n\n // c == 43 (c > 42 and c < 44)\n result += (((42 - c) & (c - 44)) >>> 8) & (-INVALID_BYTE + c - 43 + 62);\n // c == 47 (c > 46 and c < 48)\n result += (((46 - c) & (c - 48)) >>> 8) & (-INVALID_BYTE + c - 47 + 63);\n // c > 47 and c < 58\n result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n // c > 64 and c < 91\n result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n // c > 96 and c < 123\n result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n\n return result;\n }\n\n private _getPaddingLength(s: string): number {\n let paddingLength = 0;\n if (this._paddingCharacter) {\n for (let i = s.length - 1; i >= 0; i--) {\n if (s[i] !== this._paddingCharacter) {\n break;\n }\n paddingLength++;\n }\n if (s.length < 4 || paddingLength > 2) {\n throw new Error(\"Base64Coder: incorrect padding\");\n }\n }\n return paddingLength;\n }\n\n}\n\nconst stdCoder = new Coder();\n\nexport function encode(data: Uint8Array): string {\n return stdCoder.encode(data);\n}\n\nexport function decode(s: string): Uint8Array {\n return stdCoder.decode(s);\n}\n\n/**\n * Implements URL-safe Base64 encoding.\n * (Same as Base64, but '+' is replaced with '-', and '/' with '_').\n *\n * Operates in constant time.\n */\nexport class URLSafeCoder extends Coder {\n // URL-safe encoding have the following encoded/decoded ranges:\n //\n // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 - _\n // Index: 0 - 25 26 - 51 52 - 61 62 63\n // ASCII: 65 - 90 97 - 122 48 - 57 45 95\n //\n\n protected _encodeByte(b: number): string {\n let result = b;\n // b >= 0\n result += 65;\n // b > 25\n result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n // b > 51\n result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n // b > 61\n result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 45);\n // b > 62\n result += ((62 - b) >>> 8) & ((62 - 45) - 63 + 95);\n\n return String.fromCharCode(result);\n }\n\n protected _decodeChar(c: number): number {\n let result = INVALID_BYTE;\n\n // c == 45 (c > 44 and c < 46)\n result += (((44 - c) & (c - 46)) >>> 8) & (-INVALID_BYTE + c - 45 + 62);\n // c == 95 (c > 94 and c < 96)\n result += (((94 - c) & (c - 96)) >>> 8) & (-INVALID_BYTE + c - 95 + 63);\n // c > 47 and c < 58\n result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n // c > 64 and c < 91\n result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n // c > 96 and c < 123\n result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n\n return result;\n }\n}\n\nconst urlSafeCoder = new URLSafeCoder();\n\nexport function encodeURLSafe(data: Uint8Array): string {\n return urlSafeCoder.encode(data);\n}\n\nexport function decodeURLSafe(s: string): Uint8Array {\n return urlSafeCoder.decode(s);\n}\n\n\nexport const encodedLength = (length: number) =>\n stdCoder.encodedLength(length);\n\nexport const maxDecodedLength = (length: number) =>\n stdCoder.maxDecodedLength(length);\n\nexport const decodedLength = (s: string) =>\n stdCoder.decodedLength(s);\n","// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\n\n/**\n * Package utf8 implements UTF-8 encoding and decoding.\n */\n\nconst INVALID_UTF16 = \"utf8: invalid string\";\nconst INVALID_UTF8 = \"utf8: invalid source encoding\";\n\n/**\n * Encodes the given string into UTF-8 byte array.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nexport function encode(s: string): Uint8Array {\n // Calculate result length and allocate output array.\n // encodedLength() also validates string and throws errors,\n // so we don't need repeat validation here.\n const arr = new Uint8Array(encodedLength(s));\n\n let pos = 0;\n for (let i = 0; i < s.length; i++) {\n let c = s.charCodeAt(i);\n if (c < 0x80) {\n arr[pos++] = c;\n } else if (c < 0x800) {\n arr[pos++] = 0xc0 | c >> 6;\n arr[pos++] = 0x80 | c & 0x3f;\n } else if (c < 0xd800) {\n arr[pos++] = 0xe0 | c >> 12;\n arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n arr[pos++] = 0x80 | c & 0x3f;\n } else {\n i++; // get one more character\n c = (c & 0x3ff) << 10;\n c |= s.charCodeAt(i) & 0x3ff;\n c += 0x10000;\n\n arr[pos++] = 0xf0 | c >> 18;\n arr[pos++] = 0x80 | (c >> 12) & 0x3f;\n arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n arr[pos++] = 0x80 | c & 0x3f;\n }\n }\n return arr;\n}\n\n/**\n * Returns the number of bytes required to encode the given string into UTF-8.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nexport function encodedLength(s: string): number {\n let result = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n if (c < 0x80) {\n result += 1;\n } else if (c < 0x800) {\n result += 2;\n } else if (c < 0xd800) {\n result += 3;\n } else if (c <= 0xdfff) {\n if (i >= s.length - 1) {\n throw new Error(INVALID_UTF16);\n }\n i++; // \"eat\" next character\n result += 4;\n } else {\n throw new Error(INVALID_UTF16);\n }\n }\n return result;\n}\n\n/**\n * Decodes the given byte array from UTF-8 into a string.\n * Throws if encoding is invalid.\n */\nexport function decode(arr: Uint8Array): string {\n const chars: string[] = [];\n for (let i = 0; i < arr.length; i++) {\n let b = arr[i];\n\n if (b & 0x80) {\n let min;\n if (b < 0xe0) {\n // Need 1 more byte.\n if (i >= arr.length) {\n throw new Error(INVALID_UTF8);\n }\n const n1 = arr[++i];\n if ((n1 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x1f) << 6 | (n1 & 0x3f);\n min = 0x80;\n } else if (b < 0xf0) {\n // Need 2 more bytes.\n if (i >= arr.length - 1) {\n throw new Error(INVALID_UTF8);\n }\n const n1 = arr[++i];\n const n2 = arr[++i];\n if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x0f) << 12 | (n1 & 0x3f) << 6 | (n2 & 0x3f);\n min = 0x800;\n } else if (b < 0xf8) {\n // Need 3 more bytes.\n if (i >= arr.length - 2) {\n throw new Error(INVALID_UTF8);\n }\n const n1 = arr[++i];\n const n2 = arr[++i];\n const n3 = arr[++i];\n if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80 || (n3 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x0f) << 18 | (n1 & 0x3f) << 12 | (n2 & 0x3f) << 6 | (n3 & 0x3f);\n min = 0x10000;\n } else {\n throw new Error(INVALID_UTF8);\n }\n\n if (b < min || (b >= 0xd800 && b <= 0xdfff)) {\n throw new Error(INVALID_UTF8);\n }\n\n if (b >= 0x10000) {\n // Surrogate pair.\n if (b > 0x10ffff) {\n throw new Error(INVALID_UTF8);\n }\n b -= 0x10000;\n chars.push(String.fromCharCode(0xd800 | (b >> 10)));\n b = 0xdc00 | (b & 0x3ff);\n }\n }\n\n chars.push(String.fromCharCode(b));\n }\n return chars.join(\"\");\n}\n","// required so we don't have to do require('pusher').default etc.\nmodule.exports = require('./pusher').default;\n","import ScriptReceiver from './script_receiver';\n\n/** Builds receivers for JSONP and Script requests.\n *\n * Each receiver is an object with following fields:\n * - number - unique (for the factory instance), numerical id of the receiver\n * - id - a string ID that can be used in DOM attributes\n * - name - name of the function triggering the receiver\n * - callback - callback function\n *\n * Receivers are triggered only once, on the first callback call.\n *\n * Receivers can be called by their name or by accessing factory object\n * by the number key.\n *\n * @param {String} prefix the prefix used in ids\n * @param {String} name the name of the object\n */\nexport class ScriptReceiverFactory {\n lastId: number;\n prefix: string;\n name: string;\n\n constructor(prefix: string, name: string) {\n this.lastId = 0;\n this.prefix = prefix;\n this.name = name;\n }\n\n create(callback: Function): ScriptReceiver {\n this.lastId++;\n\n var number = this.lastId;\n var id = this.prefix + number;\n var name = this.name + '[' + number + ']';\n\n var called = false;\n var callbackWrapper = function() {\n if (!called) {\n callback.apply(null, arguments);\n called = true;\n }\n };\n\n this[number] = callbackWrapper;\n return { number: number, id: id, name: name, callback: callbackWrapper };\n }\n\n remove(receiver: ScriptReceiver) {\n delete this[receiver.number];\n }\n}\n\nexport var ScriptReceivers = new ScriptReceiverFactory(\n '_pusher_script_',\n 'Pusher.ScriptReceivers'\n);\n","export enum AuthRequestType {\n UserAuthentication = 'user-authentication',\n ChannelAuthorization = 'channel-authorization'\n}\n\nexport interface ChannelAuthorizationData {\n auth: string;\n channel_data?: string;\n shared_secret?: string;\n}\n\nexport type ChannelAuthorizationCallback = (\n error: Error | null,\n authData: ChannelAuthorizationData | null\n) => void;\n\nexport interface ChannelAuthorizationRequestParams {\n socketId: string;\n channelName: string;\n}\n\nexport interface ChannelAuthorizationHandler {\n (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback\n ): void;\n}\n\nexport interface UserAuthenticationData {\n auth: string;\n user_data: string;\n}\n\nexport type UserAuthenticationCallback = (\n error: Error | null,\n authData: UserAuthenticationData | null\n) => void;\n\nexport interface UserAuthenticationRequestParams {\n socketId: string;\n}\n\nexport interface UserAuthenticationHandler {\n (\n params: UserAuthenticationRequestParams,\n callback: UserAuthenticationCallback\n ): void;\n}\n\nexport type AuthTransportCallback =\n | ChannelAuthorizationCallback\n | UserAuthenticationCallback;\n\nexport interface AuthOptionsT {\n transport: 'ajax' | 'jsonp';\n endpoint: string;\n params?: any;\n headers?: any;\n paramsProvider?: () => any;\n headersProvider?: () => any;\n customHandler?: AuthHandler;\n}\n\nexport declare type UserAuthenticationOptions = AuthOptionsT<\n UserAuthenticationHandler\n>;\nexport declare type ChannelAuthorizationOptions = AuthOptionsT<\n ChannelAuthorizationHandler\n>;\n\nexport interface InternalAuthOptions {\n transport: 'ajax' | 'jsonp';\n endpoint: string;\n params?: any;\n headers?: any;\n paramsProvider?: () => any;\n headersProvider?: () => any;\n}\n","import {\n ChannelAuthorizationOptions,\n UserAuthenticationOptions\n} from './auth/options';\nimport { AuthTransport } from './config';\n\nexport interface DefaultConfig {\n VERSION: string;\n PROTOCOL: number;\n wsPort: number;\n wssPort: number;\n wsPath: string;\n httpHost: string;\n httpPort: number;\n httpsPort: number;\n httpPath: string;\n stats_host: string;\n authEndpoint: string;\n authTransport: AuthTransport;\n activityTimeout: number;\n pongTimeout: number;\n unavailableTimeout: number;\n cluster: string;\n userAuthentication: UserAuthenticationOptions;\n channelAuthorization: ChannelAuthorizationOptions;\n\n cdn_http?: string;\n cdn_https?: string;\n dependency_suffix?: string;\n}\n\nvar Defaults: DefaultConfig = {\n VERSION: VERSION,\n PROTOCOL: 7,\n\n wsPort: 80,\n wssPort: 443,\n wsPath: '',\n // DEPRECATED: SockJS fallback parameters\n httpHost: 'sockjs.pusher.com',\n httpPort: 80,\n httpsPort: 443,\n httpPath: '/pusher',\n // DEPRECATED: Stats\n stats_host: 'stats.pusher.com',\n // DEPRECATED: Other settings\n authEndpoint: '/pusher/auth',\n authTransport: 'ajax',\n activityTimeout: 120000,\n pongTimeout: 30000,\n unavailableTimeout: 10000,\n cluster: 'mt1',\n userAuthentication: {\n endpoint: '/pusher/user-auth',\n transport: 'ajax'\n },\n channelAuthorization: {\n endpoint: '/pusher/auth',\n transport: 'ajax'\n },\n\n // CDN configuration\n cdn_http: CDN_HTTP,\n cdn_https: CDN_HTTPS,\n dependency_suffix: DEPENDENCY_SUFFIX\n};\n\nexport default Defaults;\n","import {\n ScriptReceivers,\n ScriptReceiverFactory\n} from './script_receiver_factory';\nimport Runtime from 'runtime';\nimport ScriptRequest from './script_request';\n\n/** Handles loading dependency files.\n *\n * Dependency loaders don't remember whether a resource has been loaded or\n * not. It is caller's responsibility to make sure the resource is not loaded\n * twice. This is because it's impossible to detect resource loading status\n * without knowing its content.\n *\n * Options:\n * - cdn_http - url to HTTP CND\n * - cdn_https - url to HTTPS CDN\n * - version - version of pusher-js\n * - suffix - suffix appended to all names of dependency files\n *\n * @param {Object} options\n */\nexport default class DependencyLoader {\n options: any;\n receivers: ScriptReceiverFactory;\n loading: any;\n\n constructor(options: any) {\n this.options = options;\n this.receivers = options.receivers || ScriptReceivers;\n this.loading = {};\n }\n\n /** Loads the dependency from CDN.\n *\n * @param {String} name\n * @param {Function} callback\n */\n load(name: string, options: any, callback: Function) {\n var self = this;\n\n if (self.loading[name] && self.loading[name].length > 0) {\n self.loading[name].push(callback);\n } else {\n self.loading[name] = [callback];\n\n var request = Runtime.createScriptRequest(self.getPath(name, options));\n var receiver = self.receivers.create(function(error) {\n self.receivers.remove(receiver);\n\n if (self.loading[name]) {\n var callbacks = self.loading[name];\n delete self.loading[name];\n\n var successCallback = function(wasSuccessful) {\n if (!wasSuccessful) {\n request.cleanup();\n }\n };\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](error, successCallback);\n }\n }\n });\n request.send(receiver);\n }\n }\n\n /** Returns a root URL for pusher-js CDN.\n *\n * @returns {String}\n */\n getRoot(options: any): string {\n var cdn;\n var protocol = Runtime.getDocument().location.protocol;\n if ((options && options.useTLS) || protocol === 'https:') {\n cdn = this.options.cdn_https;\n } else {\n cdn = this.options.cdn_http;\n }\n // make sure there are no double slashes\n return cdn.replace(/\\/*$/, '') + '/' + this.options.version;\n }\n\n /** Returns a full path to a dependency file.\n *\n * @param {String} name\n * @returns {String}\n */\n getPath(name: string, options: any): string {\n return this.getRoot(options) + '/' + name + this.options.suffix + '.js';\n }\n}\n","import { ScriptReceiverFactory } from './script_receiver_factory';\nimport Defaults from 'core/defaults';\nimport DependencyLoader from './dependency_loader';\n\nexport var DependenciesReceivers = new ScriptReceiverFactory(\n '_pusher_dependencies',\n 'Pusher.DependenciesReceivers'\n);\n\nexport var Dependencies = new DependencyLoader({\n cdn_http: Defaults.cdn_http,\n cdn_https: Defaults.cdn_https,\n version: Defaults.VERSION,\n suffix: Defaults.dependency_suffix,\n receivers: DependenciesReceivers\n});\n","/**\n * A place to store help URLs for error messages etc\n */\n\nconst urlStore = {\n baseUrl: 'https://pusher.com',\n urls: {\n authenticationEndpoint: {\n path: '/docs/channels/server_api/authenticating_users'\n },\n authorizationEndpoint: {\n path: '/docs/channels/server_api/authorizing-users/'\n },\n javascriptQuickStart: {\n path: '/docs/javascript_quick_start'\n },\n triggeringClientEvents: {\n path: '/docs/client_api_guide/client_events#trigger-events'\n },\n encryptedChannelSupport: {\n fullUrl:\n 'https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support'\n }\n }\n};\n\n/** Builds a consistent string with links to pusher documentation\n *\n * @param {string} key - relevant key in the url_store.urls object\n * @return {string} suffix string to append to log message\n */\nconst buildLogSuffix = function(key: string): string {\n const urlPrefix = 'See:';\n const urlObj = urlStore.urls[key];\n if (!urlObj) return '';\n\n let url;\n if (urlObj.fullUrl) {\n url = urlObj.fullUrl;\n } else if (urlObj.path) {\n url = urlStore.baseUrl + urlObj.path;\n }\n\n if (!url) return '';\n return `${urlPrefix} ${url}`;\n};\n\nexport default { buildLogSuffix };\n","export default function encode(s: any): string {\n return btoa(utob(s));\n}\n\nvar fromCharCode = String.fromCharCode;\n\nvar b64chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nvar b64tab = {};\n\nfor (var i = 0, l = b64chars.length; i < l; i++) {\n b64tab[b64chars.charAt(i)] = i;\n}\n\nvar cb_utob = function(c) {\n var cc = c.charCodeAt(0);\n return cc < 0x80\n ? c\n : cc < 0x800\n ? fromCharCode(0xc0 | (cc >>> 6)) + fromCharCode(0x80 | (cc & 0x3f))\n : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) +\n fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) +\n fromCharCode(0x80 | (cc & 0x3f));\n};\n\nvar utob = function(u) {\n return u.replace(/[^\\x00-\\x7F]/g, cb_utob);\n};\n\nvar cb_encode = function(ccc) {\n var padlen = [0, 2, 1][ccc.length % 3];\n var ord =\n (ccc.charCodeAt(0) << 16) |\n ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) |\n (ccc.length > 2 ? ccc.charCodeAt(2) : 0);\n var chars = [\n b64chars.charAt(ord >>> 18),\n b64chars.charAt((ord >>> 12) & 63),\n padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),\n padlen >= 1 ? '=' : b64chars.charAt(ord & 63)\n ];\n return chars.join('');\n};\n\nvar btoa =\n global.btoa ||\n function(b) {\n return b.replace(/[\\s\\S]{1,3}/g, cb_encode);\n };\n","/** Error classes used throughout the library. */\n// https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\nexport class BadEventName extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class BadChannelName extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RequestTimedOut extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class TransportPriorityTooLow extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class TransportClosed extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedFeature extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedTransport extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedStrategy extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class HTTPAuthError extends Error {\n status: number;\n constructor(status: number, msg?: string) {\n super(msg);\n this.status = status;\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import TimelineSender from 'core/timeline/timeline_sender';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from 'runtime';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport AbstractRuntime from 'runtimes/interface';\nimport UrlStore from 'core/utils/url_store';\nimport {\n AuthRequestType,\n AuthTransportCallback,\n InternalAuthOptions\n} from 'core/auth/options';\nimport { HTTPAuthError } from 'core/errors';\n\nconst ajax: AuthTransport = function(\n context: AbstractRuntime,\n query: string,\n authOptions: InternalAuthOptions,\n authRequestType: AuthRequestType,\n callback: AuthTransportCallback\n) {\n const xhr = Runtime.createXHR();\n xhr.open('POST', authOptions.endpoint, true);\n\n // add request headers\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n for (var headerName in authOptions.headers) {\n xhr.setRequestHeader(headerName, authOptions.headers[headerName]);\n }\n if (authOptions.headersProvider != null) {\n let dynamicHeaders = authOptions.headersProvider();\n for (var headerName in dynamicHeaders) {\n xhr.setRequestHeader(headerName, dynamicHeaders[headerName]);\n }\n }\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n let data;\n let parsed = false;\n\n try {\n data = JSON.parse(xhr.responseText);\n parsed = true;\n } catch (e) {\n callback(\n new HTTPAuthError(\n 200,\n `JSON returned from ${authRequestType.toString()} endpoint was invalid, yet status code was 200. Data was: ${\n xhr.responseText\n }`\n ),\n null\n );\n }\n\n if (parsed) {\n // prevents double execution.\n callback(null, data);\n }\n } else {\n let suffix = '';\n switch (authRequestType) {\n case AuthRequestType.UserAuthentication:\n suffix = UrlStore.buildLogSuffix('authenticationEndpoint');\n break;\n case AuthRequestType.ChannelAuthorization:\n suffix = `Clients must be authorized to join private or presence channels. ${UrlStore.buildLogSuffix(\n 'authorizationEndpoint'\n )}`;\n break;\n }\n callback(\n new HTTPAuthError(\n xhr.status,\n `Unable to retrieve auth string from ${authRequestType.toString()} endpoint - ` +\n `received status: ${xhr.status} from ${authOptions.endpoint}. ${suffix}`\n ),\n null\n );\n }\n }\n };\n\n xhr.send(query);\n return xhr;\n};\n\nexport default ajax;\n","import TimedCallback from './timed_callback';\nimport { Delay, Scheduler, Canceller } from './scheduling';\n\nabstract class Timer {\n protected clear: Canceller;\n protected timer: number | void;\n\n constructor(\n set: Scheduler,\n clear: Canceller,\n delay: Delay,\n callback: TimedCallback\n ) {\n this.clear = clear;\n this.timer = set(() => {\n if (this.timer) {\n this.timer = callback(this.timer);\n }\n }, delay);\n }\n\n /** Returns whether the timer is still running.\n *\n * @return {Boolean}\n */\n isRunning(): boolean {\n return this.timer !== null;\n }\n\n /** Aborts a timer when it's running. */\n ensureAborted() {\n if (this.timer) {\n this.clear(this.timer);\n this.timer = null;\n }\n }\n}\n\nexport default Timer;\n","import Timer from './abstract_timer';\nimport TimedCallback from './timed_callback';\nimport { Delay } from './scheduling';\n\n// We need to bind clear functions this way to avoid exceptions on IE8\nfunction clearTimeout(timer) {\n global.clearTimeout(timer);\n}\nfunction clearInterval(timer) {\n global.clearInterval(timer);\n}\n\n/** Cross-browser compatible one-off timer abstraction.\n *\n * @param {Number} delay\n * @param {Function} callback\n */\nexport class OneOffTimer extends Timer {\n constructor(delay: Delay, callback: TimedCallback) {\n super(setTimeout, clearTimeout, delay, function(timer) {\n callback();\n return null;\n });\n }\n}\n\n/** Cross-browser compatible periodic timer abstraction.\n *\n * @param {Number} delay\n * @param {Function} callback\n */\nexport class PeriodicTimer extends Timer {\n constructor(delay: Delay, callback: TimedCallback) {\n super(setInterval, clearInterval, delay, function(timer) {\n callback();\n return timer;\n });\n }\n}\n","import * as Collections from './utils/collections';\nimport TimedCallback from './utils/timers/timed_callback';\nimport { OneOffTimer, PeriodicTimer } from './utils/timers';\n\nvar Util = {\n now(): number {\n if (Date.now) {\n return Date.now();\n } else {\n return new Date().valueOf();\n }\n },\n\n defer(callback: TimedCallback): OneOffTimer {\n return new OneOffTimer(0, callback);\n },\n\n /** Builds a function that will proxy a method call to its first argument.\n *\n * Allows partial application of arguments, so additional arguments are\n * prepended to the argument list.\n *\n * @param {String} name method name\n * @return {Function} proxy function\n */\n method(name: string, ...args: any[]): Function {\n var boundArguments = Array.prototype.slice.call(arguments, 1);\n return function(object) {\n return object[name].apply(object, boundArguments.concat(arguments));\n };\n }\n};\n\nexport default Util;\n","import base64encode from '../base64';\nimport Util from '../util';\n\n/** Merges multiple objects into the target argument.\n *\n * For properties that are plain Objects, performs a deep-merge. For the\n * rest it just copies the value of the property.\n *\n * To extend prototypes use it as following:\n * Pusher.Util.extend(Target.prototype, Base.prototype)\n *\n * You can also use it to merge objects without altering them:\n * Pusher.Util.extend({}, object1, object2)\n *\n * @param {Object} target\n * @return {Object} the target argument\n */\nexport function extend(target: any, ...sources: any[]): T {\n for (var i = 0; i < sources.length; i++) {\n var extensions = sources[i];\n for (var property in extensions) {\n if (\n extensions[property] &&\n extensions[property].constructor &&\n extensions[property].constructor === Object\n ) {\n target[property] = extend(target[property] || {}, extensions[property]);\n } else {\n target[property] = extensions[property];\n }\n }\n }\n return target;\n}\n\nexport function stringify(): string {\n var m = ['Pusher'];\n for (var i = 0; i < arguments.length; i++) {\n if (typeof arguments[i] === 'string') {\n m.push(arguments[i]);\n } else {\n m.push(safeJSONStringify(arguments[i]));\n }\n }\n return m.join(' : ');\n}\n\nexport function arrayIndexOf(array: any[], item: any): number {\n // MSIE doesn't have array.indexOf\n var nativeIndexOf = Array.prototype.indexOf;\n if (array === null) {\n return -1;\n }\n if (nativeIndexOf && array.indexOf === nativeIndexOf) {\n return array.indexOf(item);\n }\n for (var i = 0, l = array.length; i < l; i++) {\n if (array[i] === item) {\n return i;\n }\n }\n return -1;\n}\n\n/** Applies a function f to all properties of an object.\n *\n * Function f gets 3 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function objectApply(object: any, f: Function) {\n for (var key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n f(object[key], key, object);\n }\n }\n}\n\n/** Return a list of objects own proerty keys\n *\n * @param {Object} object\n * @returns {Array}\n */\nexport function keys(object: any): string[] {\n var keys = [];\n objectApply(object, function(_, key) {\n keys.push(key);\n });\n return keys;\n}\n\n/** Return a list of object's own property values\n *\n * @param {Object} object\n * @returns {Array}\n */\nexport function values(object: any): any[] {\n var values = [];\n objectApply(object, function(value) {\n values.push(value);\n });\n return values;\n}\n\n/** Applies a function f to all elements of an array.\n *\n * Function f gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function apply(array: any[], f: Function, context?: any) {\n for (var i = 0; i < array.length; i++) {\n f.call(context || global, array[i], i, array);\n }\n}\n\n/** Maps all elements of the array and returns the result.\n *\n * Function f gets 4 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n * - reference to the destination array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function map(array: any[], f: Function): any[] {\n var result = [];\n for (var i = 0; i < array.length; i++) {\n result.push(f(array[i], i, array, result));\n }\n return result;\n}\n\n/** Maps all elements of the object and returns the result.\n *\n * Function f gets 4 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the source object\n * - reference to the destination object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function mapObject(object: any, f: Function): any {\n var result = {};\n objectApply(object, function(value, key) {\n result[key] = f(value);\n });\n return result;\n}\n\n/** Filters elements of the array using a test function.\n *\n * Function test gets 4 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n * - reference to the destination array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function filter(array: any[], test: Function): any[] {\n test =\n test ||\n function(value) {\n return !!value;\n };\n\n var result = [];\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array, result)) {\n result.push(array[i]);\n }\n }\n return result;\n}\n\n/** Filters properties of the object using a test function.\n *\n * Function test gets 4 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the source object\n * - reference to the destination object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function filterObject(object: Object, test: Function) {\n var result = {};\n objectApply(object, function(value, key) {\n if ((test && test(value, key, object, result)) || Boolean(value)) {\n result[key] = value;\n }\n });\n return result;\n}\n\n/** Flattens an object into a two-dimensional array.\n *\n * @param {Object} object\n * @return {Array} resulting array of [key, value] pairs\n */\nexport function flatten(object: Object): any[] {\n var result = [];\n objectApply(object, function(value, key) {\n result.push([key, value]);\n });\n return result;\n}\n\n/** Checks whether any element of the array passes the test.\n *\n * Function test gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function any(array: any[], test: Function): boolean {\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array)) {\n return true;\n }\n }\n return false;\n}\n\n/** Checks whether all elements of the array pass the test.\n *\n * Function test gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function all(array: any[], test: Function): boolean {\n for (var i = 0; i < array.length; i++) {\n if (!test(array[i], i, array)) {\n return false;\n }\n }\n return true;\n}\n\nexport function encodeParamsObject(data): string {\n return mapObject(data, function(value) {\n if (typeof value === 'object') {\n value = safeJSONStringify(value);\n }\n return encodeURIComponent(base64encode(value.toString()));\n });\n}\n\nexport function buildQueryString(data: any): string {\n var params = filterObject(data, function(value) {\n return value !== undefined;\n });\n\n var query = map(\n flatten(encodeParamsObject(params)),\n Util.method('join', '=')\n ).join('&');\n\n return query;\n}\n\n/**\n * See https://github.com/douglascrockford/JSON-js/blob/master/cycle.js\n *\n * Remove circular references from an object. Required for JSON.stringify in\n * React Native, which tends to blow up a lot.\n *\n * @param {any} object\n * @return {any} Decycled object\n */\nexport function decycleObject(object: any): any {\n var objects = [],\n paths = [];\n\n return (function derez(value, path) {\n var i, name, nu;\n\n switch (typeof value) {\n case 'object':\n if (!value) {\n return null;\n }\n for (i = 0; i < objects.length; i += 1) {\n if (objects[i] === value) {\n return { $ref: paths[i] };\n }\n }\n\n objects.push(value);\n paths.push(path);\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n nu = [];\n for (i = 0; i < value.length; i += 1) {\n nu[i] = derez(value[i], path + '[' + i + ']');\n }\n } else {\n nu = {};\n for (name in value) {\n if (Object.prototype.hasOwnProperty.call(value, name)) {\n nu[name] = derez(\n value[name],\n path + '[' + JSON.stringify(name) + ']'\n );\n }\n }\n }\n return nu;\n case 'number':\n case 'string':\n case 'boolean':\n return value;\n }\n })(object, '$');\n}\n\n/**\n * Provides a cross-browser and cross-platform way to safely stringify objects\n * into JSON. This is particularly necessary for ReactNative, where circular JSON\n * structures throw an exception.\n *\n * @param {any} source The object to stringify\n * @return {string} The serialized output.\n */\nexport function safeJSONStringify(source: any): string {\n try {\n return JSON.stringify(source);\n } catch (e) {\n return JSON.stringify(decycleObject(source));\n }\n}\n","import { stringify } from './utils/collections';\nimport Pusher from './pusher';\n\nclass Logger {\n debug(...args: any[]) {\n this.log(this.globalLog, args);\n }\n\n warn(...args: any[]) {\n this.log(this.globalLogWarn, args);\n }\n\n error(...args: any[]) {\n this.log(this.globalLogError, args);\n }\n\n private globalLog = (message: string) => {\n if (global.console && global.console.log) {\n global.console.log(message);\n }\n };\n\n private globalLogWarn(message: string) {\n if (global.console && global.console.warn) {\n global.console.warn(message);\n } else {\n this.globalLog(message);\n }\n }\n\n private globalLogError(message: string) {\n if (global.console && global.console.error) {\n global.console.error(message);\n } else {\n this.globalLogWarn(message);\n }\n }\n\n private log(\n defaultLoggingFunction: (message: string) => void,\n ...args: any[]\n ) {\n var message = stringify.apply(this, arguments);\n if (Pusher.log) {\n Pusher.log(message);\n } else if (Pusher.logToConsole) {\n const log = defaultLoggingFunction.bind(this);\n log(message);\n }\n }\n}\n\nexport default new Logger();\n","import Browser from '../browser';\nimport Logger from 'core/logger';\nimport JSONPRequest from '../dom/jsonp_request';\nimport { ScriptReceivers } from '../dom/script_receiver_factory';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport {\n AuthRequestType,\n AuthTransportCallback,\n InternalAuthOptions\n} from 'core/auth/options';\n\nvar jsonp: AuthTransport = function(\n context: Browser,\n query: string,\n authOptions: InternalAuthOptions,\n authRequestType: AuthRequestType,\n callback: AuthTransportCallback\n) {\n if (\n authOptions.headers !== undefined ||\n authOptions.headersProvider != null\n ) {\n Logger.warn(\n `To send headers with the ${authRequestType.toString()} request, you must use AJAX, rather than JSONP.`\n );\n }\n\n var callbackName = context.nextAuthCallbackID.toString();\n context.nextAuthCallbackID++;\n\n var document = context.getDocument();\n var script = document.createElement('script');\n // Hacked wrapper.\n context.auth_callbacks[callbackName] = function(data) {\n callback(null, data);\n };\n\n var callback_name = \"Pusher.auth_callbacks['\" + callbackName + \"']\";\n script.src =\n authOptions.endpoint +\n '?callback=' +\n encodeURIComponent(callback_name) +\n '&' +\n query;\n\n var head =\n document.getElementsByTagName('head')[0] || document.documentElement;\n head.insertBefore(script, head.firstChild);\n};\n\nexport default jsonp;\n","import ScriptReceiver from './script_receiver';\n\n/** Sends a generic HTTP GET request using a script tag.\n *\n * By constructing URL in a specific way, it can be used for loading\n * JavaScript resources or JSONP requests. It can notify about errors, but\n * only in certain environments. Please take care of monitoring the state of\n * the request yourself.\n *\n * @param {String} src\n */\nexport default class ScriptRequest {\n src: string;\n script: any;\n errorScript: any;\n\n constructor(src: string) {\n this.src = src;\n }\n\n send(receiver: ScriptReceiver) {\n var self = this;\n var errorString = 'Error loading ' + self.src;\n\n self.script = document.createElement('script');\n self.script.id = receiver.id;\n self.script.src = self.src;\n self.script.type = 'text/javascript';\n self.script.charset = 'UTF-8';\n\n if (self.script.addEventListener) {\n self.script.onerror = function() {\n receiver.callback(errorString);\n };\n self.script.onload = function() {\n receiver.callback(null);\n };\n } else {\n self.script.onreadystatechange = function() {\n if (\n self.script.readyState === 'loaded' ||\n self.script.readyState === 'complete'\n ) {\n receiver.callback(null);\n }\n };\n }\n\n // Opera<11.6 hack for missing onerror callback\n if (\n self.script.async === undefined &&\n (document).attachEvent &&\n /opera/i.test(navigator.userAgent)\n ) {\n self.errorScript = document.createElement('script');\n self.errorScript.id = receiver.id + '_error';\n self.errorScript.text = receiver.name + \"('\" + errorString + \"');\";\n self.script.async = self.errorScript.async = false;\n } else {\n self.script.async = true;\n }\n\n var head = document.getElementsByTagName('head')[0];\n head.insertBefore(self.script, head.firstChild);\n if (self.errorScript) {\n head.insertBefore(self.errorScript, self.script.nextSibling);\n }\n }\n\n /** Cleans up the DOM remains of the script request. */\n cleanup() {\n if (this.script) {\n this.script.onload = this.script.onerror = null;\n this.script.onreadystatechange = null;\n }\n if (this.script && this.script.parentNode) {\n this.script.parentNode.removeChild(this.script);\n }\n if (this.errorScript && this.errorScript.parentNode) {\n this.errorScript.parentNode.removeChild(this.errorScript);\n }\n this.script = null;\n this.errorScript = null;\n }\n}\n","import ScriptReceiver from './script_receiver';\nimport ScriptRequest from './script_request';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from '../runtime';\n\n/** Sends data via JSONP.\n *\n * Data is a key-value map. Its values are JSON-encoded and then passed\n * through base64. Finally, keys and encoded values are appended to the query\n * string.\n *\n * The class itself does not guarantee raising errors on failures, as it's not\n * possible to support such feature on all browsers. Instead, JSONP endpoint\n * should call back in a way that's easy to distinguish from browser calls,\n * for example by passing a second argument to the receiver.\n *\n * @param {String} url\n * @param {Object} data key-value map of data to be submitted\n */\nexport default class JSONPRequest {\n url: string;\n data: any;\n request: ScriptRequest;\n\n constructor(url: string, data: any) {\n this.url = url;\n this.data = data;\n }\n\n /** Sends the actual JSONP request.\n *\n * @param {ScriptReceiver} receiver\n */\n send(receiver: ScriptReceiver) {\n if (this.request) {\n return;\n }\n\n var query = Collections.buildQueryString(this.data);\n var url = this.url + '/' + receiver.number + '?' + query;\n this.request = Runtime.createScriptRequest(url);\n this.request.send(receiver);\n }\n\n /** Cleans up the DOM remains of the JSONP request. */\n cleanup() {\n if (this.request) {\n this.request.cleanup();\n }\n }\n}\n","import TimelineSender from 'core/timeline/timeline_sender';\nimport TimelineTransport from 'core/timeline/timeline_transport';\nimport Browser from 'runtime';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport { ScriptReceivers } from '../dom/script_receiver_factory';\n\nvar getAgent = function(sender: TimelineSender, useTLS: boolean) {\n return function(data: any, callback: Function) {\n var scheme = 'http' + (useTLS ? 's' : '') + '://';\n var url =\n scheme + (sender.host || sender.options.host) + sender.options.path;\n var request = Browser.createJSONPRequest(url, data);\n\n var receiver = Browser.ScriptReceivers.create(function(error, result) {\n ScriptReceivers.remove(receiver);\n request.cleanup();\n\n if (result && result.host) {\n sender.host = result.host;\n }\n if (callback) {\n callback(error, result);\n }\n });\n request.send(receiver);\n };\n};\n\nvar jsonp = {\n name: 'jsonp',\n getAgent\n};\n\nexport default jsonp;\n","import Defaults from '../defaults';\nimport { default as URLScheme, URLSchemeParams } from './url_scheme';\n\nfunction getGenericURL(\n baseScheme: string,\n params: URLSchemeParams,\n path: string\n): string {\n var scheme = baseScheme + (params.useTLS ? 's' : '');\n var host = params.useTLS ? params.hostTLS : params.hostNonTLS;\n return scheme + '://' + host + path;\n}\n\nfunction getGenericPath(key: string, queryString?: string): string {\n var path = '/app/' + key;\n var query =\n '?protocol=' +\n Defaults.PROTOCOL +\n '&client=js' +\n '&version=' +\n Defaults.VERSION +\n (queryString ? '&' + queryString : '');\n return path + query;\n}\n\nexport var ws: URLScheme = {\n getInitial: function(key: string, params: URLSchemeParams): string {\n var path = (params.httpPath || '') + getGenericPath(key, 'flash=false');\n return getGenericURL('ws', params, path);\n }\n};\n\nexport var http: URLScheme = {\n getInitial: function(key: string, params: URLSchemeParams): string {\n var path = (params.httpPath || '/pusher') + getGenericPath(key);\n return getGenericURL('http', params, path);\n }\n};\n\nexport var sockjs: URLScheme = {\n getInitial: function(key: string, params: URLSchemeParams): string {\n return getGenericURL('http', params, params.httpPath || '/pusher');\n },\n getPath: function(key: string, params: URLSchemeParams): string {\n return getGenericPath(key);\n }\n};\n","import Callback from './callback';\nimport * as Collections from '../utils/collections';\nimport CallbackTable from './callback_table';\n\nexport default class CallbackRegistry {\n _callbacks: CallbackTable;\n\n constructor() {\n this._callbacks = {};\n }\n\n get(name: string): Callback[] {\n return this._callbacks[prefix(name)];\n }\n\n add(name: string, callback: Function, context: any) {\n var prefixedEventName = prefix(name);\n this._callbacks[prefixedEventName] =\n this._callbacks[prefixedEventName] || [];\n this._callbacks[prefixedEventName].push({\n fn: callback,\n context: context\n });\n }\n\n remove(name?: string, callback?: Function, context?: any) {\n if (!name && !callback && !context) {\n this._callbacks = {};\n return;\n }\n\n var names = name ? [prefix(name)] : Collections.keys(this._callbacks);\n\n if (callback || context) {\n this.removeCallback(names, callback, context);\n } else {\n this.removeAllCallbacks(names);\n }\n }\n\n private removeCallback(names: string[], callback: Function, context: any) {\n Collections.apply(\n names,\n function(name) {\n this._callbacks[name] = Collections.filter(\n this._callbacks[name] || [],\n function(binding) {\n return (\n (callback && callback !== binding.fn) ||\n (context && context !== binding.context)\n );\n }\n );\n if (this._callbacks[name].length === 0) {\n delete this._callbacks[name];\n }\n },\n this\n );\n }\n\n private removeAllCallbacks(names: string[]) {\n Collections.apply(\n names,\n function(name) {\n delete this._callbacks[name];\n },\n this\n );\n }\n}\n\nfunction prefix(name: string): string {\n return '_' + name;\n}\n","import * as Collections from '../utils/collections';\nimport Callback from './callback';\nimport Metadata from '../channels/metadata';\nimport CallbackRegistry from './callback_registry';\n\n/** Manages callback bindings and event emitting.\n *\n * @param Function failThrough called when no listeners are bound to an event\n */\nexport default class Dispatcher {\n callbacks: CallbackRegistry;\n global_callbacks: Function[];\n failThrough: Function;\n\n constructor(failThrough?: Function) {\n this.callbacks = new CallbackRegistry();\n this.global_callbacks = [];\n this.failThrough = failThrough;\n }\n\n bind(eventName: string, callback: Function, context?: any) {\n this.callbacks.add(eventName, callback, context);\n return this;\n }\n\n bind_global(callback: Function) {\n this.global_callbacks.push(callback);\n return this;\n }\n\n unbind(eventName?: string, callback?: Function, context?: any) {\n this.callbacks.remove(eventName, callback, context);\n return this;\n }\n\n unbind_global(callback?: Function) {\n if (!callback) {\n this.global_callbacks = [];\n return this;\n }\n\n this.global_callbacks = Collections.filter(\n this.global_callbacks || [],\n c => c !== callback\n );\n\n return this;\n }\n\n unbind_all() {\n this.unbind();\n this.unbind_global();\n return this;\n }\n\n emit(eventName: string, data?: any, metadata?: Metadata): Dispatcher {\n for (var i = 0; i < this.global_callbacks.length; i++) {\n this.global_callbacks[i](eventName, data);\n }\n\n var callbacks = this.callbacks.get(eventName);\n var args = [];\n\n if (metadata) {\n // if there's a metadata argument, we need to call the callback with both\n // data and metadata regardless of whether data is undefined\n args.push(data, metadata);\n } else if (data) {\n // metadata is undefined, so we only need to call the callback with data\n // if data exists\n args.push(data);\n }\n\n if (callbacks && callbacks.length > 0) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].fn.apply(callbacks[i].context || global, args);\n }\n } else if (this.failThrough) {\n this.failThrough(eventName, data);\n }\n\n return this;\n }\n}\n","import Util from '../util';\nimport * as Collections from '../utils/collections';\nimport { default as EventsDispatcher } from '../events/dispatcher';\nimport Logger from '../logger';\nimport TransportHooks from './transport_hooks';\nimport Socket from '../socket';\nimport Runtime from 'runtime';\nimport Timeline from '../timeline/timeline';\nimport TransportConnectionOptions from './transport_connection_options';\n\n/** Provides universal API for transport connections.\n *\n * Transport connection is a low-level object that wraps a connection method\n * and exposes a simple evented interface for the connection state and\n * messaging. It does not implement Pusher-specific WebSocket protocol.\n *\n * Additionally, it fetches resources needed for transport to work and exposes\n * an interface for querying transport features.\n *\n * States:\n * - new - initial state after constructing the object\n * - initializing - during initialization phase, usually fetching resources\n * - intialized - ready to establish a connection\n * - connection - when connection is being established\n * - open - when connection ready to be used\n * - closed - after connection was closed be either side\n *\n * Emits:\n * - error - after the connection raised an error\n *\n * Options:\n * - useTLS - whether connection should be over TLS\n * - hostTLS - host to connect to when connection is over TLS\n * - hostNonTLS - host to connect to when connection is over TLS\n *\n * @param {String} key application key\n * @param {Object} options\n */\nexport default class TransportConnection extends EventsDispatcher {\n hooks: TransportHooks;\n name: string;\n priority: number;\n key: string;\n options: TransportConnectionOptions;\n state: string;\n timeline: Timeline;\n activityTimeout: number;\n id: number;\n socket: Socket;\n beforeOpen: Function;\n initialize: Function;\n\n constructor(\n hooks: TransportHooks,\n name: string,\n priority: number,\n key: string,\n options: TransportConnectionOptions\n ) {\n super();\n this.initialize = Runtime.transportConnectionInitializer;\n this.hooks = hooks;\n this.name = name;\n this.priority = priority;\n this.key = key;\n this.options = options;\n\n this.state = 'new';\n this.timeline = options.timeline;\n this.activityTimeout = options.activityTimeout;\n this.id = this.timeline.generateUniqueID();\n }\n\n /** Checks whether the transport handles activity checks by itself.\n *\n * @return {Boolean}\n */\n handlesActivityChecks(): boolean {\n return Boolean(this.hooks.handlesActivityChecks);\n }\n\n /** Checks whether the transport supports the ping/pong API.\n *\n * @return {Boolean}\n */\n supportsPing(): boolean {\n return Boolean(this.hooks.supportsPing);\n }\n\n /** Tries to establish a connection.\n *\n * @returns {Boolean} false if transport is in invalid state\n */\n connect(): boolean {\n if (this.socket || this.state !== 'initialized') {\n return false;\n }\n\n var url = this.hooks.urls.getInitial(this.key, this.options);\n try {\n this.socket = this.hooks.getSocket(url, this.options);\n } catch (e) {\n Util.defer(() => {\n this.onError(e);\n this.changeState('closed');\n });\n return false;\n }\n\n this.bindListeners();\n\n Logger.debug('Connecting', { transport: this.name, url });\n this.changeState('connecting');\n return true;\n }\n\n /** Closes the connection.\n *\n * @return {Boolean} true if there was a connection to close\n */\n close(): boolean {\n if (this.socket) {\n this.socket.close();\n return true;\n } else {\n return false;\n }\n }\n\n /** Sends data over the open connection.\n *\n * @param {String} data\n * @return {Boolean} true only when in the \"open\" state\n */\n send(data: any): boolean {\n if (this.state === 'open') {\n // Workaround for MobileSafari bug (see https://gist.github.com/2052006)\n Util.defer(() => {\n if (this.socket) {\n this.socket.send(data);\n }\n });\n return true;\n } else {\n return false;\n }\n }\n\n /** Sends a ping if the connection is open and transport supports it. */\n ping() {\n if (this.state === 'open' && this.supportsPing()) {\n this.socket.ping();\n }\n }\n\n private onOpen() {\n if (this.hooks.beforeOpen) {\n this.hooks.beforeOpen(\n this.socket,\n this.hooks.urls.getPath(this.key, this.options)\n );\n }\n this.changeState('open');\n this.socket.onopen = undefined;\n }\n\n private onError(error) {\n this.emit('error', { type: 'WebSocketError', error: error });\n this.timeline.error(this.buildTimelineMessage({ error: error.toString() }));\n }\n\n private onClose(closeEvent?: any) {\n if (closeEvent) {\n this.changeState('closed', {\n code: closeEvent.code,\n reason: closeEvent.reason,\n wasClean: closeEvent.wasClean\n });\n } else {\n this.changeState('closed');\n }\n this.unbindListeners();\n this.socket = undefined;\n }\n\n private onMessage(message) {\n this.emit('message', message);\n }\n\n private onActivity() {\n this.emit('activity');\n }\n\n private bindListeners() {\n this.socket.onopen = () => {\n this.onOpen();\n };\n this.socket.onerror = error => {\n this.onError(error);\n };\n this.socket.onclose = closeEvent => {\n this.onClose(closeEvent);\n };\n this.socket.onmessage = message => {\n this.onMessage(message);\n };\n\n if (this.supportsPing()) {\n this.socket.onactivity = () => {\n this.onActivity();\n };\n }\n }\n\n private unbindListeners() {\n if (this.socket) {\n this.socket.onopen = undefined;\n this.socket.onerror = undefined;\n this.socket.onclose = undefined;\n this.socket.onmessage = undefined;\n if (this.supportsPing()) {\n this.socket.onactivity = undefined;\n }\n }\n }\n\n private changeState(state: string, params?: any) {\n this.state = state;\n this.timeline.info(\n this.buildTimelineMessage({\n state: state,\n params: params\n })\n );\n this.emit(state, params);\n }\n\n buildTimelineMessage(message): any {\n return Collections.extend({ cid: this.id }, message);\n }\n}\n","import Factory from '../utils/factory';\nimport TransportHooks from './transport_hooks';\nimport TransportConnection from './transport_connection';\nimport TransportConnectionOptions from './transport_connection_options';\n\n/** Provides interface for transport connection instantiation.\n *\n * Takes transport-specific hooks as the only argument, which allow checking\n * for transport support and creating its connections.\n *\n * Supported hooks: * - file - the name of the file to be fetched during initialization\n * - urls - URL scheme to be used by transport\n * - handlesActivityCheck - true when the transport handles activity checks\n * - supportsPing - true when the transport has a ping/activity API\n * - isSupported - tells whether the transport is supported in the environment\n * - getSocket - creates a WebSocket-compatible transport socket\n *\n * See transports.js for specific implementations.\n *\n * @param {Object} hooks object containing all needed transport hooks\n */\nexport default class Transport {\n hooks: TransportHooks;\n\n constructor(hooks: TransportHooks) {\n this.hooks = hooks;\n }\n\n /** Returns whether the transport is supported in the environment.\n *\n * @param {Object} envronment te environment details (encryption, settings)\n * @returns {Boolean} true when the transport is supported\n */\n isSupported(environment: any): boolean {\n return this.hooks.isSupported(environment);\n }\n\n /** Creates a transport connection.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {String} key the application key\n * @param {Object} options\n * @returns {TransportConnection}\n */\n createConnection(\n name: string,\n priority: number,\n key: string,\n options: any\n ): TransportConnection {\n return new TransportConnection(this.hooks, name, priority, key, options);\n }\n}\n","import * as URLSchemes from 'core/transports/url_schemes';\nimport URLScheme from 'core/transports/url_scheme';\nimport Transport from 'core/transports/transport';\nimport Util from 'core/util';\nimport * as Collections from 'core/utils/collections';\nimport TransportHooks from 'core/transports/transport_hooks';\nimport TransportsTable from 'core/transports/transports_table';\nimport Runtime from 'runtime';\n\n/** WebSocket transport.\n *\n * Uses native WebSocket implementation, including MozWebSocket supported by\n * earlier Firefox versions.\n */\nvar WSTransport = new Transport({\n urls: URLSchemes.ws,\n handlesActivityChecks: false,\n supportsPing: false,\n\n isInitialized: function() {\n return Boolean(Runtime.getWebSocketAPI());\n },\n isSupported: function(): boolean {\n return Boolean(Runtime.getWebSocketAPI());\n },\n getSocket: function(url) {\n return Runtime.createWebSocket(url);\n }\n});\n\nvar httpConfiguration = {\n urls: URLSchemes.http,\n handlesActivityChecks: false,\n supportsPing: true,\n isInitialized: function() {\n return true;\n }\n};\n\nexport var streamingConfiguration = Collections.extend(\n {\n getSocket: function(url) {\n return Runtime.HTTPFactory.createStreamingSocket(url);\n }\n },\n httpConfiguration\n);\nexport var pollingConfiguration = Collections.extend(\n {\n getSocket: function(url) {\n return Runtime.HTTPFactory.createPollingSocket(url);\n }\n },\n httpConfiguration\n);\n\nvar xhrConfiguration = {\n isSupported: function(): boolean {\n return Runtime.isXHRSupported();\n }\n};\n\n/** HTTP streaming transport using CORS-enabled XMLHttpRequest. */\nvar XHRStreamingTransport = new Transport(\n (\n Collections.extend({}, streamingConfiguration, xhrConfiguration)\n )\n);\n\n/** HTTP long-polling transport using CORS-enabled XMLHttpRequest. */\nvar XHRPollingTransport = new Transport(\n Collections.extend({}, pollingConfiguration, xhrConfiguration)\n);\n\nvar Transports: TransportsTable = {\n ws: WSTransport,\n xhr_streaming: XHRStreamingTransport,\n xhr_polling: XHRPollingTransport\n};\n\nexport default Transports;\n","import {\n default as Transports,\n streamingConfiguration,\n pollingConfiguration\n} from 'isomorphic/transports/transports';\nimport Transport from 'core/transports/transport';\nimport TransportHooks from 'core/transports/transport_hooks';\nimport * as URLSchemes from 'core/transports/url_schemes';\nimport Runtime from 'runtime';\nimport { Dependencies } from '../dom/dependencies';\nimport * as Collections from 'core/utils/collections';\n\nvar SockJSTransport = new Transport({\n file: 'sockjs',\n urls: URLSchemes.sockjs,\n handlesActivityChecks: true,\n supportsPing: false,\n\n isSupported: function() {\n return true;\n },\n isInitialized: function() {\n return window.SockJS !== undefined;\n },\n getSocket: function(url, options) {\n return new window.SockJS(url, null, {\n js_path: Dependencies.getPath('sockjs', {\n useTLS: options.useTLS\n }),\n ignore_null_origin: options.ignoreNullOrigin\n });\n },\n beforeOpen: function(socket, path) {\n socket.send(\n JSON.stringify({\n path: path\n })\n );\n }\n});\n\nvar xdrConfiguration = {\n isSupported: function(environment): boolean {\n var yes = Runtime.isXDRSupported(environment.useTLS);\n return yes;\n }\n};\n\n/** HTTP streaming transport using XDomainRequest (IE 8,9). */\nvar XDRStreamingTransport = new Transport(\n (\n Collections.extend({}, streamingConfiguration, xdrConfiguration)\n )\n);\n\n/** HTTP long-polling transport using XDomainRequest (IE 8,9). */\nvar XDRPollingTransport = new Transport(\n Collections.extend({}, pollingConfiguration, xdrConfiguration)\n);\n\nTransports.xdr_streaming = XDRStreamingTransport;\nTransports.xdr_polling = XDRPollingTransport;\nTransports.sockjs = SockJSTransport;\n\nexport default Transports;\n","import Reachability from 'core/reachability';\nimport { default as EventsDispatcher } from 'core/events/dispatcher';\n\n/** Really basic interface providing network availability info.\n *\n * Emits:\n * - online - when browser goes online\n * - offline - when browser goes offline\n */\nexport class NetInfo extends EventsDispatcher implements Reachability {\n constructor() {\n super();\n var self = this;\n // This is okay, as IE doesn't support this stuff anyway.\n if (window.addEventListener !== undefined) {\n window.addEventListener(\n 'online',\n function() {\n self.emit('online');\n },\n false\n );\n window.addEventListener(\n 'offline',\n function() {\n self.emit('offline');\n },\n false\n );\n }\n }\n\n /** Returns whether browser is online or not\n *\n * Offline means definitely offline (no connection to router).\n * Inverse does NOT mean definitely online (only currently supported in Safari\n * and even there only means the device has a connection to the router).\n *\n * @return {Boolean}\n */\n isOnline(): boolean {\n if (window.navigator.onLine === undefined) {\n return true;\n } else {\n return window.navigator.onLine;\n }\n }\n}\n\nexport var Network = new NetInfo();\n","import Util from '../util';\nimport * as Collections from '../utils/collections';\nimport TransportManager from './transport_manager';\nimport TransportConnection from './transport_connection';\nimport Transport from './transport';\nimport PingDelayOptions from './ping_delay_options';\n\n/** Creates transport connections monitored by a transport manager.\n *\n * When a transport is closed, it might mean the environment does not support\n * it. It's possible that messages get stuck in an intermediate buffer or\n * proxies terminate inactive connections. To combat these problems,\n * assistants monitor the connection lifetime, report unclean exits and\n * adjust ping timeouts to keep the connection active. The decision to disable\n * a transport is the manager's responsibility.\n *\n * @param {TransportManager} manager\n * @param {TransportConnection} transport\n * @param {Object} options\n */\nexport default class AssistantToTheTransportManager {\n manager: TransportManager;\n transport: Transport;\n minPingDelay: number;\n maxPingDelay: number;\n pingDelay: number;\n\n constructor(\n manager: TransportManager,\n transport: Transport,\n options: PingDelayOptions\n ) {\n this.manager = manager;\n this.transport = transport;\n this.minPingDelay = options.minPingDelay;\n this.maxPingDelay = options.maxPingDelay;\n this.pingDelay = undefined;\n }\n\n /** Creates a transport connection.\n *\n * This function has the same API as Transport#createConnection.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {String} key the application key\n * @param {Object} options\n * @returns {TransportConnection}\n */\n createConnection(\n name: string,\n priority: number,\n key: string,\n options: Object\n ): TransportConnection {\n options = Collections.extend({}, options, {\n activityTimeout: this.pingDelay\n });\n var connection = this.transport.createConnection(\n name,\n priority,\n key,\n options\n );\n\n var openTimestamp = null;\n\n var onOpen = function() {\n connection.unbind('open', onOpen);\n connection.bind('closed', onClosed);\n openTimestamp = Util.now();\n };\n var onClosed = closeEvent => {\n connection.unbind('closed', onClosed);\n\n if (closeEvent.code === 1002 || closeEvent.code === 1003) {\n // we don't want to use transports not obeying the protocol\n this.manager.reportDeath();\n } else if (!closeEvent.wasClean && openTimestamp) {\n // report deaths only for short-living transport\n var lifespan = Util.now() - openTimestamp;\n if (lifespan < 2 * this.maxPingDelay) {\n this.manager.reportDeath();\n this.pingDelay = Math.max(lifespan / 2, this.minPingDelay);\n }\n }\n };\n\n connection.bind('open', onOpen);\n return connection;\n }\n\n /** Returns whether the transport is supported in the environment.\n *\n * This function has the same API as Transport#isSupported. Might return false\n * when the manager decides to kill the transport.\n *\n * @param {Object} environment the environment details (encryption, settings)\n * @returns {Boolean} true when the transport is supported\n */\n isSupported(environment: string): boolean {\n return this.manager.isAlive() && this.transport.isSupported(environment);\n }\n}\n","import Action from './action';\nimport { PusherEvent } from './message-types';\n/**\n * Provides functions for handling Pusher protocol-specific messages.\n */\n\nconst Protocol = {\n /**\n * Decodes a message in a Pusher format.\n *\n * The MessageEvent we receive from the transport should contain a pusher event\n * (https://pusher.com/docs/pusher_protocol#events) serialized as JSON in the\n * data field\n *\n * The pusher event may contain a data field too, and it may also be\n * serialised as JSON\n *\n * Throws errors when messages are not parse'able.\n *\n * @param {MessageEvent} messageEvent\n * @return {PusherEvent}\n */\n decodeMessage: function(messageEvent: MessageEvent): PusherEvent {\n try {\n var messageData = JSON.parse(messageEvent.data);\n var pusherEventData = messageData.data;\n if (typeof pusherEventData === 'string') {\n try {\n pusherEventData = JSON.parse(messageData.data);\n } catch (e) {}\n }\n var pusherEvent: PusherEvent = {\n event: messageData.event,\n channel: messageData.channel,\n data: pusherEventData\n };\n if (messageData.user_id) {\n pusherEvent.user_id = messageData.user_id;\n }\n return pusherEvent;\n } catch (e) {\n throw { type: 'MessageParseError', error: e, data: messageEvent.data };\n }\n },\n\n /**\n * Encodes a message to be sent.\n *\n * @param {PusherEvent} event\n * @return {String}\n */\n encodeMessage: function(event: PusherEvent): string {\n return JSON.stringify(event);\n },\n\n /**\n * Processes a handshake message and returns appropriate actions.\n *\n * Returns an object with an 'action' and other action-specific properties.\n *\n * There are three outcomes when calling this function. First is a successful\n * connection attempt, when pusher:connection_established is received, which\n * results in a 'connected' action with an 'id' property. When passed a\n * pusher:error event, it returns a result with action appropriate to the\n * close code and an error. Otherwise, it raises an exception.\n *\n * @param {String} message\n * @result Object\n */\n processHandshake: function(messageEvent: MessageEvent): Action {\n var message = Protocol.decodeMessage(messageEvent);\n\n if (message.event === 'pusher:connection_established') {\n if (!message.data.activity_timeout) {\n throw 'No activity timeout specified in handshake';\n }\n return {\n action: 'connected',\n id: message.data.socket_id,\n activityTimeout: message.data.activity_timeout * 1000\n };\n } else if (message.event === 'pusher:error') {\n // From protocol 6 close codes are sent only once, so this only\n // happens when connection does not support close codes\n return {\n action: this.getCloseAction(message.data),\n error: this.getCloseError(message.data)\n };\n } else {\n throw 'Invalid handshake';\n }\n },\n\n /**\n * Dispatches the close event and returns an appropriate action name.\n *\n * See:\n * 1. https://developer.mozilla.org/en-US/docs/WebSockets/WebSockets_reference/CloseEvent\n * 2. http://pusher.com/docs/pusher_protocol\n *\n * @param {CloseEvent} closeEvent\n * @return {String} close action name\n */\n getCloseAction: function(closeEvent): string {\n if (closeEvent.code < 4000) {\n // ignore 1000 CLOSE_NORMAL, 1001 CLOSE_GOING_AWAY,\n // 1005 CLOSE_NO_STATUS, 1006 CLOSE_ABNORMAL\n // ignore 1007...3999\n // handle 1002 CLOSE_PROTOCOL_ERROR, 1003 CLOSE_UNSUPPORTED,\n // 1004 CLOSE_TOO_LARGE\n if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {\n return 'backoff';\n } else {\n return null;\n }\n } else if (closeEvent.code === 4000) {\n return 'tls_only';\n } else if (closeEvent.code < 4100) {\n return 'refused';\n } else if (closeEvent.code < 4200) {\n return 'backoff';\n } else if (closeEvent.code < 4300) {\n return 'retry';\n } else {\n // unknown error\n return 'refused';\n }\n },\n\n /**\n * Returns an error or null basing on the close event.\n *\n * Null is returned when connection was closed cleanly. Otherwise, an object\n * with error details is returned.\n *\n * @param {CloseEvent} closeEvent\n * @return {Object} error object\n */\n getCloseError: function(closeEvent): any {\n if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {\n return {\n type: 'PusherError',\n data: {\n code: closeEvent.code,\n message: closeEvent.reason || closeEvent.message\n }\n };\n } else {\n return null;\n }\n }\n};\n\nexport default Protocol;\n","import * as Collections from '../utils/collections';\nimport { default as EventsDispatcher } from '../events/dispatcher';\nimport Protocol from './protocol/protocol';\nimport { PusherEvent } from './protocol/message-types';\nimport Logger from '../logger';\nimport TransportConnection from '../transports/transport_connection';\nimport Socket from '../socket';\n/**\n * Provides Pusher protocol interface for transports.\n *\n * Emits following events:\n * - message - on received messages\n * - ping - on ping requests\n * - pong - on pong responses\n * - error - when the transport emits an error\n * - closed - after closing the transport\n *\n * It also emits more events when connection closes with a code.\n * See Protocol.getCloseAction to get more details.\n *\n * @param {Number} id\n * @param {AbstractTransport} transport\n */\nexport default class Connection extends EventsDispatcher implements Socket {\n id: string;\n transport: TransportConnection;\n activityTimeout: number;\n\n constructor(id: string, transport: TransportConnection) {\n super();\n this.id = id;\n this.transport = transport;\n this.activityTimeout = transport.activityTimeout;\n this.bindListeners();\n }\n\n /** Returns whether used transport handles activity checks by itself\n *\n * @returns {Boolean} true if activity checks are handled by the transport\n */\n handlesActivityChecks() {\n return this.transport.handlesActivityChecks();\n }\n\n /** Sends raw data.\n *\n * @param {String} data\n */\n send(data: any): boolean {\n return this.transport.send(data);\n }\n\n /** Sends an event.\n *\n * @param {String} name\n * @param {String} data\n * @param {String} [channel]\n * @returns {Boolean} whether message was sent or not\n */\n send_event(name: string, data: any, channel?: string): boolean {\n var event: PusherEvent = { event: name, data: data };\n if (channel) {\n event.channel = channel;\n }\n Logger.debug('Event sent', event);\n return this.send(Protocol.encodeMessage(event));\n }\n\n /** Sends a ping message to the server.\n *\n * Basing on the underlying transport, it might send either transport's\n * protocol-specific ping or pusher:ping event.\n */\n ping() {\n if (this.transport.supportsPing()) {\n this.transport.ping();\n } else {\n this.send_event('pusher:ping', {});\n }\n }\n\n /** Closes the connection. */\n close() {\n this.transport.close();\n }\n\n private bindListeners() {\n var listeners = {\n message: (messageEvent: MessageEvent) => {\n var pusherEvent;\n try {\n pusherEvent = Protocol.decodeMessage(messageEvent);\n } catch (e) {\n this.emit('error', {\n type: 'MessageParseError',\n error: e,\n data: messageEvent.data\n });\n }\n\n if (pusherEvent !== undefined) {\n Logger.debug('Event recd', pusherEvent);\n\n switch (pusherEvent.event) {\n case 'pusher:error':\n this.emit('error', {\n type: 'PusherError',\n data: pusherEvent.data\n });\n break;\n case 'pusher:ping':\n this.emit('ping');\n break;\n case 'pusher:pong':\n this.emit('pong');\n break;\n }\n this.emit('message', pusherEvent);\n }\n },\n activity: () => {\n this.emit('activity');\n },\n error: error => {\n this.emit('error', error);\n },\n closed: closeEvent => {\n unbindListeners();\n\n if (closeEvent && closeEvent.code) {\n this.handleCloseEvent(closeEvent);\n }\n\n this.transport = null;\n this.emit('closed');\n }\n };\n\n var unbindListeners = () => {\n Collections.objectApply(listeners, (listener, event) => {\n this.transport.unbind(event, listener);\n });\n };\n\n Collections.objectApply(listeners, (listener, event) => {\n this.transport.bind(event, listener);\n });\n }\n\n private handleCloseEvent(closeEvent: any) {\n var action = Protocol.getCloseAction(closeEvent);\n var error = Protocol.getCloseError(closeEvent);\n if (error) {\n this.emit('error', error);\n }\n if (action) {\n this.emit(action, { action: action, error: error });\n }\n }\n}\n","import Util from '../../util';\nimport * as Collections from '../../utils/collections';\nimport Protocol from '../protocol/protocol';\nimport Connection from '../connection';\nimport TransportConnection from '../../transports/transport_connection';\nimport HandshakePayload from './handshake_payload';\n\n/**\n * Handles Pusher protocol handshakes for transports.\n *\n * Calls back with a result object after handshake is completed. Results\n * always have two fields:\n * - action - string describing action to be taken after the handshake\n * - transport - the transport object passed to the constructor\n *\n * Different actions can set different additional properties on the result.\n * In the case of 'connected' action, there will be a 'connection' property\n * containing a Connection object for the transport. Other actions should\n * carry an 'error' property.\n *\n * @param {AbstractTransport} transport\n * @param {Function} callback\n */\nexport default class Handshake {\n transport: TransportConnection;\n callback: (HandshakePayload) => void;\n onMessage: Function;\n onClosed: Function;\n\n constructor(\n transport: TransportConnection,\n callback: (HandshakePayload) => void\n ) {\n this.transport = transport;\n this.callback = callback;\n this.bindListeners();\n }\n\n close() {\n this.unbindListeners();\n this.transport.close();\n }\n\n private bindListeners() {\n this.onMessage = m => {\n this.unbindListeners();\n\n var result;\n try {\n result = Protocol.processHandshake(m);\n } catch (e) {\n this.finish('error', { error: e });\n this.transport.close();\n return;\n }\n\n if (result.action === 'connected') {\n this.finish('connected', {\n connection: new Connection(result.id, this.transport),\n activityTimeout: result.activityTimeout\n });\n } else {\n this.finish(result.action, { error: result.error });\n this.transport.close();\n }\n };\n\n this.onClosed = closeEvent => {\n this.unbindListeners();\n\n var action = Protocol.getCloseAction(closeEvent) || 'backoff';\n var error = Protocol.getCloseError(closeEvent);\n this.finish(action, { error: error });\n };\n\n this.transport.bind('message', this.onMessage);\n this.transport.bind('closed', this.onClosed);\n }\n\n private unbindListeners() {\n this.transport.unbind('message', this.onMessage);\n this.transport.unbind('closed', this.onClosed);\n }\n\n private finish(action: string, params: any) {\n this.callback(\n Collections.extend({ transport: this.transport, action: action }, params)\n );\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport base64encode from '../base64';\nimport Timeline from './timeline';\nimport Runtime from 'runtime';\n\nexport interface TimelineSenderOptions {\n host?: string;\n port?: number;\n path?: string;\n}\n\nexport default class TimelineSender {\n timeline: Timeline;\n options: TimelineSenderOptions;\n host: string;\n\n constructor(timeline: Timeline, options: TimelineSenderOptions) {\n this.timeline = timeline;\n this.options = options || {};\n }\n\n send(useTLS: boolean, callback?: Function) {\n if (this.timeline.isEmpty()) {\n return;\n }\n\n this.timeline.send(\n Runtime.TimelineTransport.getAgent(this, useTLS),\n callback\n );\n }\n}\n","import { default as EventsDispatcher } from '../events/dispatcher';\nimport * as Errors from '../errors';\nimport Logger from '../logger';\nimport Pusher from '../pusher';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport Metadata from './metadata';\nimport UrlStore from '../utils/url_store';\nimport {\n ChannelAuthorizationData,\n ChannelAuthorizationCallback\n} from '../auth/options';\nimport { HTTPAuthError } from '../errors';\n\n/** Provides base public channel interface with an event emitter.\n *\n * Emits:\n * - pusher:subscription_succeeded - after subscribing successfully\n * - other non-internal events\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class Channel extends EventsDispatcher {\n name: string;\n pusher: Pusher;\n subscribed: boolean;\n subscriptionPending: boolean;\n subscriptionCancelled: boolean;\n subscriptionCount: null;\n\n constructor(name: string, pusher: Pusher) {\n super(function(event, data) {\n Logger.debug('No callbacks on ' + name + ' for ' + event);\n });\n\n this.name = name;\n this.pusher = pusher;\n this.subscribed = false;\n this.subscriptionPending = false;\n this.subscriptionCancelled = false;\n }\n\n /** Skips authorization, since public channels don't require it.\n *\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n return callback(null, { auth: '' });\n }\n\n /** Triggers an event */\n trigger(event: string, data: any) {\n if (event.indexOf('client-') !== 0) {\n throw new Errors.BadEventName(\n \"Event '\" + event + \"' does not start with 'client-'\"\n );\n }\n if (!this.subscribed) {\n var suffix = UrlStore.buildLogSuffix('triggeringClientEvents');\n Logger.warn(\n `Client event triggered before channel 'subscription_succeeded' event . ${suffix}`\n );\n }\n return this.pusher.send_event(event, data, this.name);\n }\n\n /** Signals disconnection to the channel. For internal use only. */\n disconnect() {\n this.subscribed = false;\n this.subscriptionPending = false;\n }\n\n /** Handles a PusherEvent. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n if (eventName === 'pusher_internal:subscription_succeeded') {\n this.handleSubscriptionSucceededEvent(event);\n } else if (eventName === 'pusher_internal:subscription_count') {\n this.handleSubscriptionCountEvent(event);\n } else if (eventName.indexOf('pusher_internal:') !== 0) {\n var metadata: Metadata = {};\n this.emit(eventName, data, metadata);\n }\n }\n\n handleSubscriptionSucceededEvent(event: PusherEvent) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n } else {\n this.emit('pusher:subscription_succeeded', event.data);\n }\n }\n\n handleSubscriptionCountEvent(event: PusherEvent) {\n if (event.data.subscription_count) {\n this.subscriptionCount = event.data.subscription_count;\n }\n\n this.emit('pusher:subscription_count', event.data);\n }\n\n /** Sends a subscription request. For internal use only. */\n subscribe() {\n if (this.subscribed) {\n return;\n }\n this.subscriptionPending = true;\n this.subscriptionCancelled = false;\n this.authorize(\n this.pusher.connection.socket_id,\n (error: Error | null, data: ChannelAuthorizationData) => {\n if (error) {\n this.subscriptionPending = false;\n // Why not bind to 'pusher:subscription_error' a level up, and log there?\n // Binding to this event would cause the warning about no callbacks being\n // bound (see constructor) to be suppressed, that's not what we want.\n Logger.error(error.toString());\n this.emit(\n 'pusher:subscription_error',\n Object.assign(\n {},\n {\n type: 'AuthError',\n error: error.message\n },\n error instanceof HTTPAuthError ? { status: error.status } : {}\n )\n );\n } else {\n this.pusher.send_event('pusher:subscribe', {\n auth: data.auth,\n channel_data: data.channel_data,\n channel: this.name\n });\n }\n }\n );\n }\n\n /** Sends an unsubscription request. For internal use only. */\n unsubscribe() {\n this.subscribed = false;\n this.pusher.send_event('pusher:unsubscribe', {\n channel: this.name\n });\n }\n\n /** Cancels an in progress subscription. For internal use only. */\n cancelSubscription() {\n this.subscriptionCancelled = true;\n }\n\n /** Reinstates an in progress subscripiton. For internal use only. */\n reinstateSubscription() {\n this.subscriptionCancelled = false;\n }\n}\n","import Factory from '../utils/factory';\nimport Channel from './channel';\nimport { ChannelAuthorizationCallback } from '../auth/options';\n\n/** Extends public channels to provide private channel interface.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class PrivateChannel extends Channel {\n /** Authorizes the connection to use the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n return this.pusher.config.channelAuthorizer(\n {\n channelName: this.name,\n socketId: socketId\n },\n callback\n );\n }\n}\n","import * as Collections from '../utils/collections';\n\n/** Represents a collection of members of a presence channel. */\nexport default class Members {\n members: any;\n count: number;\n myID: any;\n me: any;\n\n constructor() {\n this.reset();\n }\n\n /** Returns member's info for given id.\n *\n * Resulting object containts two fields - id and info.\n *\n * @param {Number} id\n * @return {Object} member's info or null\n */\n get(id: string): any {\n if (Object.prototype.hasOwnProperty.call(this.members, id)) {\n return {\n id: id,\n info: this.members[id]\n };\n } else {\n return null;\n }\n }\n\n /** Calls back for each member in unspecified order.\n *\n * @param {Function} callback\n */\n each(callback: Function) {\n Collections.objectApply(this.members, (member, id) => {\n callback(this.get(id));\n });\n }\n\n /** Updates the id for connected member. For internal use only. */\n setMyID(id: string) {\n this.myID = id;\n }\n\n /** Handles subscription data. For internal use only. */\n onSubscription(subscriptionData: any) {\n this.members = subscriptionData.presence.hash;\n this.count = subscriptionData.presence.count;\n this.me = this.get(this.myID);\n }\n\n /** Adds a new member to the collection. For internal use only. */\n addMember(memberData: any) {\n if (this.get(memberData.user_id) === null) {\n this.count++;\n }\n this.members[memberData.user_id] = memberData.user_info;\n return this.get(memberData.user_id);\n }\n\n /** Adds a member from the collection. For internal use only. */\n removeMember(memberData: any) {\n var member = this.get(memberData.user_id);\n if (member) {\n delete this.members[memberData.user_id];\n this.count--;\n }\n return member;\n }\n\n /** Resets the collection to the initial state. For internal use only. */\n reset() {\n this.members = {};\n this.count = 0;\n this.myID = null;\n this.me = null;\n }\n}\n","import PrivateChannel from './private_channel';\nimport Logger from '../logger';\nimport Members from './members';\nimport Pusher from '../pusher';\nimport UrlStore from 'core/utils/url_store';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport Metadata from './metadata';\nimport { ChannelAuthorizationData } from '../auth/options';\n\nexport default class PresenceChannel extends PrivateChannel {\n members: Members;\n\n /** Adds presence channel functionality to private channels.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\n constructor(name: string, pusher: Pusher) {\n super(name, pusher);\n this.members = new Members();\n }\n\n /** Authorizes the connection as a member of the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: Function) {\n super.authorize(socketId, async (error, authData) => {\n if (!error) {\n authData = authData as ChannelAuthorizationData;\n if (authData.channel_data != null) {\n var channelData = JSON.parse(authData.channel_data);\n this.members.setMyID(channelData.user_id);\n } else {\n await this.pusher.user.signinDonePromise;\n if (this.pusher.user.user_data != null) {\n // If the user is signed in, get the id of the authenticated user\n // and allow the presence authorization to continue.\n this.members.setMyID(this.pusher.user.user_data.id);\n } else {\n let suffix = UrlStore.buildLogSuffix('authorizationEndpoint');\n Logger.error(\n `Invalid auth response for channel '${this.name}', ` +\n `expected 'channel_data' field. ${suffix}, ` +\n `or the user should be signed in.`\n );\n callback('Invalid auth response');\n return;\n }\n }\n }\n callback(error, authData);\n });\n }\n\n /** Handles presence and subscription events. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n if (eventName.indexOf('pusher_internal:') === 0) {\n this.handleInternalEvent(event);\n } else {\n var data = event.data;\n var metadata: Metadata = {};\n if (event.user_id) {\n metadata.user_id = event.user_id;\n }\n this.emit(eventName, data, metadata);\n }\n }\n handleInternalEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n switch (eventName) {\n case 'pusher_internal:subscription_succeeded':\n this.handleSubscriptionSucceededEvent(event);\n break;\n case 'pusher_internal:subscription_count':\n this.handleSubscriptionCountEvent(event);\n break;\n case 'pusher_internal:member_added':\n var addedMember = this.members.addMember(data);\n this.emit('pusher:member_added', addedMember);\n break;\n case 'pusher_internal:member_removed':\n var removedMember = this.members.removeMember(data);\n if (removedMember) {\n this.emit('pusher:member_removed', removedMember);\n }\n break;\n }\n }\n\n handleSubscriptionSucceededEvent(event: PusherEvent) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n } else {\n this.members.onSubscription(event.data);\n this.emit('pusher:subscription_succeeded', this.members);\n }\n }\n\n /** Resets the channel state, including members map. For internal use only. */\n disconnect() {\n this.members.reset();\n super.disconnect();\n }\n}\n","import PrivateChannel from './private_channel';\nimport * as Errors from '../errors';\nimport Logger from '../logger';\nimport Pusher from '../pusher';\nimport { decode as encodeUTF8 } from '@stablelib/utf8';\nimport { decode as decodeBase64 } from '@stablelib/base64';\nimport Dispatcher from '../events/dispatcher';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport {\n ChannelAuthorizationData,\n ChannelAuthorizationCallback\n} from '../auth/options';\nimport * as nacl from 'tweetnacl';\n\n/** Extends private channels to provide encrypted channel interface.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class EncryptedChannel extends PrivateChannel {\n key: Uint8Array = null;\n nacl: nacl;\n\n constructor(name: string, pusher: Pusher, nacl: nacl) {\n super(name, pusher);\n this.nacl = nacl;\n }\n\n /** Authorizes the connection to use the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n super.authorize(\n socketId,\n (error: Error | null, authData: ChannelAuthorizationData) => {\n if (error) {\n callback(error, authData);\n return;\n }\n let sharedSecret = authData['shared_secret'];\n if (!sharedSecret) {\n callback(\n new Error(\n `No shared_secret key in auth payload for encrypted channel: ${this.name}`\n ),\n null\n );\n return;\n }\n this.key = decodeBase64(sharedSecret);\n delete authData['shared_secret'];\n callback(null, authData);\n }\n );\n }\n\n trigger(event: string, data: any): boolean {\n throw new Errors.UnsupportedFeature(\n 'Client events are not currently supported for encrypted channels'\n );\n }\n\n /** Handles an event. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n if (\n eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0\n ) {\n super.handleEvent(event);\n return;\n }\n this.handleEncryptedEvent(eventName, data);\n }\n\n private handleEncryptedEvent(event: string, data: any): void {\n if (!this.key) {\n Logger.debug(\n 'Received encrypted event before key has been retrieved from the authEndpoint'\n );\n return;\n }\n if (!data.ciphertext || !data.nonce) {\n Logger.error(\n 'Unexpected format for encrypted event, expected object with `ciphertext` and `nonce` fields, got: ' +\n data\n );\n return;\n }\n let cipherText = decodeBase64(data.ciphertext);\n if (cipherText.length < this.nacl.secretbox.overheadLength) {\n Logger.error(\n `Expected encrypted event ciphertext length to be ${this.nacl.secretbox.overheadLength}, got: ${cipherText.length}`\n );\n return;\n }\n let nonce = decodeBase64(data.nonce);\n if (nonce.length < this.nacl.secretbox.nonceLength) {\n Logger.error(\n `Expected encrypted event nonce length to be ${this.nacl.secretbox.nonceLength}, got: ${nonce.length}`\n );\n return;\n }\n\n let bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n Logger.debug(\n 'Failed to decrypt an event, probably because it was encrypted with a different key. Fetching a new key from the authEndpoint...'\n );\n // Try a single time to retrieve a new auth key and decrypt the event with it\n // If this fails, a new key will be requested when a new message is received\n this.authorize(this.pusher.connection.socket_id, (error, authData) => {\n if (error) {\n Logger.error(\n `Failed to make a request to the authEndpoint: ${authData}. Unable to fetch new key, so dropping encrypted event`\n );\n return;\n }\n bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n Logger.error(\n `Failed to decrypt event with new key. Dropping encrypted event`\n );\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n return;\n });\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n }\n\n // Try and parse the decrypted bytes as JSON. If we can't parse it, just\n // return the utf-8 string\n getDataToEmit(bytes: Uint8Array): string {\n let raw = encodeUTF8(bytes);\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n }\n}\n","import { default as EventsDispatcher } from '../events/dispatcher';\nimport { OneOffTimer as Timer } from '../utils/timers';\nimport { Config } from '../config';\nimport Logger from '../logger';\nimport HandshakePayload from './handshake/handshake_payload';\nimport Connection from './connection';\nimport Strategy from '../strategies/strategy';\nimport StrategyRunner from '../strategies/strategy_runner';\nimport * as Collections from '../utils/collections';\nimport Timeline from '../timeline/timeline';\nimport ConnectionManagerOptions from './connection_manager_options';\nimport Runtime from 'runtime';\n\nimport {\n ErrorCallbacks,\n HandshakeCallbacks,\n ConnectionCallbacks\n} from './callbacks';\nimport Action from './protocol/action';\n\n/** Manages connection to Pusher.\n *\n * Uses a strategy (currently only default), timers and network availability\n * info to establish a connection and export its state. In case of failures,\n * manages reconnection attempts.\n *\n * Exports state changes as following events:\n * - \"state_change\", { previous: p, current: state }\n * - state\n *\n * States:\n * - initialized - initial state, never transitioned to\n * - connecting - connection is being established\n * - connected - connection has been fully established\n * - disconnected - on requested disconnection\n * - unavailable - after connection timeout or when there's no network\n * - failed - when the connection strategy is not supported\n *\n * Options:\n * - unavailableTimeout - time to transition to unavailable state\n * - activityTimeout - time after which ping message should be sent\n * - pongTimeout - time for Pusher to respond with pong before reconnecting\n *\n * @param {String} key application key\n * @param {Object} options\n */\nexport default class ConnectionManager extends EventsDispatcher {\n key: string;\n options: ConnectionManagerOptions;\n state: string;\n connection: Connection;\n usingTLS: boolean;\n timeline: Timeline;\n socket_id: string;\n unavailableTimer: Timer;\n activityTimer: Timer;\n retryTimer: Timer;\n activityTimeout: number;\n strategy: Strategy;\n runner: StrategyRunner;\n errorCallbacks: ErrorCallbacks;\n handshakeCallbacks: HandshakeCallbacks;\n connectionCallbacks: ConnectionCallbacks;\n\n constructor(key: string, options: ConnectionManagerOptions) {\n super();\n this.state = 'initialized';\n this.connection = null;\n\n this.key = key;\n this.options = options;\n this.timeline = this.options.timeline;\n this.usingTLS = this.options.useTLS;\n\n this.errorCallbacks = this.buildErrorCallbacks();\n this.connectionCallbacks = this.buildConnectionCallbacks(\n this.errorCallbacks\n );\n this.handshakeCallbacks = this.buildHandshakeCallbacks(this.errorCallbacks);\n\n var Network = Runtime.getNetwork();\n\n Network.bind('online', () => {\n this.timeline.info({ netinfo: 'online' });\n if (this.state === 'connecting' || this.state === 'unavailable') {\n this.retryIn(0);\n }\n });\n Network.bind('offline', () => {\n this.timeline.info({ netinfo: 'offline' });\n if (this.connection) {\n this.sendActivityCheck();\n }\n });\n\n this.updateStrategy();\n }\n\n /** Establishes a connection to Pusher.\n *\n * Does nothing when connection is already established. See top-level doc\n * to find events emitted on connection attempts.\n */\n connect() {\n if (this.connection || this.runner) {\n return;\n }\n if (!this.strategy.isSupported()) {\n this.updateState('failed');\n return;\n }\n this.updateState('connecting');\n this.startConnecting();\n this.setUnavailableTimer();\n }\n\n /** Sends raw data.\n *\n * @param {String} data\n */\n send(data) {\n if (this.connection) {\n return this.connection.send(data);\n } else {\n return false;\n }\n }\n\n /** Sends an event.\n *\n * @param {String} name\n * @param {String} data\n * @param {String} [channel]\n * @returns {Boolean} whether message was sent or not\n */\n send_event(name: string, data: any, channel?: string) {\n if (this.connection) {\n return this.connection.send_event(name, data, channel);\n } else {\n return false;\n }\n }\n\n /** Closes the connection. */\n disconnect() {\n this.disconnectInternally();\n this.updateState('disconnected');\n }\n\n isUsingTLS() {\n return this.usingTLS;\n }\n\n private startConnecting() {\n var callback = (error, handshake) => {\n if (error) {\n this.runner = this.strategy.connect(0, callback);\n } else {\n if (handshake.action === 'error') {\n this.emit('error', {\n type: 'HandshakeError',\n error: handshake.error\n });\n this.timeline.error({ handshakeError: handshake.error });\n } else {\n this.abortConnecting(); // we don't support switching connections yet\n this.handshakeCallbacks[handshake.action](handshake);\n }\n }\n };\n this.runner = this.strategy.connect(0, callback);\n }\n\n private abortConnecting() {\n if (this.runner) {\n this.runner.abort();\n this.runner = null;\n }\n }\n\n private disconnectInternally() {\n this.abortConnecting();\n this.clearRetryTimer();\n this.clearUnavailableTimer();\n if (this.connection) {\n var connection = this.abandonConnection();\n connection.close();\n }\n }\n\n private updateStrategy() {\n this.strategy = this.options.getStrategy({\n key: this.key,\n timeline: this.timeline,\n useTLS: this.usingTLS\n });\n }\n\n private retryIn(delay) {\n this.timeline.info({ action: 'retry', delay: delay });\n if (delay > 0) {\n this.emit('connecting_in', Math.round(delay / 1000));\n }\n this.retryTimer = new Timer(delay || 0, () => {\n this.disconnectInternally();\n this.connect();\n });\n }\n\n private clearRetryTimer() {\n if (this.retryTimer) {\n this.retryTimer.ensureAborted();\n this.retryTimer = null;\n }\n }\n\n private setUnavailableTimer() {\n this.unavailableTimer = new Timer(this.options.unavailableTimeout, () => {\n this.updateState('unavailable');\n });\n }\n\n private clearUnavailableTimer() {\n if (this.unavailableTimer) {\n this.unavailableTimer.ensureAborted();\n }\n }\n\n private sendActivityCheck() {\n this.stopActivityCheck();\n this.connection.ping();\n // wait for pong response\n this.activityTimer = new Timer(this.options.pongTimeout, () => {\n this.timeline.error({ pong_timed_out: this.options.pongTimeout });\n this.retryIn(0);\n });\n }\n\n private resetActivityCheck() {\n this.stopActivityCheck();\n // send ping after inactivity\n if (this.connection && !this.connection.handlesActivityChecks()) {\n this.activityTimer = new Timer(this.activityTimeout, () => {\n this.sendActivityCheck();\n });\n }\n }\n\n private stopActivityCheck() {\n if (this.activityTimer) {\n this.activityTimer.ensureAborted();\n }\n }\n\n private buildConnectionCallbacks(\n errorCallbacks: ErrorCallbacks\n ): ConnectionCallbacks {\n return Collections.extend({}, errorCallbacks, {\n message: message => {\n // includes pong messages from server\n this.resetActivityCheck();\n this.emit('message', message);\n },\n ping: () => {\n this.send_event('pusher:pong', {});\n },\n activity: () => {\n this.resetActivityCheck();\n },\n error: error => {\n // just emit error to user - socket will already be closed by browser\n this.emit('error', error);\n },\n closed: () => {\n this.abandonConnection();\n if (this.shouldRetry()) {\n this.retryIn(1000);\n }\n }\n });\n }\n\n private buildHandshakeCallbacks(\n errorCallbacks: ErrorCallbacks\n ): HandshakeCallbacks {\n return Collections.extend({}, errorCallbacks, {\n connected: (handshake: HandshakePayload) => {\n this.activityTimeout = Math.min(\n this.options.activityTimeout,\n handshake.activityTimeout,\n handshake.connection.activityTimeout || Infinity\n );\n this.clearUnavailableTimer();\n this.setConnection(handshake.connection);\n this.socket_id = this.connection.id;\n this.updateState('connected', { socket_id: this.socket_id });\n }\n });\n }\n\n private buildErrorCallbacks(): ErrorCallbacks {\n let withErrorEmitted = callback => {\n return (result: Action | HandshakePayload) => {\n if (result.error) {\n this.emit('error', { type: 'WebSocketError', error: result.error });\n }\n callback(result);\n };\n };\n\n return {\n tls_only: withErrorEmitted(() => {\n this.usingTLS = true;\n this.updateStrategy();\n this.retryIn(0);\n }),\n refused: withErrorEmitted(() => {\n this.disconnect();\n }),\n backoff: withErrorEmitted(() => {\n this.retryIn(1000);\n }),\n retry: withErrorEmitted(() => {\n this.retryIn(0);\n })\n };\n }\n\n private setConnection(connection) {\n this.connection = connection;\n for (var event in this.connectionCallbacks) {\n this.connection.bind(event, this.connectionCallbacks[event]);\n }\n this.resetActivityCheck();\n }\n\n private abandonConnection() {\n if (!this.connection) {\n return;\n }\n this.stopActivityCheck();\n for (var event in this.connectionCallbacks) {\n this.connection.unbind(event, this.connectionCallbacks[event]);\n }\n var connection = this.connection;\n this.connection = null;\n return connection;\n }\n\n private updateState(newState: string, data?: any) {\n var previousState = this.state;\n this.state = newState;\n if (previousState !== newState) {\n var newStateDescription = newState;\n if (newStateDescription === 'connected') {\n newStateDescription += ' with new socket ID ' + data.socket_id;\n }\n Logger.debug(\n 'State changed',\n previousState + ' -> ' + newStateDescription\n );\n this.timeline.info({ state: newState, params: data });\n this.emit('state_change', { previous: previousState, current: newState });\n this.emit(newState, data);\n }\n }\n\n private shouldRetry(): boolean {\n return this.state === 'connecting' || this.state === 'connected';\n }\n}\n","import Channel from './channel';\nimport * as Collections from '../utils/collections';\nimport ChannelTable from './channel_table';\nimport Factory from '../utils/factory';\nimport Pusher from '../pusher';\nimport Logger from '../logger';\nimport * as Errors from '../errors';\nimport urlStore from '../utils/url_store';\n\n/** Handles a channel map. */\nexport default class Channels {\n channels: ChannelTable;\n\n constructor() {\n this.channels = {};\n }\n\n /** Creates or retrieves an existing channel by its name.\n *\n * @param {String} name\n * @param {Pusher} pusher\n * @return {Channel}\n */\n add(name: string, pusher: Pusher) {\n if (!this.channels[name]) {\n this.channels[name] = createChannel(name, pusher);\n }\n return this.channels[name];\n }\n\n /** Returns a list of all channels\n *\n * @return {Array}\n */\n all(): Channel[] {\n return Collections.values(this.channels);\n }\n\n /** Finds a channel by its name.\n *\n * @param {String} name\n * @return {Channel} channel or null if it doesn't exist\n */\n find(name: string) {\n return this.channels[name];\n }\n\n /** Removes a channel from the map.\n *\n * @param {String} name\n */\n remove(name: string) {\n var channel = this.channels[name];\n delete this.channels[name];\n return channel;\n }\n\n /** Proxies disconnection signal to all channels. */\n disconnect() {\n Collections.objectApply(this.channels, function(channel) {\n channel.disconnect();\n });\n }\n}\n\nfunction createChannel(name: string, pusher: Pusher): Channel {\n if (name.indexOf('private-encrypted-') === 0) {\n if (pusher.config.nacl) {\n return Factory.createEncryptedChannel(name, pusher, pusher.config.nacl);\n }\n let errMsg =\n 'Tried to subscribe to a private-encrypted- channel but no nacl implementation available';\n let suffix = urlStore.buildLogSuffix('encryptedChannelSupport');\n throw new Errors.UnsupportedFeature(`${errMsg}. ${suffix}`);\n } else if (name.indexOf('private-') === 0) {\n return Factory.createPrivateChannel(name, pusher);\n } else if (name.indexOf('presence-') === 0) {\n return Factory.createPresenceChannel(name, pusher);\n } else if (name.indexOf('#') === 0) {\n throw new Errors.BadChannelName(\n 'Cannot create a channel with name \"' + name + '\".'\n );\n } else {\n return Factory.createChannel(name, pusher);\n }\n}\n","import AssistantToTheTransportManager from '../transports/assistant_to_the_transport_manager';\nimport PingDelayOptions from '../transports/ping_delay_options';\nimport Transport from '../transports/transport';\nimport TransportManager from '../transports/transport_manager';\nimport Handshake from '../connection/handshake';\nimport TransportConnection from '../transports/transport_connection';\nimport SocketHooks from '../http/socket_hooks';\nimport HTTPSocket from '../http/http_socket';\n\nimport Timeline from '../timeline/timeline';\nimport {\n default as TimelineSender,\n TimelineSenderOptions\n} from '../timeline/timeline_sender';\nimport PresenceChannel from '../channels/presence_channel';\nimport PrivateChannel from '../channels/private_channel';\nimport EncryptedChannel from '../channels/encrypted_channel';\nimport Channel from '../channels/channel';\nimport ConnectionManager from '../connection/connection_manager';\nimport ConnectionManagerOptions from '../connection/connection_manager_options';\nimport Ajax from '../http/ajax';\nimport Channels from '../channels/channels';\nimport Pusher from '../pusher';\nimport { Config } from '../config';\nimport * as nacl from 'tweetnacl';\n\nvar Factory = {\n createChannels(): Channels {\n return new Channels();\n },\n\n createConnectionManager(\n key: string,\n options: ConnectionManagerOptions\n ): ConnectionManager {\n return new ConnectionManager(key, options);\n },\n\n createChannel(name: string, pusher: Pusher): Channel {\n return new Channel(name, pusher);\n },\n\n createPrivateChannel(name: string, pusher: Pusher): PrivateChannel {\n return new PrivateChannel(name, pusher);\n },\n\n createPresenceChannel(name: string, pusher: Pusher): PresenceChannel {\n return new PresenceChannel(name, pusher);\n },\n\n createEncryptedChannel(\n name: string,\n pusher: Pusher,\n nacl: nacl\n ): EncryptedChannel {\n return new EncryptedChannel(name, pusher, nacl);\n },\n\n createTimelineSender(timeline: Timeline, options: TimelineSenderOptions) {\n return new TimelineSender(timeline, options);\n },\n\n createHandshake(\n transport: TransportConnection,\n callback: (HandshakePayload) => void\n ): Handshake {\n return new Handshake(transport, callback);\n },\n\n createAssistantToTheTransportManager(\n manager: TransportManager,\n transport: Transport,\n options: PingDelayOptions\n ): AssistantToTheTransportManager {\n return new AssistantToTheTransportManager(manager, transport, options);\n }\n};\n\nexport default Factory;\n","import AssistantToTheTransportManager from './assistant_to_the_transport_manager';\nimport Transport from './transport';\nimport PingDelayOptions from './ping_delay_options';\nimport Factory from '../utils/factory';\n\nexport interface TransportManagerOptions extends PingDelayOptions {\n lives?: number;\n}\n\n/** Keeps track of the number of lives left for a transport.\n *\n * In the beginning of a session, transports may be assigned a number of\n * lives. When an AssistantToTheTransportManager instance reports a transport\n * connection closed uncleanly, the transport loses a life. When the number\n * of lives drops to zero, the transport gets disabled by its manager.\n *\n * @param {Object} options\n */\nexport default class TransportManager {\n options: TransportManagerOptions;\n livesLeft: number;\n\n constructor(options: TransportManagerOptions) {\n this.options = options || {};\n this.livesLeft = this.options.lives || Infinity;\n }\n\n /** Creates a assistant for the transport.\n *\n * @param {Transport} transport\n * @returns {AssistantToTheTransportManager}\n */\n getAssistant(transport: Transport): AssistantToTheTransportManager {\n return Factory.createAssistantToTheTransportManager(this, transport, {\n minPingDelay: this.options.minPingDelay,\n maxPingDelay: this.options.maxPingDelay\n });\n }\n\n /** Returns whether the transport has any lives left.\n *\n * @returns {Boolean}\n */\n isAlive(): boolean {\n return this.livesLeft > 0;\n }\n\n /** Takes one life from the transport. */\n reportDeath() {\n this.livesLeft -= 1;\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport { OneOffTimer as Timer } from '../utils/timers';\nimport Strategy from './strategy';\nimport StrategyOptions from './strategy_options';\n\n/** Loops through strategies with optional timeouts.\n *\n * Options:\n * - loop - whether it should loop through the substrategy list\n * - timeout - initial timeout for a single substrategy\n * - timeoutLimit - maximum timeout\n *\n * @param {Strategy[]} strategies\n * @param {Object} options\n */\nexport default class SequentialStrategy implements Strategy {\n strategies: Strategy[];\n loop: boolean;\n failFast: boolean;\n timeout: number;\n timeoutLimit: number;\n\n constructor(strategies: Strategy[], options: StrategyOptions) {\n this.strategies = strategies;\n this.loop = Boolean(options.loop);\n this.failFast = Boolean(options.failFast);\n this.timeout = options.timeout;\n this.timeoutLimit = options.timeoutLimit;\n }\n\n isSupported(): boolean {\n return Collections.any(this.strategies, Util.method('isSupported'));\n }\n\n connect(minPriority: number, callback: Function) {\n var strategies = this.strategies;\n var current = 0;\n var timeout = this.timeout;\n var runner = null;\n\n var tryNextStrategy = (error, handshake) => {\n if (handshake) {\n callback(null, handshake);\n } else {\n current = current + 1;\n if (this.loop) {\n current = current % strategies.length;\n }\n\n if (current < strategies.length) {\n if (timeout) {\n timeout = timeout * 2;\n if (this.timeoutLimit) {\n timeout = Math.min(timeout, this.timeoutLimit);\n }\n }\n runner = this.tryStrategy(\n strategies[current],\n minPriority,\n { timeout, failFast: this.failFast },\n tryNextStrategy\n );\n } else {\n callback(true);\n }\n }\n };\n\n runner = this.tryStrategy(\n strategies[current],\n minPriority,\n { timeout: timeout, failFast: this.failFast },\n tryNextStrategy\n );\n\n return {\n abort: function() {\n runner.abort();\n },\n forceMinPriority: function(p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n }\n\n private tryStrategy(\n strategy: Strategy,\n minPriority: number,\n options: StrategyOptions,\n callback: Function\n ) {\n var timer = null;\n var runner = null;\n\n if (options.timeout > 0) {\n timer = new Timer(options.timeout, function() {\n runner.abort();\n callback(true);\n });\n }\n\n runner = strategy.connect(minPriority, function(error, handshake) {\n if (error && timer && timer.isRunning() && !options.failFast) {\n // advance to the next strategy after the timeout\n return;\n }\n if (timer) {\n timer.ensureAborted();\n }\n callback(error, handshake);\n });\n\n return {\n abort: function() {\n if (timer) {\n timer.ensureAborted();\n }\n runner.abort();\n },\n forceMinPriority: function(p) {\n runner.forceMinPriority(p);\n }\n };\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport Strategy from './strategy';\n\n/** Launches all substrategies and emits prioritized connected transports.\n *\n * @param {Array} strategies\n */\nexport default class BestConnectedEverStrategy implements Strategy {\n strategies: Strategy[];\n\n constructor(strategies: Strategy[]) {\n this.strategies = strategies;\n }\n\n isSupported(): boolean {\n return Collections.any(this.strategies, Util.method('isSupported'));\n }\n\n connect(minPriority: number, callback: Function) {\n return connect(this.strategies, minPriority, function(i, runners) {\n return function(error, handshake) {\n runners[i].error = error;\n if (error) {\n if (allRunnersFailed(runners)) {\n callback(true);\n }\n return;\n }\n Collections.apply(runners, function(runner) {\n runner.forceMinPriority(handshake.transport.priority);\n });\n callback(null, handshake);\n };\n });\n }\n}\n\n/** Connects to all strategies in parallel.\n *\n * Callback builder should be a function that takes two arguments: index\n * and a list of runners. It should return another function that will be\n * passed to the substrategy with given index. Runners can be aborted using\n * abortRunner(s) functions from this class.\n *\n * @param {Array} strategies\n * @param {Function} callbackBuilder\n * @return {Object} strategy runner\n */\nfunction connect(\n strategies: Strategy[],\n minPriority: number,\n callbackBuilder: Function\n) {\n var runners = Collections.map(strategies, function(strategy, i, _, rs) {\n return strategy.connect(minPriority, callbackBuilder(i, rs));\n });\n return {\n abort: function() {\n Collections.apply(runners, abortRunner);\n },\n forceMinPriority: function(p) {\n Collections.apply(runners, function(runner) {\n runner.forceMinPriority(p);\n });\n }\n };\n}\n\nfunction allRunnersFailed(runners): boolean {\n return Collections.all(runners, function(runner) {\n return Boolean(runner.error);\n });\n}\n\nfunction abortRunner(runner) {\n if (!runner.error && !runner.aborted) {\n runner.abort();\n runner.aborted = true;\n }\n}\n","import Util from '../util';\nimport Runtime from 'runtime';\nimport Strategy from './strategy';\nimport SequentialStrategy from './sequential_strategy';\nimport StrategyOptions from './strategy_options';\nimport TransportStrategy from './transport_strategy';\nimport Timeline from '../timeline/timeline';\nimport * as Collections from '../utils/collections';\n\nexport interface TransportStrategyDictionary {\n [key: string]: TransportStrategy;\n}\n\n/** Caches last successful transport and uses it for following attempts.\n *\n * @param {Strategy} strategy\n * @param {Object} transports\n * @param {Object} options\n */\nexport default class CachedStrategy implements Strategy {\n strategy: Strategy;\n transports: TransportStrategyDictionary;\n ttl: number;\n usingTLS: boolean;\n timeline: Timeline;\n\n constructor(\n strategy: Strategy,\n transports: TransportStrategyDictionary,\n options: StrategyOptions\n ) {\n this.strategy = strategy;\n this.transports = transports;\n this.ttl = options.ttl || 1800 * 1000;\n this.usingTLS = options.useTLS;\n this.timeline = options.timeline;\n }\n\n isSupported(): boolean {\n return this.strategy.isSupported();\n }\n\n connect(minPriority: number, callback: Function) {\n var usingTLS = this.usingTLS;\n var info = fetchTransportCache(usingTLS);\n\n var strategies = [this.strategy];\n if (info && info.timestamp + this.ttl >= Util.now()) {\n var transport = this.transports[info.transport];\n if (transport) {\n this.timeline.info({\n cached: true,\n transport: info.transport,\n latency: info.latency\n });\n strategies.push(\n new SequentialStrategy([transport], {\n timeout: info.latency * 2 + 1000,\n failFast: true\n })\n );\n }\n }\n\n var startTimestamp = Util.now();\n var runner = strategies\n .pop()\n .connect(minPriority, function cb(error, handshake) {\n if (error) {\n flushTransportCache(usingTLS);\n if (strategies.length > 0) {\n startTimestamp = Util.now();\n runner = strategies.pop().connect(minPriority, cb);\n } else {\n callback(error);\n }\n } else {\n storeTransportCache(\n usingTLS,\n handshake.transport.name,\n Util.now() - startTimestamp\n );\n callback(null, handshake);\n }\n });\n\n return {\n abort: function() {\n runner.abort();\n },\n forceMinPriority: function(p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n }\n}\n\nfunction getTransportCacheKey(usingTLS: boolean): string {\n return 'pusherTransport' + (usingTLS ? 'TLS' : 'NonTLS');\n}\n\nfunction fetchTransportCache(usingTLS: boolean): any {\n var storage = Runtime.getLocalStorage();\n if (storage) {\n try {\n var serializedCache = storage[getTransportCacheKey(usingTLS)];\n if (serializedCache) {\n return JSON.parse(serializedCache);\n }\n } catch (e) {\n flushTransportCache(usingTLS);\n }\n }\n return null;\n}\n\nfunction storeTransportCache(\n usingTLS: boolean,\n transport: TransportStrategy,\n latency: number\n) {\n var storage = Runtime.getLocalStorage();\n if (storage) {\n try {\n storage[getTransportCacheKey(usingTLS)] = Collections.safeJSONStringify({\n timestamp: Util.now(),\n transport: transport,\n latency: latency\n });\n } catch (e) {\n // catch over quota exceptions raised by localStorage\n }\n }\n}\n\nfunction flushTransportCache(usingTLS: boolean) {\n var storage = Runtime.getLocalStorage();\n if (storage) {\n try {\n delete storage[getTransportCacheKey(usingTLS)];\n } catch (e) {\n // catch exceptions raised by localStorage\n }\n }\n}\n","import { OneOffTimer as Timer } from '../utils/timers';\nimport Strategy from './strategy';\nimport StrategyOptions from './strategy_options';\n\n/** Runs substrategy after specified delay.\n *\n * Options:\n * - delay - time in miliseconds to delay the substrategy attempt\n *\n * @param {Strategy} strategy\n * @param {Object} options\n */\nexport default class DelayedStrategy implements Strategy {\n strategy: Strategy;\n options: { delay: number };\n\n constructor(strategy: Strategy, { delay: number }) {\n this.strategy = strategy;\n this.options = { delay: number };\n }\n\n isSupported(): boolean {\n return this.strategy.isSupported();\n }\n\n connect(minPriority: number, callback: Function) {\n var strategy = this.strategy;\n var runner;\n var timer = new Timer(this.options.delay, function() {\n runner = strategy.connect(minPriority, callback);\n });\n\n return {\n abort: function() {\n timer.ensureAborted();\n if (runner) {\n runner.abort();\n }\n },\n forceMinPriority: function(p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n }\n}\n","import Strategy from './strategy';\nimport StrategyRunner from './strategy_runner';\n\n/** Proxies method calls to one of substrategies basing on the test function.\n *\n * @param {Function} test\n * @param {Strategy} trueBranch strategy used when test returns true\n * @param {Strategy} falseBranch strategy used when test returns false\n */\nexport default class IfStrategy implements Strategy {\n test: () => boolean;\n trueBranch: Strategy;\n falseBranch: Strategy;\n\n constructor(\n test: () => boolean,\n trueBranch: Strategy,\n falseBranch: Strategy\n ) {\n this.test = test;\n this.trueBranch = trueBranch;\n this.falseBranch = falseBranch;\n }\n\n isSupported(): boolean {\n var branch = this.test() ? this.trueBranch : this.falseBranch;\n return branch.isSupported();\n }\n\n connect(minPriority: number, callback: Function): StrategyRunner {\n var branch = this.test() ? this.trueBranch : this.falseBranch;\n return branch.connect(minPriority, callback);\n }\n}\n","import Strategy from './strategy';\nimport StrategyRunner from './strategy_runner';\n\n/** Launches the substrategy and terminates on the first open connection.\n *\n * @param {Strategy} strategy\n */\nexport default class FirstConnectedStrategy implements Strategy {\n strategy: Strategy;\n\n constructor(strategy: Strategy) {\n this.strategy = strategy;\n }\n\n isSupported(): boolean {\n return this.strategy.isSupported();\n }\n\n connect(minPriority: number, callback: Function): StrategyRunner {\n var runner = this.strategy.connect(minPriority, function(error, handshake) {\n if (handshake) {\n runner.abort();\n }\n callback(error, handshake);\n });\n return runner;\n }\n}\n","import * as Collections from 'core/utils/collections';\nimport TransportManager from 'core/transports/transport_manager';\nimport Strategy from 'core/strategies/strategy';\nimport StrategyOptions from 'core/strategies/strategy_options';\nimport SequentialStrategy from 'core/strategies/sequential_strategy';\nimport BestConnectedEverStrategy from 'core/strategies/best_connected_ever_strategy';\nimport CachedStrategy, {\n TransportStrategyDictionary\n} from 'core/strategies/cached_strategy';\nimport DelayedStrategy from 'core/strategies/delayed_strategy';\nimport IfStrategy from 'core/strategies/if_strategy';\nimport FirstConnectedStrategy from 'core/strategies/first_connected_strategy';\nimport { Config } from 'core/config';\n\nfunction testSupportsStrategy(strategy: Strategy) {\n return function() {\n return strategy.isSupported();\n };\n}\n\nvar getDefaultStrategy = function(\n config: Config,\n baseOptions: StrategyOptions,\n defineTransport: Function\n): Strategy {\n var definedTransports = {};\n\n function defineTransportStrategy(\n name: string,\n type: string,\n priority: number,\n options: StrategyOptions,\n manager?: TransportManager\n ) {\n var transport = defineTransport(\n config,\n name,\n type,\n priority,\n options,\n manager\n );\n\n definedTransports[name] = transport;\n\n return transport;\n }\n\n var ws_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.wsHost + ':' + config.wsPort,\n hostTLS: config.wsHost + ':' + config.wssPort,\n httpPath: config.wsPath\n });\n var wss_options: StrategyOptions = Object.assign({}, ws_options, {\n useTLS: true\n });\n var sockjs_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.httpHost + ':' + config.httpPort,\n hostTLS: config.httpHost + ':' + config.httpsPort,\n httpPath: config.httpPath\n });\n\n var timeouts = {\n loop: true,\n timeout: 15000,\n timeoutLimit: 60000\n };\n\n var ws_manager = new TransportManager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout\n });\n var streaming_manager = new TransportManager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout\n });\n\n var ws_transport = defineTransportStrategy(\n 'ws',\n 'ws',\n 3,\n ws_options,\n ws_manager\n );\n var wss_transport = defineTransportStrategy(\n 'wss',\n 'ws',\n 3,\n wss_options,\n ws_manager\n );\n var sockjs_transport = defineTransportStrategy(\n 'sockjs',\n 'sockjs',\n 1,\n sockjs_options\n );\n var xhr_streaming_transport = defineTransportStrategy(\n 'xhr_streaming',\n 'xhr_streaming',\n 1,\n sockjs_options,\n streaming_manager\n );\n var xdr_streaming_transport = defineTransportStrategy(\n 'xdr_streaming',\n 'xdr_streaming',\n 1,\n sockjs_options,\n streaming_manager\n );\n var xhr_polling_transport = defineTransportStrategy(\n 'xhr_polling',\n 'xhr_polling',\n 1,\n sockjs_options\n );\n var xdr_polling_transport = defineTransportStrategy(\n 'xdr_polling',\n 'xdr_polling',\n 1,\n sockjs_options\n );\n\n var ws_loop = new SequentialStrategy([ws_transport], timeouts);\n var wss_loop = new SequentialStrategy([wss_transport], timeouts);\n var sockjs_loop = new SequentialStrategy([sockjs_transport], timeouts);\n var streaming_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(xhr_streaming_transport),\n xhr_streaming_transport,\n xdr_streaming_transport\n )\n ],\n timeouts\n );\n var polling_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(xhr_polling_transport),\n xhr_polling_transport,\n xdr_polling_transport\n )\n ],\n timeouts\n );\n\n var http_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(streaming_loop),\n new BestConnectedEverStrategy([\n streaming_loop,\n new DelayedStrategy(polling_loop, { delay: 4000 })\n ]),\n polling_loop\n )\n ],\n timeouts\n );\n\n var http_fallback_loop = new IfStrategy(\n testSupportsStrategy(http_loop),\n http_loop,\n sockjs_loop\n );\n\n var wsStrategy;\n if (baseOptions.useTLS) {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(http_fallback_loop, { delay: 2000 })\n ]);\n } else {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(wss_loop, { delay: 2000 }),\n new DelayedStrategy(http_fallback_loop, { delay: 5000 })\n ]);\n }\n\n return new CachedStrategy(\n new FirstConnectedStrategy(\n new IfStrategy(\n testSupportsStrategy(ws_transport),\n wsStrategy,\n http_fallback_loop\n )\n ),\n definedTransports,\n {\n ttl: 1800000,\n timeline: baseOptions.timeline,\n useTLS: baseOptions.useTLS\n }\n );\n};\n\nexport default getDefaultStrategy;\n","enum State {\n CONNECTING = 0,\n OPEN = 1,\n CLOSED = 3\n}\n\nexport default State;\n","import HTTPRequest from 'core/http/http_request';\nimport RequestHooks from 'core/http/request_hooks';\nimport Ajax from 'core/http/ajax';\nimport * as Errors from 'core/errors';\n\nvar hooks: RequestHooks = {\n getRequest: function(socket: HTTPRequest): Ajax {\n var xdr = new (window).XDomainRequest();\n xdr.ontimeout = function() {\n socket.emit('error', new Errors.RequestTimedOut());\n socket.close();\n };\n xdr.onerror = function(e) {\n socket.emit('error', e);\n socket.close();\n };\n xdr.onprogress = function() {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n };\n xdr.onload = function() {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n socket.emit('finished', 200);\n socket.close();\n };\n return xdr;\n },\n abortRequest: function(xdr: Ajax) {\n xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null;\n xdr.abort();\n }\n};\n\nexport default hooks;\n","import Runtime from 'runtime';\nimport RequestHooks from './request_hooks';\nimport Ajax from './ajax';\nimport { default as EventsDispatcher } from '../events/dispatcher';\n\nconst MAX_BUFFER_LENGTH = 256 * 1024;\n\nexport default class HTTPRequest extends EventsDispatcher {\n hooks: RequestHooks;\n method: string;\n url: string;\n position: number;\n xhr: Ajax;\n unloader: Function;\n\n constructor(hooks: RequestHooks, method: string, url: string) {\n super();\n this.hooks = hooks;\n this.method = method;\n this.url = url;\n }\n\n start(payload?: any) {\n this.position = 0;\n this.xhr = this.hooks.getRequest(this);\n\n this.unloader = () => {\n this.close();\n };\n Runtime.addUnloadListener(this.unloader);\n\n this.xhr.open(this.method, this.url, true);\n\n if (this.xhr.setRequestHeader) {\n this.xhr.setRequestHeader('Content-Type', 'application/json'); // ReactNative doesn't set this header by default.\n }\n this.xhr.send(payload);\n }\n\n close() {\n if (this.unloader) {\n Runtime.removeUnloadListener(this.unloader);\n this.unloader = null;\n }\n if (this.xhr) {\n this.hooks.abortRequest(this.xhr);\n this.xhr = null;\n }\n }\n\n onChunk(status: number, data: any) {\n while (true) {\n var chunk = this.advanceBuffer(data);\n if (chunk) {\n this.emit('chunk', { status: status, data: chunk });\n } else {\n break;\n }\n }\n if (this.isBufferTooLong(data)) {\n this.emit('buffer_too_long');\n }\n }\n\n private advanceBuffer(buffer: any[]): any {\n var unreadData = buffer.slice(this.position);\n var endOfLinePosition = unreadData.indexOf('\\n');\n\n if (endOfLinePosition !== -1) {\n this.position += endOfLinePosition + 1;\n return unreadData.slice(0, endOfLinePosition);\n } else {\n // chunk is not finished yet, don't move the buffer pointer\n return null;\n }\n }\n\n private isBufferTooLong(buffer: any): boolean {\n return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH;\n }\n}\n","import URLLocation from './url_location';\nimport State from './state';\nimport Socket from '../socket';\nimport SocketHooks from './socket_hooks';\nimport Util from '../util';\nimport Ajax from './ajax';\nimport HTTPRequest from './http_request';\nimport Runtime from 'runtime';\n\nvar autoIncrement = 1;\n\nclass HTTPSocket implements Socket {\n hooks: SocketHooks;\n session: string;\n location: URLLocation;\n readyState: State;\n stream: HTTPRequest;\n\n onopen: () => void;\n onerror: (error: any) => void;\n onclose: (closeEvent: any) => void;\n onmessage: (message: any) => void;\n onactivity: () => void;\n\n constructor(hooks: SocketHooks, url: string) {\n this.hooks = hooks;\n this.session = randomNumber(1000) + '/' + randomString(8);\n this.location = getLocation(url);\n this.readyState = State.CONNECTING;\n this.openStream();\n }\n\n send(payload: any) {\n return this.sendRaw(JSON.stringify([payload]));\n }\n\n ping() {\n this.hooks.sendHeartbeat(this);\n }\n\n close(code: any, reason: any) {\n this.onClose(code, reason, true);\n }\n\n /** For internal use only */\n sendRaw(payload: any): boolean {\n if (this.readyState === State.OPEN) {\n try {\n Runtime.createSocketRequest(\n 'POST',\n getUniqueURL(getSendURL(this.location, this.session))\n ).start(payload);\n return true;\n } catch (e) {\n return false;\n }\n } else {\n return false;\n }\n }\n\n /** For internal use only */\n reconnect() {\n this.closeStream();\n this.openStream();\n }\n\n /** For internal use only */\n onClose(code, reason, wasClean) {\n this.closeStream();\n this.readyState = State.CLOSED;\n if (this.onclose) {\n this.onclose({\n code: code,\n reason: reason,\n wasClean: wasClean\n });\n }\n }\n\n private onChunk(chunk) {\n if (chunk.status !== 200) {\n return;\n }\n if (this.readyState === State.OPEN) {\n this.onActivity();\n }\n\n var payload;\n var type = chunk.data.slice(0, 1);\n switch (type) {\n case 'o':\n payload = JSON.parse(chunk.data.slice(1) || '{}');\n this.onOpen(payload);\n break;\n case 'a':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n for (var i = 0; i < payload.length; i++) {\n this.onEvent(payload[i]);\n }\n break;\n case 'm':\n payload = JSON.parse(chunk.data.slice(1) || 'null');\n this.onEvent(payload);\n break;\n case 'h':\n this.hooks.onHeartbeat(this);\n break;\n case 'c':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n this.onClose(payload[0], payload[1], true);\n break;\n }\n }\n\n private onOpen(options) {\n if (this.readyState === State.CONNECTING) {\n if (options && options.hostname) {\n this.location.base = replaceHost(this.location.base, options.hostname);\n }\n this.readyState = State.OPEN;\n\n if (this.onopen) {\n this.onopen();\n }\n } else {\n this.onClose(1006, 'Server lost session', true);\n }\n }\n\n private onEvent(event) {\n if (this.readyState === State.OPEN && this.onmessage) {\n this.onmessage({ data: event });\n }\n }\n\n private onActivity() {\n if (this.onactivity) {\n this.onactivity();\n }\n }\n\n private onError(error) {\n if (this.onerror) {\n this.onerror(error);\n }\n }\n\n private openStream() {\n this.stream = Runtime.createSocketRequest(\n 'POST',\n getUniqueURL(this.hooks.getReceiveURL(this.location, this.session))\n );\n\n this.stream.bind('chunk', chunk => {\n this.onChunk(chunk);\n });\n this.stream.bind('finished', status => {\n this.hooks.onFinished(this, status);\n });\n this.stream.bind('buffer_too_long', () => {\n this.reconnect();\n });\n\n try {\n this.stream.start();\n } catch (error) {\n Util.defer(() => {\n this.onError(error);\n this.onClose(1006, 'Could not start streaming', false);\n });\n }\n }\n\n private closeStream() {\n if (this.stream) {\n this.stream.unbind_all();\n this.stream.close();\n this.stream = null;\n }\n }\n}\n\nfunction getLocation(url): URLLocation {\n var parts = /([^\\?]*)\\/*(\\??.*)/.exec(url);\n return {\n base: parts[1],\n queryString: parts[2]\n };\n}\n\nfunction getSendURL(url: URLLocation, session: string): string {\n return url.base + '/' + session + '/xhr_send';\n}\n\nfunction getUniqueURL(url: string): string {\n var separator = url.indexOf('?') === -1 ? '?' : '&';\n return url + separator + 't=' + +new Date() + '&n=' + autoIncrement++;\n}\n\nfunction replaceHost(url: string, hostname: string): string {\n var urlParts = /(https?:\\/\\/)([^\\/:]+)((\\/|:)?.*)/.exec(url);\n return urlParts[1] + hostname + urlParts[3];\n}\n\nfunction randomNumber(max: number): number {\n return Runtime.randomInt(max);\n}\n\nfunction randomString(length: number): string {\n var result = [];\n\n for (var i = 0; i < length; i++) {\n result.push(randomNumber(32).toString(32));\n }\n\n return result.join('');\n}\n\nexport default HTTPSocket;\n","enum TimelineLevel {\n ERROR = 3,\n INFO = 6,\n DEBUG = 7\n}\n\nexport default TimelineLevel;\n","import SocketHooks from './socket_hooks';\nimport HTTPSocket from './http_socket';\n\nvar hooks: SocketHooks = {\n getReceiveURL: function(url, session) {\n return url.base + '/' + session + '/xhr_streaming' + url.queryString;\n },\n onHeartbeat: function(socket) {\n socket.sendRaw('[]');\n },\n sendHeartbeat: function(socket) {\n socket.sendRaw('[]');\n },\n onFinished: function(socket, status) {\n socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n }\n};\n\nexport default hooks;\n","import SocketHooks from './socket_hooks';\nimport URLLocation from './url_location';\nimport HTTPSocket from './http_socket';\n\nvar hooks: SocketHooks = {\n getReceiveURL: function(url: URLLocation, session: string): string {\n return url.base + '/' + session + '/xhr' + url.queryString;\n },\n onHeartbeat: function() {\n // next HTTP request will reset server's activity timer\n },\n sendHeartbeat: function(socket) {\n socket.sendRaw('[]');\n },\n onFinished: function(socket, status) {\n if (status === 200) {\n socket.reconnect();\n } else {\n socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n }\n }\n};\n\nexport default hooks;\n","import HTTPRequest from 'core/http/http_request';\nimport RequestHooks from 'core/http/request_hooks';\nimport Ajax from 'core/http/ajax';\nimport Runtime from 'runtime';\n\nvar hooks: RequestHooks = {\n getRequest: function(socket: HTTPRequest): Ajax {\n var Constructor = Runtime.getXHRAPI();\n var xhr = new Constructor();\n xhr.onreadystatechange = xhr.onprogress = function() {\n switch (xhr.readyState) {\n case 3:\n if (xhr.responseText && xhr.responseText.length > 0) {\n socket.onChunk(xhr.status, xhr.responseText);\n }\n break;\n case 4:\n // this happens only on errors, never after calling close\n if (xhr.responseText && xhr.responseText.length > 0) {\n socket.onChunk(xhr.status, xhr.responseText);\n }\n socket.emit('finished', xhr.status);\n socket.close();\n break;\n }\n };\n return xhr;\n },\n abortRequest: function(xhr: Ajax) {\n xhr.onreadystatechange = null;\n xhr.abort();\n }\n};\n\nexport default hooks;\n","import Browser from './browser';\nimport { Dependencies, DependenciesReceivers } from './dom/dependencies';\nimport { AuthTransport, AuthTransports } from 'core/auth/auth_transports';\nimport xhrAuth from 'isomorphic/auth/xhr_auth';\nimport jsonpAuth from './auth/jsonp_auth';\nimport TimelineTransport from 'core/timeline/timeline_transport';\nimport TimelineSender from 'core/timeline/timeline_sender';\nimport ScriptRequest from './dom/script_request';\nimport JSONPRequest from './dom/jsonp_request';\nimport * as Collections from 'core/utils/collections';\nimport { ScriptReceivers } from './dom/script_receiver_factory';\nimport jsonpTimeline from './timeline/jsonp_timeline';\nimport Transports from './transports/transports';\nimport Ajax from 'core/http/ajax';\nimport { Network } from './net_info';\nimport getDefaultStrategy from './default_strategy';\nimport transportConnectionInitializer from './transports/transport_connection_initializer';\nimport HTTPFactory from './http/http';\nimport HTTPRequest from 'core/http/http_request';\n\nvar Runtime: Browser = {\n // for jsonp auth\n nextAuthCallbackID: 1,\n auth_callbacks: {},\n ScriptReceivers,\n DependenciesReceivers,\n getDefaultStrategy,\n Transports,\n transportConnectionInitializer,\n HTTPFactory,\n\n TimelineTransport: jsonpTimeline,\n\n getXHRAPI() {\n return window.XMLHttpRequest;\n },\n\n getWebSocketAPI() {\n return window.WebSocket || window.MozWebSocket;\n },\n\n setup(PusherClass): void {\n (window).Pusher = PusherClass; // JSONp requires Pusher to be in the global scope.\n var initializeOnDocumentBody = () => {\n this.onDocumentBody(PusherClass.ready);\n };\n if (!(window).JSON) {\n Dependencies.load('json2', {}, initializeOnDocumentBody);\n } else {\n initializeOnDocumentBody();\n }\n },\n\n getDocument(): Document {\n return document;\n },\n\n getProtocol(): string {\n return this.getDocument().location.protocol;\n },\n\n getAuthorizers(): AuthTransports {\n return { ajax: xhrAuth, jsonp: jsonpAuth };\n },\n\n onDocumentBody(callback: Function) {\n if (document.body) {\n callback();\n } else {\n setTimeout(() => {\n this.onDocumentBody(callback);\n }, 0);\n }\n },\n\n createJSONPRequest(url: string, data: any): JSONPRequest {\n return new JSONPRequest(url, data);\n },\n\n createScriptRequest(src: string): ScriptRequest {\n return new ScriptRequest(src);\n },\n\n getLocalStorage() {\n try {\n return window.localStorage;\n } catch (e) {\n return undefined;\n }\n },\n\n createXHR(): Ajax {\n if (this.getXHRAPI()) {\n return this.createXMLHttpRequest();\n } else {\n return this.createMicrosoftXHR();\n }\n },\n\n createXMLHttpRequest(): Ajax {\n var Constructor = this.getXHRAPI();\n return new Constructor();\n },\n\n createMicrosoftXHR(): Ajax {\n return new ActiveXObject('Microsoft.XMLHTTP');\n },\n\n getNetwork() {\n return Network;\n },\n\n createWebSocket(url: string): any {\n var Constructor = this.getWebSocketAPI();\n return new Constructor(url);\n },\n\n createSocketRequest(method: string, url: string): HTTPRequest {\n if (this.isXHRSupported()) {\n return this.HTTPFactory.createXHR(method, url);\n } else if (this.isXDRSupported(url.indexOf('https:') === 0)) {\n return this.HTTPFactory.createXDR(method, url);\n } else {\n throw 'Cross-origin HTTP requests are not supported';\n }\n },\n\n isXHRSupported(): boolean {\n var Constructor = this.getXHRAPI();\n return (\n Boolean(Constructor) && new Constructor().withCredentials !== undefined\n );\n },\n\n isXDRSupported(useTLS?: boolean): boolean {\n var protocol = useTLS ? 'https:' : 'http:';\n var documentProtocol = this.getProtocol();\n return (\n Boolean(window['XDomainRequest']) && documentProtocol === protocol\n );\n },\n\n addUnloadListener(listener: any) {\n if (window.addEventListener !== undefined) {\n window.addEventListener('unload', listener, false);\n } else if (window.attachEvent !== undefined) {\n window.attachEvent('onunload', listener);\n }\n },\n\n removeUnloadListener(listener: any) {\n if (window.addEventListener !== undefined) {\n window.removeEventListener('unload', listener, false);\n } else if (window.detachEvent !== undefined) {\n window.detachEvent('onunload', listener);\n }\n },\n\n randomInt(max: number): number {\n /**\n * Return values in the range of [0, 1[\n */\n const random = function() {\n const crypto = window.crypto || window['msCrypto'];\n const random = crypto.getRandomValues(new Uint32Array(1))[0];\n\n return random / 2 ** 32;\n };\n\n return Math.floor(random() * max);\n }\n};\n\nexport default Runtime;\n","import { Dependencies } from '../dom/dependencies';\n\n/** Initializes the transport.\n *\n * Fetches resources if needed and then transitions to initialized.\n */\nexport default function() {\n var self = this;\n\n self.timeline.info(\n self.buildTimelineMessage({\n transport: self.name + (self.options.useTLS ? 's' : '')\n })\n );\n\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n } else if (self.hooks.file) {\n self.changeState('initializing');\n Dependencies.load(\n self.hooks.file,\n { useTLS: self.options.useTLS },\n function(error, callback) {\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n callback(true);\n } else {\n if (error) {\n self.onError(error);\n }\n self.onClose();\n callback(false);\n }\n }\n );\n } else {\n self.onClose();\n }\n}\n","import HTTPRequest from 'core/http/http_request';\nimport HTTPSocket from 'core/http/http_socket';\nimport SocketHooks from 'core/http/socket_hooks';\nimport RequestHooks from 'core/http/request_hooks';\nimport streamingHooks from 'core/http/http_streaming_socket';\nimport pollingHooks from 'core/http/http_polling_socket';\nimport xhrHooks from './http_xhr_request';\nimport HTTPFactory from 'core/http/http_factory';\n\nvar HTTP: HTTPFactory = {\n createStreamingSocket(url: string): HTTPSocket {\n return this.createSocket(streamingHooks, url);\n },\n\n createPollingSocket(url: string): HTTPSocket {\n return this.createSocket(pollingHooks, url);\n },\n\n createSocket(hooks: SocketHooks, url: string): HTTPSocket {\n return new HTTPSocket(hooks, url);\n },\n\n createXHR(method: string, url: string): HTTPRequest {\n return this.createRequest(xhrHooks, method, url);\n },\n\n createRequest(hooks: RequestHooks, method: string, url: string): HTTPRequest {\n return new HTTPRequest(hooks, method, url);\n }\n};\n\nexport default HTTP;\n","import xdrHooks from './http_xdomain_request';\nimport HTTP from 'isomorphic/http/http';\n\nHTTP.createXDR = function(method, url) {\n return this.createRequest(xdrHooks, method, url);\n};\n\nexport default HTTP;\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport { default as Level } from './level';\n\nexport interface TimelineOptions {\n level?: Level;\n limit?: number;\n version?: string;\n cluster?: string;\n features?: string[];\n params?: any;\n}\n\nexport default class Timeline {\n key: string;\n session: number;\n events: any[];\n options: TimelineOptions;\n sent: number;\n uniqueID: number;\n\n constructor(key: string, session: number, options: TimelineOptions) {\n this.key = key;\n this.session = session;\n this.events = [];\n this.options = options || {};\n this.sent = 0;\n this.uniqueID = 0;\n }\n\n log(level, event) {\n if (level <= this.options.level) {\n this.events.push(\n Collections.extend({}, event, { timestamp: Util.now() })\n );\n if (this.options.limit && this.events.length > this.options.limit) {\n this.events.shift();\n }\n }\n }\n\n error(event) {\n this.log(Level.ERROR, event);\n }\n\n info(event) {\n this.log(Level.INFO, event);\n }\n\n debug(event) {\n this.log(Level.DEBUG, event);\n }\n\n isEmpty() {\n return this.events.length === 0;\n }\n\n send(sendfn, callback) {\n var data = Collections.extend(\n {\n session: this.session,\n bundle: this.sent + 1,\n key: this.key,\n lib: 'js',\n version: this.options.version,\n cluster: this.options.cluster,\n features: this.options.features,\n timeline: this.events\n },\n this.options.params\n );\n\n this.events = [];\n sendfn(data, (error, result) => {\n if (!error) {\n this.sent++;\n }\n if (callback) {\n callback(error, result);\n }\n });\n\n return true;\n }\n\n generateUniqueID(): number {\n this.uniqueID++;\n return this.uniqueID;\n }\n}\n","import Factory from '../utils/factory';\nimport Util from '../util';\nimport * as Errors from '../errors';\nimport * as Collections from '../utils/collections';\nimport Strategy from './strategy';\nimport Transport from '../transports/transport';\nimport StrategyOptions from './strategy_options';\nimport Handshake from '../connection/handshake';\n\n/** Provides a strategy interface for transports.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {Class} transport\n * @param {Object} options\n */\nexport default class TransportStrategy implements Strategy {\n name: string;\n priority: number;\n transport: Transport;\n options: StrategyOptions;\n\n constructor(\n name: string,\n priority: number,\n transport: Transport,\n options: StrategyOptions\n ) {\n this.name = name;\n this.priority = priority;\n this.transport = transport;\n this.options = options || {};\n }\n\n /** Returns whether the transport is supported in the browser.\n *\n * @returns {Boolean}\n */\n isSupported(): boolean {\n return this.transport.isSupported({\n useTLS: this.options.useTLS\n });\n }\n\n /** Launches a connection attempt and returns a strategy runner.\n *\n * @param {Function} callback\n * @return {Object} strategy runner\n */\n connect(minPriority: number, callback: Function) {\n if (!this.isSupported()) {\n return failAttempt(new Errors.UnsupportedStrategy(), callback);\n } else if (this.priority < minPriority) {\n return failAttempt(new Errors.TransportPriorityTooLow(), callback);\n }\n\n var connected = false;\n var transport = this.transport.createConnection(\n this.name,\n this.priority,\n this.options.key,\n this.options\n );\n var handshake = null;\n\n var onInitialized = function() {\n transport.unbind('initialized', onInitialized);\n transport.connect();\n };\n var onOpen = function() {\n handshake = Factory.createHandshake(transport, function(result) {\n connected = true;\n unbindListeners();\n callback(null, result);\n });\n };\n var onError = function(error) {\n unbindListeners();\n callback(error);\n };\n var onClosed = function() {\n unbindListeners();\n var serializedTransport;\n\n // The reason for this try/catch block is that on React Native\n // the WebSocket object is circular. Therefore transport.socket will\n // throw errors upon stringification. Collections.safeJSONStringify\n // discards circular references when serializing.\n serializedTransport = Collections.safeJSONStringify(transport);\n callback(new Errors.TransportClosed(serializedTransport));\n };\n\n var unbindListeners = function() {\n transport.unbind('initialized', onInitialized);\n transport.unbind('open', onOpen);\n transport.unbind('error', onError);\n transport.unbind('closed', onClosed);\n };\n\n transport.bind('initialized', onInitialized);\n transport.bind('open', onOpen);\n transport.bind('error', onError);\n transport.bind('closed', onClosed);\n\n // connect will be called automatically after initialization\n transport.initialize();\n\n return {\n abort: () => {\n if (connected) {\n return;\n }\n unbindListeners();\n if (handshake) {\n handshake.close();\n } else {\n transport.close();\n }\n },\n forceMinPriority: p => {\n if (connected) {\n return;\n }\n if (this.priority < p) {\n if (handshake) {\n handshake.close();\n } else {\n transport.close();\n }\n }\n }\n };\n }\n}\n\nfunction failAttempt(error: Error, callback: Function) {\n Util.defer(function() {\n callback(error);\n });\n return {\n abort: function() {},\n forceMinPriority: function() {}\n };\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport TransportManager from '../transports/transport_manager';\nimport * as Errors from '../errors';\nimport Strategy from './strategy';\nimport TransportStrategy from './transport_strategy';\nimport StrategyOptions from '../strategies/strategy_options';\nimport { Config } from '../config';\nimport Runtime from 'runtime';\n\nconst { Transports } = Runtime;\n\nexport var defineTransport = function(\n config: Config,\n name: string,\n type: string,\n priority: number,\n options: StrategyOptions,\n manager?: TransportManager\n): Strategy {\n var transportClass = Transports[type];\n if (!transportClass) {\n throw new Errors.UnsupportedTransport(type);\n }\n\n var enabled =\n (!config.enabledTransports ||\n Collections.arrayIndexOf(config.enabledTransports, name) !== -1) &&\n (!config.disabledTransports ||\n Collections.arrayIndexOf(config.disabledTransports, name) === -1);\n\n var transport;\n if (enabled) {\n options = Object.assign(\n { ignoreNullOrigin: config.ignoreNullOrigin },\n options\n );\n\n transport = new TransportStrategy(\n name,\n priority,\n manager ? manager.getAssistant(transportClass) : transportClass,\n options\n );\n } else {\n transport = UnsupportedStrategy;\n }\n\n return transport;\n};\n\nvar UnsupportedStrategy: Strategy = {\n isSupported: function() {\n return false;\n },\n connect: function(_, callback) {\n var deferred = Util.defer(function() {\n callback(new Errors.UnsupportedStrategy());\n });\n return {\n abort: function() {\n deferred.ensureAborted();\n },\n forceMinPriority: function() {}\n };\n }\n};\n","import { Options } from './options';\nimport Defaults from './defaults';\nimport {\n ChannelAuthorizationHandler,\n UserAuthenticationHandler,\n ChannelAuthorizationOptions\n} from './auth/options';\nimport UserAuthenticator from './auth/user_authenticator';\nimport ChannelAuthorizer from './auth/channel_authorizer';\nimport { ChannelAuthorizerProxy } from './auth/deprecated_channel_authorizer';\nimport Runtime from 'runtime';\nimport * as nacl from 'tweetnacl';\nimport Logger from './logger';\n\nexport type AuthTransport = 'ajax' | 'jsonp';\nexport type Transport =\n | 'ws'\n | 'wss'\n | 'xhr_streaming'\n | 'xhr_polling'\n | 'sockjs';\n\nexport interface Config {\n // these are all 'required' config parameters, it's not necessary for the user\n // to set them, but they have configured defaults.\n activityTimeout: number;\n enableStats: boolean;\n httpHost: string;\n httpPath: string;\n httpPort: number;\n httpsPort: number;\n pongTimeout: number;\n statsHost: string;\n unavailableTimeout: number;\n useTLS: boolean;\n wsHost: string;\n wsPath: string;\n wsPort: number;\n wssPort: number;\n userAuthenticator: UserAuthenticationHandler;\n channelAuthorizer: ChannelAuthorizationHandler;\n\n // these are all optional parameters or overrrides. The customer can set these\n // but it's not strictly necessary\n forceTLS?: boolean;\n cluster?: string;\n disabledTransports?: Transport[];\n enabledTransports?: Transport[];\n ignoreNullOrigin?: boolean;\n nacl?: nacl;\n timelineParams?: any;\n}\n\n// getConfig mainly sets the defaults for the options that are not provided\nexport function getConfig(opts: Options, pusher): Config {\n let config: Config = {\n activityTimeout: opts.activityTimeout || Defaults.activityTimeout,\n cluster: opts.cluster || Defaults.cluster,\n httpPath: opts.httpPath || Defaults.httpPath,\n httpPort: opts.httpPort || Defaults.httpPort,\n httpsPort: opts.httpsPort || Defaults.httpsPort,\n pongTimeout: opts.pongTimeout || Defaults.pongTimeout,\n statsHost: opts.statsHost || Defaults.stats_host,\n unavailableTimeout: opts.unavailableTimeout || Defaults.unavailableTimeout,\n wsPath: opts.wsPath || Defaults.wsPath,\n wsPort: opts.wsPort || Defaults.wsPort,\n wssPort: opts.wssPort || Defaults.wssPort,\n\n enableStats: getEnableStatsConfig(opts),\n httpHost: getHttpHost(opts),\n useTLS: shouldUseTLS(opts),\n wsHost: getWebsocketHost(opts),\n\n userAuthenticator: buildUserAuthenticator(opts),\n channelAuthorizer: buildChannelAuthorizer(opts, pusher)\n };\n\n if ('disabledTransports' in opts)\n config.disabledTransports = opts.disabledTransports;\n if ('enabledTransports' in opts)\n config.enabledTransports = opts.enabledTransports;\n if ('ignoreNullOrigin' in opts)\n config.ignoreNullOrigin = opts.ignoreNullOrigin;\n if ('timelineParams' in opts) config.timelineParams = opts.timelineParams;\n if ('nacl' in opts) {\n config.nacl = opts.nacl;\n }\n\n return config;\n}\n\nfunction getHttpHost(opts: Options): string {\n if (opts.httpHost) {\n return opts.httpHost;\n }\n if (opts.cluster) {\n return `sockjs-${opts.cluster}.pusher.com`;\n }\n return Defaults.httpHost;\n}\n\nfunction getWebsocketHost(opts: Options): string {\n if (opts.wsHost) {\n return opts.wsHost;\n }\n if (opts.cluster) {\n return getWebsocketHostFromCluster(opts.cluster);\n }\n return getWebsocketHostFromCluster(Defaults.cluster);\n}\n\nfunction getWebsocketHostFromCluster(cluster: string): string {\n return `ws-${cluster}.pusher.com`;\n}\n\nfunction shouldUseTLS(opts: Options): boolean {\n if (Runtime.getProtocol() === 'https:') {\n return true;\n } else if (opts.forceTLS === false) {\n return false;\n }\n return true;\n}\n\n// if enableStats is set take the value\n// if disableStats is set take the inverse\n// otherwise default to false\nfunction getEnableStatsConfig(opts: Options): boolean {\n if ('enableStats' in opts) {\n return opts.enableStats;\n }\n if ('disableStats' in opts) {\n return !opts.disableStats;\n }\n return false;\n}\n\nfunction buildUserAuthenticator(opts: Options): UserAuthenticationHandler {\n const userAuthentication = {\n ...Defaults.userAuthentication,\n ...opts.userAuthentication\n };\n if (\n 'customHandler' in userAuthentication &&\n userAuthentication['customHandler'] != null\n ) {\n return userAuthentication['customHandler'];\n }\n\n return UserAuthenticator(userAuthentication);\n}\n\nfunction buildChannelAuth(opts: Options, pusher): ChannelAuthorizationOptions {\n let channelAuthorization: ChannelAuthorizationOptions;\n if ('channelAuthorization' in opts) {\n channelAuthorization = {\n ...Defaults.channelAuthorization,\n ...opts.channelAuthorization\n };\n } else {\n channelAuthorization = {\n transport: opts.authTransport || Defaults.authTransport,\n endpoint: opts.authEndpoint || Defaults.authEndpoint\n };\n if ('auth' in opts) {\n if ('params' in opts.auth) channelAuthorization.params = opts.auth.params;\n if ('headers' in opts.auth)\n channelAuthorization.headers = opts.auth.headers;\n }\n if ('authorizer' in opts)\n channelAuthorization.customHandler = ChannelAuthorizerProxy(\n pusher,\n channelAuthorization,\n opts.authorizer\n );\n }\n return channelAuthorization;\n}\n\nfunction buildChannelAuthorizer(\n opts: Options,\n pusher\n): ChannelAuthorizationHandler {\n const channelAuthorization = buildChannelAuth(opts, pusher);\n if (\n 'customHandler' in channelAuthorization &&\n channelAuthorization['customHandler'] != null\n ) {\n return channelAuthorization['customHandler'];\n }\n\n return ChannelAuthorizer(channelAuthorization);\n}\n","import {\n UserAuthenticationCallback,\n InternalAuthOptions,\n UserAuthenticationHandler,\n UserAuthenticationRequestParams,\n AuthRequestType\n} from './options';\n\nimport Runtime from 'runtime';\n\nconst composeChannelQuery = (\n params: UserAuthenticationRequestParams,\n authOptions: InternalAuthOptions\n) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n\n return query;\n};\n\nconst UserAuthenticator = (\n authOptions: InternalAuthOptions\n): UserAuthenticationHandler => {\n if (typeof Runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n\n return (\n params: UserAuthenticationRequestParams,\n callback: UserAuthenticationCallback\n ) => {\n const query = composeChannelQuery(params, authOptions);\n\n Runtime.getAuthorizers()[authOptions.transport](\n Runtime,\n query,\n authOptions,\n AuthRequestType.UserAuthentication,\n callback\n );\n };\n};\n\nexport default UserAuthenticator;\n","import Channel from '../channels/channel';\nimport {\n ChannelAuthorizationCallback,\n ChannelAuthorizationHandler,\n ChannelAuthorizationRequestParams,\n InternalAuthOptions\n} from './options';\n\nexport interface DeprecatedChannelAuthorizer {\n authorize(socketId: string, callback: ChannelAuthorizationCallback): void;\n}\n\nexport interface ChannelAuthorizerGenerator {\n (\n channel: Channel,\n options: DeprecatedAuthorizerOptions\n ): DeprecatedChannelAuthorizer;\n}\n\nexport interface DeprecatedAuthOptions {\n params?: any;\n headers?: any;\n}\n\nexport interface DeprecatedAuthorizerOptions {\n authTransport: 'ajax' | 'jsonp';\n authEndpoint: string;\n auth?: DeprecatedAuthOptions;\n}\n\nexport const ChannelAuthorizerProxy = (\n pusher,\n authOptions: InternalAuthOptions,\n channelAuthorizerGenerator: ChannelAuthorizerGenerator\n): ChannelAuthorizationHandler => {\n const deprecatedAuthorizerOptions: DeprecatedAuthorizerOptions = {\n authTransport: authOptions.transport,\n authEndpoint: authOptions.endpoint,\n auth: {\n params: authOptions.params,\n headers: authOptions.headers\n }\n };\n return (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback\n ) => {\n const channel = pusher.channel(params.channelName);\n // This line creates a new channel authorizer every time.\n // In the past, this was only done once per channel and reused.\n // We can do that again if we want to keep this behavior intact.\n const channelAuthorizer: DeprecatedChannelAuthorizer = channelAuthorizerGenerator(\n channel,\n deprecatedAuthorizerOptions\n );\n channelAuthorizer.authorize(params.socketId, callback);\n };\n};\n","import {\n AuthRequestType,\n InternalAuthOptions,\n ChannelAuthorizationHandler,\n ChannelAuthorizationRequestParams,\n ChannelAuthorizationCallback\n} from './options';\n\nimport Runtime from 'runtime';\n\nconst composeChannelQuery = (\n params: ChannelAuthorizationRequestParams,\n authOptions: InternalAuthOptions\n) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n\n query += '&channel_name=' + encodeURIComponent(params.channelName);\n\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n\n return query;\n};\n\nconst ChannelAuthorizer = (\n authOptions: InternalAuthOptions\n): ChannelAuthorizationHandler => {\n if (typeof Runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n\n return (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback\n ) => {\n const query = composeChannelQuery(params, authOptions);\n\n Runtime.getAuthorizers()[authOptions.transport](\n Runtime,\n query,\n authOptions,\n AuthRequestType.ChannelAuthorization,\n callback\n );\n };\n};\n\nexport default ChannelAuthorizer;\n","import Logger from './logger';\nimport Pusher from './pusher';\nimport EventsDispatcher from './events/dispatcher';\n\nexport default class WatchlistFacade extends EventsDispatcher {\n private pusher: Pusher;\n\n public constructor(pusher: Pusher) {\n super(function(eventName, data) {\n Logger.debug(`No callbacks on watchlist events for ${eventName}`);\n });\n\n this.pusher = pusher;\n this.bindWatchlistInternalEvent();\n }\n\n handleEvent(pusherEvent) {\n pusherEvent.data.events.forEach(watchlistEvent => {\n this.emit(watchlistEvent.name, watchlistEvent);\n });\n }\n\n private bindWatchlistInternalEvent() {\n this.pusher.connection.bind('message', pusherEvent => {\n var eventName = pusherEvent.event;\n if (eventName === 'pusher_internal:watchlist_events') {\n this.handleEvent(pusherEvent);\n }\n });\n }\n}\n","import Pusher from './pusher';\nimport Logger from './logger';\nimport {\n UserAuthenticationData,\n UserAuthenticationCallback\n} from './auth/options';\nimport Channel from './channels/channel';\nimport WatchlistFacade from './watchlist';\nimport EventsDispatcher from './events/dispatcher';\nimport flatPromise from './utils/flat_promise';\n\nexport default class UserFacade extends EventsDispatcher {\n pusher: Pusher;\n signin_requested: boolean = false;\n user_data: any = null;\n serverToUserChannel: Channel = null;\n signinDonePromise: Promise = null;\n watchlist: WatchlistFacade;\n private _signinDoneResolve: Function = null;\n\n public constructor(pusher: Pusher) {\n super(function(eventName, data) {\n Logger.debug('No callbacks on user for ' + eventName);\n });\n this.pusher = pusher;\n this.pusher.connection.bind('state_change', ({ previous, current }) => {\n if (previous !== 'connected' && current === 'connected') {\n this._signin();\n }\n if (previous === 'connected' && current !== 'connected') {\n this._cleanup();\n this._newSigninPromiseIfNeeded();\n }\n });\n\n this.watchlist = new WatchlistFacade(pusher);\n\n this.pusher.connection.bind('message', event => {\n var eventName = event.event;\n if (eventName === 'pusher:signin_success') {\n this._onSigninSuccess(event.data);\n }\n if (\n this.serverToUserChannel &&\n this.serverToUserChannel.name === event.channel\n ) {\n this.serverToUserChannel.handleEvent(event);\n }\n });\n }\n\n public signin() {\n if (this.signin_requested) {\n return;\n }\n\n this.signin_requested = true;\n this._signin();\n }\n\n private _signin() {\n if (!this.signin_requested) {\n return;\n }\n\n this._newSigninPromiseIfNeeded();\n\n if (this.pusher.connection.state !== 'connected') {\n // Signin will be attempted when the connection is connected\n return;\n }\n\n this.pusher.config.userAuthenticator(\n {\n socketId: this.pusher.connection.socket_id\n },\n this._onAuthorize\n );\n }\n\n private _onAuthorize: UserAuthenticationCallback = (\n err,\n authData: UserAuthenticationData\n ) => {\n if (err) {\n Logger.warn(`Error during signin: ${err}`);\n this._cleanup();\n return;\n }\n\n this.pusher.send_event('pusher:signin', {\n auth: authData.auth,\n user_data: authData.user_data\n });\n\n // Later when we get pusher:singin_success event, the user will be marked as signed in\n };\n\n private _onSigninSuccess(data: any) {\n try {\n this.user_data = JSON.parse(data.user_data);\n } catch (e) {\n Logger.error(`Failed parsing user data after signin: ${data.user_data}`);\n this._cleanup();\n return;\n }\n\n if (typeof this.user_data.id !== 'string' || this.user_data.id === '') {\n Logger.error(\n `user_data doesn't contain an id. user_data: ${this.user_data}`\n );\n this._cleanup();\n return;\n }\n\n // Signin succeeded\n this._signinDoneResolve();\n this._subscribeChannels();\n }\n\n private _subscribeChannels() {\n const ensure_subscribed = channel => {\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n } else if (\n !channel.subscriptionPending &&\n this.pusher.connection.state === 'connected'\n ) {\n channel.subscribe();\n }\n };\n\n this.serverToUserChannel = new Channel(\n `#server-to-user-${this.user_data.id}`,\n this.pusher\n );\n this.serverToUserChannel.bind_global((eventName, data) => {\n if (\n eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0\n ) {\n // ignore internal events\n return;\n }\n this.emit(eventName, data);\n });\n ensure_subscribed(this.serverToUserChannel);\n }\n\n private _cleanup() {\n this.user_data = null;\n if (this.serverToUserChannel) {\n this.serverToUserChannel.unbind_all();\n this.serverToUserChannel.disconnect();\n this.serverToUserChannel = null;\n }\n\n if (this.signin_requested) {\n // If signin is in progress and cleanup is called,\n // Mark the current signin process as done.\n this._signinDoneResolve();\n }\n }\n\n private _newSigninPromiseIfNeeded() {\n if (!this.signin_requested) {\n return;\n }\n\n // If there is a promise and it is not resolved, return without creating a new one.\n if (this.signinDonePromise && !(this.signinDonePromise as any).done) {\n return;\n }\n\n // This promise is never rejected.\n // It gets resolved when the signin process is done whether it failed or succeeded\n const { promise, resolve, reject: _ } = flatPromise();\n (promise as any).done = false;\n const setDone = () => {\n (promise as any).done = true;\n };\n promise.then(setDone).catch(setDone);\n this.signinDonePromise = promise;\n this._signinDoneResolve = resolve;\n }\n}\n","function flatPromise() {\n let resolve, reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nexport default flatPromise;\n","import AbstractRuntime from '../runtimes/interface';\nimport Runtime from 'runtime';\nimport Util from './util';\nimport * as Collections from './utils/collections';\nimport Channels from './channels/channels';\nimport Channel from './channels/channel';\nimport { default as EventsDispatcher } from './events/dispatcher';\nimport Timeline from './timeline/timeline';\nimport TimelineSender from './timeline/timeline_sender';\nimport TimelineLevel from './timeline/level';\nimport { defineTransport } from './strategies/strategy_builder';\nimport ConnectionManager from './connection/connection_manager';\nimport ConnectionManagerOptions from './connection/connection_manager_options';\nimport { PeriodicTimer } from './utils/timers';\nimport Defaults from './defaults';\nimport * as DefaultConfig from './config';\nimport Logger from './logger';\nimport Factory from './utils/factory';\nimport UrlStore from 'core/utils/url_store';\nimport { Options } from './options';\nimport { Config, getConfig } from './config';\nimport StrategyOptions from './strategies/strategy_options';\nimport UserFacade from './user';\n\nexport default class Pusher {\n /* STATIC PROPERTIES */\n static instances: Pusher[] = [];\n static isReady: boolean = false;\n static logToConsole: boolean = false;\n\n // for jsonp\n static Runtime: AbstractRuntime = Runtime;\n static ScriptReceivers: any = (Runtime).ScriptReceivers;\n static DependenciesReceivers: any = (Runtime).DependenciesReceivers;\n static auth_callbacks: any = (Runtime).auth_callbacks;\n\n static ready() {\n Pusher.isReady = true;\n for (var i = 0, l = Pusher.instances.length; i < l; i++) {\n Pusher.instances[i].connect();\n }\n }\n\n static log: (message: any) => void;\n\n private static getClientFeatures(): string[] {\n return Collections.keys(\n Collections.filterObject({ ws: Runtime.Transports.ws }, function(t) {\n return t.isSupported({});\n })\n );\n }\n\n /* INSTANCE PROPERTIES */\n key: string;\n config: Config;\n channels: Channels;\n global_emitter: EventsDispatcher;\n sessionID: number;\n timeline: Timeline;\n timelineSender: TimelineSender;\n connection: ConnectionManager;\n timelineSenderTimer: PeriodicTimer;\n user: UserFacade;\n constructor(app_key: string, options?: Options) {\n checkAppKey(app_key);\n options = options || {};\n if (!options.cluster && !(options.wsHost || options.httpHost)) {\n let suffix = UrlStore.buildLogSuffix('javascriptQuickStart');\n Logger.warn(\n `You should always specify a cluster when connecting. ${suffix}`\n );\n }\n if ('disableStats' in options) {\n Logger.warn(\n 'The disableStats option is deprecated in favor of enableStats'\n );\n }\n\n this.key = app_key;\n this.config = getConfig(options, this);\n\n this.channels = Factory.createChannels();\n this.global_emitter = new EventsDispatcher();\n this.sessionID = Runtime.randomInt(1000000000);\n\n this.timeline = new Timeline(this.key, this.sessionID, {\n cluster: this.config.cluster,\n features: Pusher.getClientFeatures(),\n params: this.config.timelineParams || {},\n limit: 50,\n level: TimelineLevel.INFO,\n version: Defaults.VERSION\n });\n if (this.config.enableStats) {\n this.timelineSender = Factory.createTimelineSender(this.timeline, {\n host: this.config.statsHost,\n path: '/timeline/v2/' + Runtime.TimelineTransport.name\n });\n }\n\n var getStrategy = (options: StrategyOptions) => {\n return Runtime.getDefaultStrategy(this.config, options, defineTransport);\n };\n\n this.connection = Factory.createConnectionManager(this.key, {\n getStrategy: getStrategy,\n timeline: this.timeline,\n activityTimeout: this.config.activityTimeout,\n pongTimeout: this.config.pongTimeout,\n unavailableTimeout: this.config.unavailableTimeout,\n useTLS: Boolean(this.config.useTLS)\n });\n\n this.connection.bind('connected', () => {\n this.subscribeAll();\n if (this.timelineSender) {\n this.timelineSender.send(this.connection.isUsingTLS());\n }\n });\n\n this.connection.bind('message', event => {\n var eventName = event.event;\n var internal = eventName.indexOf('pusher_internal:') === 0;\n if (event.channel) {\n var channel = this.channel(event.channel);\n if (channel) {\n channel.handleEvent(event);\n }\n }\n // Emit globally [deprecated]\n if (!internal) {\n this.global_emitter.emit(event.event, event.data);\n }\n });\n this.connection.bind('connecting', () => {\n this.channels.disconnect();\n });\n this.connection.bind('disconnected', () => {\n this.channels.disconnect();\n });\n this.connection.bind('error', err => {\n Logger.warn(err);\n });\n\n Pusher.instances.push(this);\n this.timeline.info({ instances: Pusher.instances.length });\n\n this.user = new UserFacade(this);\n\n if (Pusher.isReady) {\n this.connect();\n }\n }\n\n channel(name: string): Channel {\n return this.channels.find(name);\n }\n\n allChannels(): Channel[] {\n return this.channels.all();\n }\n\n connect() {\n this.connection.connect();\n\n if (this.timelineSender) {\n if (!this.timelineSenderTimer) {\n var usingTLS = this.connection.isUsingTLS();\n var timelineSender = this.timelineSender;\n this.timelineSenderTimer = new PeriodicTimer(60000, function() {\n timelineSender.send(usingTLS);\n });\n }\n }\n }\n\n disconnect() {\n this.connection.disconnect();\n\n if (this.timelineSenderTimer) {\n this.timelineSenderTimer.ensureAborted();\n this.timelineSenderTimer = null;\n }\n }\n\n bind(event_name: string, callback: Function, context?: any): Pusher {\n this.global_emitter.bind(event_name, callback, context);\n return this;\n }\n\n unbind(event_name?: string, callback?: Function, context?: any): Pusher {\n this.global_emitter.unbind(event_name, callback, context);\n return this;\n }\n\n bind_global(callback: Function): Pusher {\n this.global_emitter.bind_global(callback);\n return this;\n }\n\n unbind_global(callback?: Function): Pusher {\n this.global_emitter.unbind_global(callback);\n return this;\n }\n\n unbind_all(callback?: Function): Pusher {\n this.global_emitter.unbind_all();\n return this;\n }\n\n subscribeAll() {\n var channelName;\n for (channelName in this.channels.channels) {\n if (this.channels.channels.hasOwnProperty(channelName)) {\n this.subscribe(channelName);\n }\n }\n }\n\n subscribe(channel_name: string) {\n var channel = this.channels.add(channel_name, this);\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n } else if (\n !channel.subscriptionPending &&\n this.connection.state === 'connected'\n ) {\n channel.subscribe();\n }\n return channel;\n }\n\n unsubscribe(channel_name: string) {\n var channel = this.channels.find(channel_name);\n if (channel && channel.subscriptionPending) {\n channel.cancelSubscription();\n } else {\n channel = this.channels.remove(channel_name);\n if (channel && channel.subscribed) {\n channel.unsubscribe();\n }\n }\n }\n\n send_event(event_name: string, data: any, channel?: string) {\n return this.connection.send_event(event_name, data, channel);\n }\n\n shouldUseTLS(): boolean {\n return this.config.useTLS;\n }\n\n signin() {\n this.user.signin();\n }\n}\n\nfunction checkAppKey(key) {\n if (key === null || key === undefined) {\n throw 'You must pass your app key when you instantiate Pusher.';\n }\n}\n\nRuntime.setup(Pusher);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\tflarum.reg._webpack_runtimes[\"flarum-realtime\"] ||= __webpack_require__;// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/app');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extend');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Application');","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\n/**\n * Singleton that tracks realtime channel state and holds registrations from\n * extensions. It decouples the channel setup timing (which happens during\n * Application.mount) from extender registration (which happens at boot, before\n * mount).\n *\n * Extensions interact with this indirectly via the Realtime JS extender.\n * Internal realtime code calls the `notify*` methods once channels are ready.\n */\nclass RealtimeState {\n constructor() {\n _defineProperty(this, \"userChannelCallbacks\", []);\n _defineProperty(this, \"publicChannelCallbacks\", []);\n _defineProperty(this, \"discussionStreamEventNames\", new Set());\n _defineProperty(this, \"userChannel\", null);\n _defineProperty(this, \"publicChannel\", null);\n }\n // ---------------------------------------------------------------------------\n // Registration (called by extensions via the Realtime extender)\n // ---------------------------------------------------------------------------\n\n /**\n * Register event names that should trigger a DiscussionPage stream reload.\n * Called by the Realtime extender on behalf of other extensions.\n */\n registerDiscussionStreamEvents(eventNames) {\n for (const name of eventNames) {\n this.discussionStreamEventNames.add(name);\n }\n }\n\n /**\n * Run `callback` once the user private channel is ready, or immediately if\n * it is already established.\n */\n onUserChannelReady(callback) {\n if (this.userChannel) {\n callback(this.userChannel);\n } else {\n this.userChannelCallbacks.push(callback);\n }\n }\n\n /**\n * Run `callback` once the public channel is ready, or immediately if it is\n * already established.\n */\n onPublicChannelReady(callback) {\n if (this.publicChannel) {\n callback(this.publicChannel);\n } else {\n this.publicChannelCallbacks.push(callback);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Getters (called by internal realtime components)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns all discussion stream event names registered by extensions.\n * Used by Discussion/NewActivity to know which events to bind.\n */\n getDiscussionStreamEventNames() {\n return Array.from(this.discussionStreamEventNames);\n }\n\n // ---------------------------------------------------------------------------\n // Notification (called by Application.ts once channels are subscribed)\n // ---------------------------------------------------------------------------\n\n /**\n * Called by Application.ts once the user private channel is subscribed.\n * Flushes any pending callbacks.\n */\n notifyUserChannelReady(channel) {\n this.userChannel = channel;\n for (const cb of this.userChannelCallbacks) {\n cb(channel);\n }\n this.userChannelCallbacks = [];\n }\n\n /**\n * Called by Application.ts once the public channel is subscribed.\n * Flushes any pending callbacks.\n */\n notifyPublicChannelReady(channel) {\n this.publicChannel = channel;\n for (const cb of this.publicChannelCallbacks) {\n cb(channel);\n }\n this.publicChannelCallbacks = [];\n }\n}\nexport default new RealtimeState();","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Component');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/NotificationType');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/models/Discussion');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Link');","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport NotificationType from 'flarum/forum/components/NotificationType';\nimport Discussion from 'flarum/common/models/Discussion';\nimport Link from 'flarum/common/components/Link';\nfunction toastDiscussion(notification) {\n const subject = notification.subject();\n if (!subject) return null;\n if (subject instanceof Discussion) return subject;\n if (typeof subject.discussion === 'function') {\n var _discussion;\n return (_discussion = subject.discussion()) != null ? _discussion : null;\n }\n return null;\n}\n\n/**\n * Renders the stack of realtime notification toasts in the top-right corner.\n * Each toast wraps the standard NotificationType component (same as the dropdown),\n * with the related discussion title shown as context above it.\n */\nexport default class NotificationToast extends Component {\n view() {\n const toasts = this.attrs.state.all();\n if (!toasts.length) return null;\n return m(\"div\", {\n className: \"NotificationToasts\",\n \"aria-live\": \"polite\",\n \"aria-label\": app.translator.trans('core.forum.notifications.title')\n }, toasts.map(entry => {\n const discussion = toastDiscussion(entry.notification);\n return m(\"div\", {\n key: entry.id,\n className: \"NotificationToast\",\n onclick: () => this.attrs.state.dismiss(entry.id)\n }, discussion && m(\"div\", {\n className: \"NotificationToast-context\"\n }, m(Link, {\n href: app.route.discussion(discussion)\n }, discussion.title())), m(NotificationType, {\n notification: entry.notification\n }));\n }));\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/components/NotificationToast', NotificationToast);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nlet nextId = 0;\n\n/**\n * Manages the queue of realtime notification toasts.\n * Each toast auto-dismisses after the configured flarum-realtime.notification-toast-dismiss-after seconds.\n */\nexport default class NotificationToastState {\n constructor() {\n _defineProperty(this, \"toasts\", []);\n }\n all() {\n return this.toasts;\n }\n push(notification) {\n var _app$data$settings, _app$data, _settings$flarumReal;\n const settings = (_app$data$settings = (_app$data = app.data) == null ? void 0 : _app$data.settings) != null ? _app$data$settings : {};\n const dismissAfterS = (_settings$flarumReal = settings['flarum-realtime.notification-toast-dismiss-after']) != null ? _settings$flarumReal : 10;\n if (dismissAfterS === 0) return;\n const id = nextId++;\n this.toasts.push({\n id,\n notification\n });\n m.redraw();\n setTimeout(() => this.dismiss(id), dismissAfterS * 1000);\n }\n dismiss(id) {\n const index = this.toasts.findIndex(t => t.id === id);\n if (index !== -1) {\n this.toasts.splice(index, 1);\n m.redraw();\n }\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/states/NotificationToastState', NotificationToastState);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/DiscussionPage');","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport DiscussionPage from 'flarum/forum/components/DiscussionPage';\nimport RealtimeState from '../../RealtimeState';\nconst CORE_POSTED_EVENT = 'Flarum\\\\Post\\\\Event\\\\Posted';\nconst CORE_RENAMED_EVENT = 'discussionRenamed';\nconst CORE_REVISED_EVENT = 'revisedEvent';\nexport default function () {\n extend(DiscussionPage.prototype, 'oninit', function () {\n this.websocketEventPosted = data => {\n var _this$discussion;\n const discussion = app.store.pushPayload(data);\n if (discussion.id() === ((_this$discussion = this.discussion) == null ? void 0 : _this$discussion.id()) && this.stream) {\n const oldCount = this.discussion.commentCount();\n app.store.find('discussions', this.discussion.id()).then(() => {\n this.stream.update().then(() => m.redraw());\n if (!document.hasFocus()) {\n app.setTitleCount(Math.max(0, this.discussion.commentCount() - oldCount));\n $(window).one('focus', () => {\n app.setTitleCount(0);\n });\n }\n });\n }\n };\n this.websocketEventStreamUpdate = data => {\n var _this$discussion2;\n const discussion = app.store.pushPayload(data);\n if (discussion.id() === ((_this$discussion2 = this.discussion) == null ? void 0 : _this$discussion2.id()) && this.stream) {\n app.store.find('discussions', this.discussion.id()).then(() => {\n this.stream.update().then(() => m.redraw());\n });\n }\n };\n });\n extend(DiscussionPage.prototype, 'oncreate', function () {\n var _app$websocket_channe, _app$websocket_channe2, _app$websocket_channe3, _app$websocket_channe4, _app$websocket_channe5, _app$websocket_channe6;\n (_app$websocket_channe = app.websocket_channels.public) == null || _app$websocket_channe.bind(CORE_POSTED_EVENT, this.websocketEventPosted.bind(this));\n (_app$websocket_channe2 = app.websocket_channels.user) == null || _app$websocket_channe2.bind(CORE_POSTED_EVENT, this.websocketEventPosted.bind(this));\n (_app$websocket_channe3 = app.websocket_channels.public) == null || _app$websocket_channe3.bind(CORE_RENAMED_EVENT, this.websocketEventStreamUpdate.bind(this));\n (_app$websocket_channe4 = app.websocket_channels.user) == null || _app$websocket_channe4.bind(CORE_RENAMED_EVENT, this.websocketEventStreamUpdate.bind(this));\n (_app$websocket_channe5 = app.websocket_channels.public) == null || _app$websocket_channe5.bind(CORE_REVISED_EVENT, this.websocketEventPosted.bind(this));\n (_app$websocket_channe6 = app.websocket_channels.user) == null || _app$websocket_channe6.bind(CORE_REVISED_EVENT, this.websocketEventPosted.bind(this));\n for (const eventName of RealtimeState.getDiscussionStreamEventNames()) {\n var _app$websocket_channe7, _app$websocket_channe8;\n (_app$websocket_channe7 = app.websocket_channels.public) == null || _app$websocket_channe7.bind(eventName, this.websocketEventStreamUpdate.bind(this));\n (_app$websocket_channe8 = app.websocket_channels.user) == null || _app$websocket_channe8.bind(eventName, this.websocketEventStreamUpdate.bind(this));\n }\n });\n extend(DiscussionPage.prototype, 'onremove', function () {\n var _app$websocket_channe9, _app$websocket_channe0, _app$websocket_channe1, _app$websocket_channe10, _app$websocket_channe11, _app$websocket_channe12;\n (_app$websocket_channe9 = app.websocket_channels.public) == null || _app$websocket_channe9.unbind(CORE_POSTED_EVENT);\n (_app$websocket_channe0 = app.websocket_channels.user) == null || _app$websocket_channe0.unbind(CORE_POSTED_EVENT);\n (_app$websocket_channe1 = app.websocket_channels.public) == null || _app$websocket_channe1.unbind(CORE_RENAMED_EVENT);\n (_app$websocket_channe10 = app.websocket_channels.user) == null || _app$websocket_channe10.unbind(CORE_RENAMED_EVENT);\n (_app$websocket_channe11 = app.websocket_channels.public) == null || _app$websocket_channe11.unbind(CORE_REVISED_EVENT);\n (_app$websocket_channe12 = app.websocket_channels.user) == null || _app$websocket_channe12.unbind(CORE_REVISED_EVENT);\n for (const eventName of RealtimeState.getDiscussionStreamEventNames()) {\n var _app$websocket_channe13, _app$websocket_channe14;\n (_app$websocket_channe13 = app.websocket_channels.public) == null || _app$websocket_channe13.unbind(eventName);\n (_app$websocket_channe14 = app.websocket_channels.user) == null || _app$websocket_channe14.unbind(eventName);\n }\n });\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/Stream');","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nexport default throttle;\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Icon');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/classList');","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Stream from 'flarum/common/utils/Stream';\n// @ts-ignore — lodash-es does not ship its own declaration files\nimport throttle from 'lodash-es/throttle';\nimport Icon from 'flarum/common/components/Icon';\nimport classList from 'flarum/common/utils/classList';\nexport default function () {\n extend('flarum/forum/components/PostStream', 'endItems', function (items) {\n if (this.discussion.attribute('canViewWhoTypes')) {\n var _app$session;\n const typingUsers = Object.keys(this.getTypingUsers());\n const count = typingUsers.length;\n const max = 3;\n const classes = classList(['TypingUsersContainer', count > 0 && 'TypingUsersContainer-active']);\n const typingIcon = count > 0 ? 'fas fa-ellipsis-h fa-beat' : 'fas fa-pause';\n const namedUsers = typingUsers.slice(0, max).join(', ');\n let showUsers = true;\n if ((_app$session = app.session) != null && _app$session.user) {\n var _app$session$user$pre, _app$session$user$pre2;\n showUsers = (_app$session$user$pre = (_app$session$user$pre2 = app.session.user.preferences()) == null ? void 0 : _app$session$user$pre2['flarum-realtime.typing-indicator-full']) != null ? _app$session$user$pre : true;\n }\n items.add('usersTyping', m(\"div\", {\n className: classes,\n key: \"typing\"\n }, m(\"div\", {\n className: \"TypingUsers\"\n }, m(Icon, {\n name: typingIcon\n }), count > 0 ? showUsers ? app.translator.trans('flarum-realtime.forum.typing-indicator.users-are-typing', {\n users: namedUsers,\n count,\n others: Math.max(count - max, 0)\n }) : app.translator.trans('flarum-realtime.forum.typing-indicator.people-are-typing', {\n number: count\n }) : app.translator.trans('flarum-realtime.forum.typing-indicator.no-activity'))), 70);\n }\n });\n extend('flarum/forum/components/PostStream', 'oninit', function () {\n this.previousContent = Stream('');\n this.usersTyping = Stream({});\n this.typingTruncationListener = null;\n this.typingListener = null;\n this.getTypingUsers = () => {\n const invalidateWhen = Date.now() - 6000;\n const users = _objectSpread({}, this.usersTyping());\n let latestTime = null;\n for (const displayName of Object.keys(users)) {\n if (users[displayName] < invalidateWhen) {\n delete users[displayName];\n } else if (!latestTime || latestTime < users[displayName]) {\n latestTime = users[displayName];\n }\n }\n this.usersTyping(users);\n if (latestTime && this.typingTruncationListener) {\n clearTimeout(this.typingTruncationListener);\n }\n if (latestTime) {\n this.typingTruncationListener = setTimeout(() => m.redraw(), latestTime - Date.now());\n }\n return users;\n };\n this.userTyping = data => {\n const users = _objectSpread({}, this.usersTyping());\n if (!data.discloseOnline) {\n data.displayName = String(app.translator.trans('flarum-realtime.forum.typing-indicator.anonymous-user'));\n }\n users[data.displayName] = data.time;\n this.usersTyping(users);\n m.redraw();\n };\n this.actorIsTyping = () => {\n var _app$session$user, _app$websocket_channe, _app$session$user2;\n const discloseOnline = (_app$session$user = app.session.user) == null || (_app$session$user = _app$session$user.preferences()) == null ? void 0 : _app$session$user.discloseOnline;\n (_app$websocket_channe = app.websocket_channels.discussion) == null || _app$websocket_channe.trigger('client-typing', {\n displayName: discloseOnline ? (_app$session$user2 = app.session.user) == null ? void 0 : _app$session$user2.displayName() : '[anonymous]',\n discloseOnline,\n time: Date.now()\n });\n };\n this.checkTyping = () => {\n var _fields, _fields$content;\n if (!app.composer.composingReplyTo(this.discussion)) return;\n const currentContent = (_fields = app.composer.fields) == null || (_fields$content = _fields.content) == null ? void 0 : _fields$content.call(_fields);\n if (this.previousContent() !== currentContent) {\n this.actorIsTyping();\n this.previousContent(currentContent);\n }\n };\n });\n extend('flarum/forum/components/PostStream', 'view', function () {\n if (app.forum.attribute('websocket.disallow_connection')) return;\n if (this.discussion && app.composer.editor && !this.typingListener) {\n const checkFn = throttle(() => this.checkTyping(), 2000);\n this.typingListener = setInterval(checkFn, 1000);\n }\n if (this.discussion) {\n app.websocket_channels.discussion = app.websocket.subscribe('private-typing=' + m.route.param('id').match(/[0-9]+/));\n if (this.discussion.attribute('canViewWhoTypes')) {\n app.websocket_channels.discussion.bind('client-typing', data => {\n this.userTyping(data);\n });\n }\n }\n });\n extend('flarum/forum/components/PostStream', 'onremove', function () {\n if (this.typingListener) clearInterval(this.typingListener);\n if (this.typingTruncationListener) clearTimeout(this.typingTruncationListener);\n });\n}","import app from 'flarum/forum/app';\nimport NewActivity from './Discussion/NewActivity';\nimport TypingIndicator from './Discussion/TypingIndicator';\nexport default function Discussion() {\n NewActivity();\n if (!!app.data['flarum-realtime.typing-indicator']) {\n TypingIndicator();\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/Discussion', Discussion);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/models/Post');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/IndexPage');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Button');","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nexport default class WebsocketUpdates {\n constructor() {\n _defineProperty(this, \"discussions\", {});\n _defineProperty(this, \"releaseInterval\", app.forum.attribute('flarum-realtime.release-discussion-updates-interval'));\n _defineProperty(this, \"timer\", void 0);\n _defineProperty(this, \"onTimerCallback\", null);\n _defineProperty(this, \"seconds\", this.releaseInterval);\n }\n length() {\n return Object.keys(this.discussions).length;\n }\n push(discussion) {\n this.discussions[discussion.id()] = discussion;\n }\n remove(discussion) {\n delete this.discussions[discussion.id()];\n }\n has(discussion) {\n return !!this.discussions[discussion.id()];\n }\n isEmpty() {\n return this.length() === 0;\n }\n reset() {\n this.discussions = {};\n }\n getReleaseInterval() {\n return this.releaseInterval;\n }\n\n /**\n * Releases new discussion updates to the discussion list.\n */\n release(state) {\n // Push all discussions to the UI list.\n Object.keys(this.discussions).forEach(id => {\n state.addDiscussion(this.discussions[id]);\n });\n\n // Reset new discussions array.\n this.reset();\n\n // Reset page count.\n app.setTitleCount(0);\n }\n\n /**\n * Starts the timer that will release new discussion updates to the discussion list.\n */\n startTimer() {\n if (this.autoRelease()) {\n clearInterval(this.timer);\n this.seconds = this.getReleaseInterval();\n this.timer = window.setInterval(() => {\n if (this.seconds < 0 && this.timer) return clearInterval(this.timer);\n this.seconds--;\n this.onTimerCallback && this.onTimerCallback(this.seconds);\n }, 1000);\n }\n }\n onTimer(callback) {\n this.onTimerCallback = callback;\n }\n autoRelease() {\n return this.releaseInterval > 0;\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/DiscussionList/WebsocketUpdates', WebsocketUpdates);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/extractText');","import app from 'flarum/forum/app';\nimport NewActivity from './DiscussionList/NewActivity';\nexport default function DiscussionList() {\n if (!!app.data['flarum-realtime.release-discussion-updates']) {\n NewActivity();\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/DiscussionList', DiscussionList);","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Discussion from 'flarum/common/models/Discussion';\nimport Post from 'flarum/common/models/Post';\nimport IndexPage from 'flarum/forum/components/IndexPage';\nimport Button from 'flarum/common/components/Button';\nimport WebsocketUpdates from './WebsocketUpdates';\nimport extractText from 'flarum/common/utils/extractText';\nexport default function () {\n extend(IndexPage.prototype, 'oninit', function () {\n this._realtimeWebsocketUpdates = new WebsocketUpdates();\n this._realtimeReleaseTimeout = this._realtimeWebsocketUpdates.getReleaseInterval();\n this._realtimeWebsocketEventPosted = data => {\n var _params$filter;\n const params = app.discussions.getParams();\n const activeTag = params.tags ? app.store.getBy('tags', 'slug', params.tags) : null;\n const noFilters = Object.keys((_params$filter = params.filter) != null ? _params$filter : {}).length === 0;\n if (!params.q && !params.sort && (activeTag || noFilters)) {\n var _recipientUsers, _ref, _recipientGroups, _ref2, _recipientUsers2, _ref3, _recipientGroups2, _ref4, _tags, _ref5, _tags2, _ref6, _subscription, _ref7, _tags3, _ref8, _discussions$getPages, _app$current$get, _subscription3, _ref0;\n const entity = app.store.pushPayload(data);\n let discussion = entity instanceof Discussion ? entity : null;\n if (!discussion && entity instanceof Post) {\n discussion = entity.discussion();\n }\n if (!discussion) return;\n\n // Byobu private discussions guards.\n if (app.current.data.routeName === 'byobuPrivate' && !((_recipientUsers = (_ref = discussion).recipientUsers) != null && _recipientUsers.call(_ref) && (_recipientGroups = (_ref2 = discussion).recipientGroups) != null && _recipientGroups.call(_ref2))) {\n return;\n }\n if (app.current.data.routeName === 'byobuPrivate' && ((_recipientUsers2 = (_ref3 = discussion).recipientUsers) == null || (_recipientUsers2 = _recipientUsers2.call(_ref3)) == null ? void 0 : _recipientUsers2.length) === 0 && ((_recipientGroups2 = (_ref4 = discussion).recipientGroups) == null || (_recipientGroups2 = _recipientGroups2.call(_ref4)) == null ? void 0 : _recipientGroups2.length) === 0) {\n return;\n }\n if (app.current.data.routeName === 'byobuUserPrivate') return;\n if (app.current.data.routeName === 'user.discussions') return;\n\n // Tag-based filtering (flarum/tags).\n if (activeTag && (_tags = (_ref5 = discussion).tags) != null && _tags.call(_ref5)) {\n const tagIds = discussion.tags().map(tag => tag.id());\n if (!tagIds.includes(activeTag.id())) return;\n }\n if ((_tags2 = (_ref6 = discussion).tags) != null && _tags2.call(_ref6) && discussion.tags().find(tag => {\n var _tag$isHidden, _tag$subscription;\n if (activeTag && activeTag.id() === tag.id()) return false;\n if (!activeTag && (_tag$isHidden = tag.isHidden) != null && _tag$isHidden.call(tag)) return true;\n return ((_tag$subscription = tag.subscription) == null ? void 0 : _tag$subscription.call(tag)) === 'hide';\n })) {\n return;\n }\n\n // Subscription filtering (flarum/subscriptions).\n if (((_subscription = (_ref7 = discussion).subscription) == null ? void 0 : _subscription.call(_ref7)) === 'ignore') return;\n const subscribedTag = (_tags3 = (_ref8 = discussion).tags) == null || (_tags3 = _tags3.call(_ref8)) == null ? void 0 : _tags3.find(tag => {\n var _tag$subscription2, _tag$subscription3;\n return ((_tag$subscription2 = tag.subscription) == null ? void 0 : _tag$subscription2.call(tag)) === 'lurk' || ((_tag$subscription3 = tag.subscription) == null ? void 0 : _tag$subscription3.call(tag)) === 'follow';\n });\n if (app.current.get('routeName') === 'following') {\n var _params$filter2, _subscription2, _ref9;\n if ((_params$filter2 = params.filter) != null && _params$filter2['following-tag'] && !subscribedTag || ((_subscription2 = (_ref9 = discussion).subscription) == null ? void 0 : _subscription2.call(_ref9)) !== 'follow') {\n return;\n }\n }\n const websocketUpdates = this._realtimeWebsocketUpdates;\n if (websocketUpdates.has(discussion)) return;\n if (((_discussions$getPages = app.discussions.getPages()[0]) == null || (_discussions$getPages = _discussions$getPages.items[0]) == null ? void 0 : _discussions$getPages.id()) === discussion.id()) return;\n const pushOnIndex = !app.current.get('discussion');\n const pushOnView = discussion.id() === ((_app$current$get = app.current.get('discussion')) == null ? void 0 : _app$current$get.id()) || subscribedTag || ((_subscription3 = (_ref0 = discussion).subscription) == null ? void 0 : _subscription3.call(_ref0)) === 'follow';\n if (pushOnIndex || pushOnView) {\n websocketUpdates.push(discussion);\n app.setTitleCount(websocketUpdates.length());\n m.redraw();\n }\n }\n };\n });\n extend(IndexPage.prototype, 'oncreate', function () {\n var _app$websocket_channe, _app$websocket_channe2, _app$websocket_channe3, _app$websocket_channe4;\n (_app$websocket_channe = app.websocket_channels.public) == null || _app$websocket_channe.bind('Flarum\\\\Discussion\\\\Event\\\\Started', this._realtimeWebsocketEventPosted.bind(this));\n (_app$websocket_channe2 = app.websocket_channels.public) == null || _app$websocket_channe2.bind('Flarum\\\\Post\\\\Event\\\\Posted', this._realtimeWebsocketEventPosted.bind(this));\n (_app$websocket_channe3 = app.websocket_channels.user) == null || _app$websocket_channe3.bind('Flarum\\\\Discussion\\\\Event\\\\Started', this._realtimeWebsocketEventPosted.bind(this));\n (_app$websocket_channe4 = app.websocket_channels.user) == null || _app$websocket_channe4.bind('Flarum\\\\Post\\\\Event\\\\Posted', this._realtimeWebsocketEventPosted.bind(this));\n });\n extend(IndexPage.prototype, 'onremove', function () {\n var _app$websocket_channe5, _app$websocket_channe6, _app$websocket_channe7, _app$websocket_channe8;\n (_app$websocket_channe5 = app.websocket_channels.public) == null || _app$websocket_channe5.unbind('Flarum\\\\Discussion\\\\Event\\\\Started');\n (_app$websocket_channe6 = app.websocket_channels.public) == null || _app$websocket_channe6.unbind('Flarum\\\\Post\\\\Event\\\\Posted');\n (_app$websocket_channe7 = app.websocket_channels.user) == null || _app$websocket_channe7.unbind('Flarum\\\\Discussion\\\\Event\\\\Started');\n (_app$websocket_channe8 = app.websocket_channels.user) == null || _app$websocket_channe8.unbind('Flarum\\\\Post\\\\Event\\\\Posted');\n });\n extend(IndexPage.prototype, 'contentItems', function (items) {\n const websocketUpdates = this._realtimeWebsocketUpdates;\n if (!websocketUpdates || websocketUpdates.isEmpty()) return;\n const releaseUpdates = () => {\n websocketUpdates.release(app.discussions);\n app.setTitleCount(0);\n m.redraw();\n };\n const buttonLabel = releaseTimeout => websocketUpdates.autoRelease() ? app.translator.trans('flarum-realtime.forum.push.discussion-list-new-activity-with-auto-release', {\n count: websocketUpdates.length(),\n releaseTimeout\n }) : app.translator.trans('flarum-realtime.forum.push.discussion-list-new-activity', {\n count: websocketUpdates.length()\n });\n websocketUpdates.startTimer();\n websocketUpdates.onTimer(second => {\n if (second === 0) return releaseUpdates();\n this.$('.DiscussionList-update > .Button-label').text(extractText(buttonLabel(second)));\n });\n items.add('realtimeNewActivity', Button.component({\n className: 'Button DiscussionList-update',\n 'aria-live': 'polite',\n 'aria-atomic': 'true',\n onclick: releaseUpdates\n }, buttonLabel(this._realtimeReleaseTimeout)), 95);\n });\n extend(IndexPage.prototype, 'actionItems', items => {\n items.remove('refresh');\n });\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/FieldSet');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/ItemList');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Switch');","import app from 'flarum/forum/app';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Switch from 'flarum/common/components/Switch';\nexport default function RealtimeUserPreferencesItems(user) {\n var _preferences;\n const items = new ItemList();\n let typingIndicatorLoading = false;\n items.add('typing-indicator', [m(Switch, {\n state: (_preferences = user.preferences()) == null ? void 0 : _preferences['flarum-realtime.typing-indicator-full'],\n onchange: value => {\n typingIndicatorLoading = true;\n user.savePreferences({\n 'flarum-realtime.typing-indicator-full': value\n }).then(() => {\n typingIndicatorLoading = false;\n m.redraw();\n });\n },\n loading: typingIndicatorLoading\n }, app.translator.trans('flarum-realtime.forum.user.settings.typing-indicator-type.label')), m(\"p\", {\n className: \"helpText\"\n }, app.translator.trans('flarum-realtime.forum.user.settings.typing-indicator-type.help'))], 80);\n return items;\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/User/RealtimeUserPreferences', RealtimeUserPreferencesItems);","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport FieldSet from 'flarum/common/components/FieldSet';\nimport RealtimeUserPreferencesItems from './RealtimeUserPreferences';\nexport default function extendUserPreferences() {\n if (!!app.data['flarum-realtime.typing-indicator']) {\n extend('flarum/forum/components/SettingsPage', 'settingsItems', function (items) {\n const user = this.user;\n if (!user || !user.canViewWhoTypes()) {\n return;\n }\n items.add('realtimeItems', m(FieldSet, {\n className: \"Settings-realtime\",\n label: app.translator.trans('flarum-realtime.forum.user.settings.heading')\n }, RealtimeUserPreferencesItems(user).toArray()), 55);\n });\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/User/extendUserPreferences', extendUserPreferences);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extenders');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/models/User');","import Extend from 'flarum/common/extenders';\nimport User from 'flarum/common/models/User';\nexport default [new Extend.Model(User) //\n.attribute('canViewWhoTypes')];","import app from 'flarum/forum/app';\nimport Application from './extend/Application';\nimport Discussion from './extend/Discussion';\nimport DiscussionList from './extend/DiscussionList';\nimport User from './extend/User';\nimport RealtimeExtend from './extenders/Realtime';\nimport RealtimeState from './RealtimeState';\n\n// Manually register these for other extensions to consume via ext: imports,\n// since the autoExportLoader cannot match ES class / instance default exports.\nflarum.reg.add('flarum-realtime', 'forum/extenders/Realtime', RealtimeExtend);\nflarum.reg.add('flarum-realtime', 'forum/RealtimeState', RealtimeState);\nexport { default as extend } from './extend';\napp.initializers.add('flarum-realtime', () => {\n Application();\n Discussion();\n DiscussionList();\n User();\n});","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport RealtimeState from '../RealtimeState';\n/**\n * JS extender for integrating with flarum/realtime.\n *\n * Use this in your extension's `extend.ts`, guarded by an extension check:\n *\n * ```ts\n * import { RealtimeExtend } from 'flarum/realtime/forum';\n *\n * export default [\n * ...('flarum-realtime' in flarum.extensions\n * ? [\n * new RealtimeExtend()\n * .onDiscussionStreamEvent('likesMutation'),\n * ]\n * : []),\n * ];\n * ```\n *\n * The guard is necessary because this module will not be available when\n * flarum/realtime is not installed.\n */\nexport default class Realtime {\n constructor() {\n /**\n * Events that should trigger a discussion stream update on DiscussionPage.\n */\n _defineProperty(this, \"discussionStreamEvents\", []);\n /**\n * Arbitrary channel event bindings.\n */\n _defineProperty(this, \"channelBindings\", []);\n }\n /**\n * Register a Pusher event name that should trigger a discussion stream\n * reload on the currently open DiscussionPage.\n *\n * The event is bound on both the public and user channels. When received,\n * DiscussionPage reloads the post stream so the UI reflects the change\n * (e.g. a post being liked, locked, voted on).\n *\n * @param eventName The Pusher event name, e.g. 'likesMutation'.\n */\n onDiscussionStreamEvent(eventName) {\n this.discussionStreamEvents.push({\n eventName\n });\n return this;\n }\n\n /**\n * Bind a callback to an event on the user's private channel.\n *\n * @param eventName The Pusher event name.\n * @param callback Called with the event payload when the event fires.\n */\n onUserChannelEvent(eventName, callback) {\n this.channelBindings.push({\n channel: 'user',\n eventName,\n callback\n });\n return this;\n }\n\n /**\n * Bind a callback to an event on the public channel.\n *\n * @param eventName The Pusher event name.\n * @param callback Called with the event payload when the event fires.\n */\n onPublicChannelEvent(eventName, callback) {\n this.channelBindings.push({\n channel: 'public',\n eventName,\n callback\n });\n return this;\n }\n\n /**\n * Bind a callback to an event on both the public and user channels.\n *\n * @param eventName The Pusher event name.\n * @param callback Called with the event payload when the event fires.\n */\n onBothChannelsEvent(eventName, callback) {\n this.channelBindings.push({\n channel: 'both',\n eventName,\n callback\n });\n return this;\n }\n extend(app, extension) {\n if (!this.discussionStreamEvents.length && !this.channelBindings.length) {\n return;\n }\n RealtimeState.registerDiscussionStreamEvents(this.discussionStreamEvents.map(e => e.eventName));\n for (const binding of this.channelBindings) {\n if (binding.channel === 'user' || binding.channel === 'both') {\n RealtimeState.onUserChannelReady(channel => {\n channel.bind(binding.eventName, binding.callback);\n });\n }\n if (binding.channel === 'public' || binding.channel === 'both') {\n RealtimeState.onPublicChannelReady(channel => {\n channel.bind(binding.eventName, binding.callback);\n });\n }\n }\n }\n}","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Pusher from 'pusher-js';\nimport Application from 'flarum/common/Application';\nimport RealtimeState from '../RealtimeState';\nimport NotificationToast from '../components/NotificationToast';\nimport NotificationToastState from '../states/NotificationToastState';\nexport default function () {\n extend(Application.prototype, 'mount', function () {\n // Enable logging to console when debug is enabled.\n Pusher.logToConsole = this.forum.attribute('debug');\n const wsHost = this.forum.attribute('websocket.host');\n const secure = this.forum.attribute('websocket.secure');\n app.websocket = new Pusher(this.forum.attribute('websocket.key'), {\n channelAuthorization: {\n endpoint: this.forum.attribute('apiUrl') + '/websocket/auth',\n transport: 'ajax'\n },\n wsHost,\n wsPort: this.forum.attribute('websocket.port'),\n wssPort: this.forum.attribute('websocket.port'),\n enabledTransports: ['wss', 'ws'],\n forceTLS: secure\n });\n app.websocket_channels = {\n public: null,\n user: null\n };\n\n // Mount the notification toast container outside the main Mithril tree.\n const toastState = new NotificationToastState();\n const toastEl = document.createElement('div');\n document.body.appendChild(toastEl);\n m.mount(toastEl, {\n view: () => m(NotificationToast, {\n state: toastState\n })\n });\n if (app.session.user) {\n const userChannel = app.websocket.subscribe('private-user=' + app.session.user.id());\n app.websocket_channels.user = userChannel;\n RealtimeState.notifyUserChannelReady(userChannel);\n\n // Show a toast for each incoming realtime notification and update the badge count.\n userChannel.bind('notification', data => {\n const notification = app.store.pushPayload(data);\n if (notification) {\n var _user$unreadNotificat, _user$newNotification;\n const user = app.session.user;\n user == null || user.pushAttributes({\n unreadNotificationCount: ((_user$unreadNotificat = user.unreadNotificationCount()) != null ? _user$unreadNotificat : 0) + 1,\n newNotificationCount: ((_user$newNotification = user.newNotificationCount()) != null ? _user$newNotification : 0) + 1\n });\n toastState.push(notification);\n }\n });\n } else if (!this.forum.attribute('websocket.disallow_connection')) {\n const publicChannel = app.websocket.subscribe('public');\n app.websocket_channels.public = publicChannel;\n RealtimeState.notifyPublicChannelReady(publicChannel);\n }\n });\n}","import extendUserPreferences from './User/extendUserPreferences';\nexport default function () {\n extendUserPreferences();\n}"],"names":["factory","window","installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","INVALID_BYTE","Coder","_paddingCharacter","encodedLength","length","this","encode","data","out","_encodeByte","left","maxDecodedLength","decodedLength","_getPaddingLength","decode","Uint8Array","paddingLength","op","haveBad","v0","v1","v2","v3","_decodeChar","charCodeAt","Error","b","result","String","fromCharCode","stdCoder","URLSafeCoder","_super","__extends","urlSafeCoder","encodeURLSafe","decodeURLSafe","INVALID_UTF16","INVALID_UTF8","arr","pos","chars","min","n1","n2","n3","push","join","default","AuthRequestType","ScriptReceiverFactory","prefix","lastId","callback","number","id","called","callbackWrapper","apply","arguments","remove","receiver","ScriptReceivers","defaults","endpoint","transport","DependencyLoader","options","receivers","loading","load","self","request","runtime","createScriptRequest","getPath","error","callbacks","successCallback","wasSuccessful","cleanup","send","getRoot","protocol","getDocument","location","useTLS","cdn_https","cdn_http","replace","version","suffix","DependenciesReceivers","Dependencies","dependency_loader","urlStore","baseUrl","urls","authenticationEndpoint","path","authorizationEndpoint","javascriptQuickStart","triggeringClientEvents","encryptedChannelSupport","fullUrl","url_store","url","urlObj","urlPrefix","BadEventName","msg","_this","setPrototypeOf","_newTarget","BadChannelName","RequestTimedOut","TransportPriorityTooLow","TransportClosed","UnsupportedFeature","UnsupportedTransport","UnsupportedStrategy","HTTPAuthError","status","xhr_auth","context","query","authOptions","authRequestType","xhr","createXHR","headerName","open","setRequestHeader","headers","headersProvider","dynamicHeaders","onreadystatechange","readyState","parsed","JSON","parse","responseText","e","toString","UserAuthentication","ChannelAuthorization","b64chars","b64tab","base64_i","charAt","cb_utob","cc","cb_encode","ccc","padlen","ord","btoa","abstract_timer","Timer","set","clear","delay","timer","isRunning","ensureAborted","timers_clearTimeout","clearTimeout","timers_clearInterval","clearInterval","OneOffTimer","setTimeout","timers_extends","PeriodicTimer","setInterval","Util","now","Date","valueOf","defer","method","args","_i","boundArguments","Array","slice","concat","util","extend","target","sources","extensions","constructor","stringify","safeJSONStringify","arrayIndexOf","array","item","nativeIndexOf","indexOf","objectApply","f","keys","_","map","filter","test","filterObject","Boolean","any","encodeParamsObject","encodeURIComponent","source","objects","paths","derez","nu","$ref","logger_Logger","Logger","globalLog","message","console","log","debug","warn","globalLogWarn","globalLogError","defaultLoggingFunction","core_pusher","logToConsole","logger","jsonp_auth","undefined","callbackName","nextAuthCallbackID","document","script","createElement","auth_callbacks","callback_name","src","head","getElementsByTagName","documentElement","insertBefore","firstChild","ScriptRequest","errorString","type","charset","addEventListener","onerror","onload","async","attachEvent","navigator","userAgent","errorScript","text","nextSibling","parentNode","removeChild","JSONPRequest","jsonp_timeline","getAgent","sender","host","createJSONPRequest","getGenericURL","baseScheme","params","hostTLS","hostNonTLS","getGenericPath","queryString","ws","getInitial","httpPath","http","sockjs","CallbackRegistry","_callbacks","add","prefixedEventName","fn","names","removeCallback","removeAllCallbacks","binding","Dispatcher","failThrough","callback_registry","global_callbacks","eventName","bind_global","unbind","unbind_global","unbind_all","emit","metadata","transport_connection_TransportConnection","TransportConnection","hooks","priority","initialize","transportConnectionInitializer","state","timeline","activityTimeout","generateUniqueID","transport_connection_extends","handlesActivityChecks","supportsPing","connect","socket","getSocket","onError","changeState","bindListeners","close","ping","onOpen","beforeOpen","onopen","buildTimelineMessage","onClose","closeEvent","code","reason","wasClean","unbindListeners","onMessage","onActivity","onclose","onmessage","onactivity","info","cid","dispatcher","Transport","isSupported","environment","createConnection","transport_connection","WSTransport","transports_transport","isInitialized","getWebSocketAPI","createWebSocket","httpConfiguration","streamingConfiguration","HTTPFactory","createStreamingSocket","pollingConfiguration","createPollingSocket","xhrConfiguration","isXHRSupported","transports","xhr_streaming","xhr_polling","SockJSTransport","file","SockJS","js_path","ignore_null_origin","ignoreNullOrigin","xdrConfiguration","isXDRSupported","XDRStreamingTransport","XDRPollingTransport","xdr_streaming","xdr_polling","transports_transports","net_info_Network","NetInfo","net_info_extends","isOnline","onLine","AssistantToTheTransportManager","manager","minPingDelay","maxPingDelay","pingDelay","connection","openTimestamp","onClosed","reportDeath","lifespan","Math","max","isAlive","Protocol","decodeMessage","messageEvent","messageData","pusherEventData","pusherEvent","event","channel","user_id","encodeMessage","processHandshake","activity_timeout","action","socket_id","getCloseAction","getCloseError","protocol_protocol","Connection","connection_extends","send_event","listeners","activity","closed","handleCloseEvent","listener","Handshake","finish","connection_connection","TimelineSender","isEmpty","TimelineTransport","Channel","pusher","subscribed","subscriptionPending","subscriptionCancelled","channel_extends","authorize","socketId","auth","trigger","disconnect","handleEvent","handleSubscriptionSucceededEvent","handleSubscriptionCountEvent","unsubscribe","subscription_count","subscriptionCount","subscribe","assign","channel_data","cancelSubscription","reinstateSubscription","PrivateChannel","private_channel_extends","config","channelAuthorizer","channelName","channels_channel","Members","reset","members","each","member","setMyID","myID","onSubscription","subscriptionData","presence","hash","count","me","addMember","memberData","user_info","removeMember","PresenceChannel","presence_channel_extends","authData","channelData","user","signinDonePromise","_a","sent","user_data","handleInternalEvent","addedMember","removedMember","private_channel","EncryptedChannel","nacl","encrypted_channel_extends","sharedSecret","base64","handleEncryptedEvent","ciphertext","nonce","cipherText","secretbox","overheadLength","nonceLength","bytes","getDataToEmit","raw","utf8","ConnectionManager","usingTLS","errorCallbacks","buildErrorCallbacks","connectionCallbacks","buildConnectionCallbacks","handshakeCallbacks","buildHandshakeCallbacks","Network","getNetwork","netinfo","retryIn","sendActivityCheck","updateStrategy","connection_manager_extends","runner","strategy","updateState","startConnecting","setUnavailableTimer","disconnectInternally","isUsingTLS","handshake","handshakeError","abortConnecting","abort","clearRetryTimer","clearUnavailableTimer","abandonConnection","getStrategy","round","retryTimer","unavailableTimer","unavailableTimeout","stopActivityCheck","activityTimer","pongTimeout","pong_timed_out","resetActivityCheck","shouldRetry","connected","Infinity","setConnection","withErrorEmitted","tls_only","refused","backoff","retry","newState","previousState","newStateDescription","previous","current","Channels","channels","createEncryptedChannel","errMsg","createPrivateChannel","createPresenceChannel","createChannel","all","values","find","createChannels","createConnectionManager","connection_manager","presence_channel","encrypted_channel","createTimelineSender","timeline_sender","createHandshake","connection_handshake","createAssistantToTheTransportManager","assistant_to_the_transport_manager","TransportManager","livesLeft","lives","getAssistant","SequentialStrategy","strategies","loop","failFast","timeout","timeoutLimit","minPriority","tryNextStrategy","tryStrategy","forceMinPriority","BestConnectedEverStrategy","runners","rs","collections_all","allRunnersFailed","callbackBuilder","abortRunner","aborted","cached_strategy_CachedStrategy","CachedStrategy","ttl","storage","getLocalStorage","serializedCache","getTransportCacheKey","flushTransportCache","fetchTransportCache","timestamp","cached","latency","sequential_strategy","startTimestamp","pop","cb","storeTransportCache","DelayedStrategy","IfStrategy","trueBranch","falseBranch","FirstConnectedStrategy","testSupportsStrategy","State","http_xdomain_request","getRequest","xdr","XDomainRequest","ontimeout","onprogress","onChunk","abortRequest","HTTPRequest","http_request_extends","start","payload","position","unloader","addUnloadListener","removeUnloadListener","chunk","advanceBuffer","isBufferTooLong","buffer","unreadData","endOfLinePosition","autoIncrement","getUniqueURL","separator","randomNumber","randomInt","TimelineLevel","http_socket","HTTPSocket","session","randomString","parts","exec","base","getLocation","CONNECTING","openStream","sendRaw","sendHeartbeat","OPEN","createSocketRequest","reconnect","closeStream","CLOSED","onEvent","onHeartbeat","hostname","urlParts","stream","getReceiveURL","onFinished","http_streaming_socket","http_polling_socket","http_xhr_request","getXHRAPI","getDefaultStrategy","baseOptions","defineTransport","definedTransports","defineTransportStrategy","wsStrategy","ws_options","wsHost","wsPort","wssPort","wsPath","wss_options","sockjs_options","httpHost","httpPort","httpsPort","timeouts","ws_manager","transport_manager","streaming_manager","ws_transport","wss_transport","sockjs_transport","xhr_streaming_transport","xdr_streaming_transport","xhr_polling_transport","xdr_polling_transport","ws_loop","wss_loop","sockjs_loop","streaming_loop","if_strategy","polling_loop","http_loop","best_connected_ever_strategy","delayed_strategy","http_fallback_loop","cached_strategy","first_connected_strategy","Transports","createSocket","createRequest","http_request","http_http","XMLHttpRequest","WebSocket","MozWebSocket","setup","PusherClass","Pusher","initializeOnDocumentBody","onDocumentBody","ready","getProtocol","getAuthorizers","ajax","jsonp","body","jsonp_request","script_request","localStorage","createXMLHttpRequest","createMicrosoftXHR","ActiveXObject","createXDR","Constructor","withCredentials","documentProtocol","removeEventListener","detachEvent","floor","crypto","getRandomValues","Uint32Array","pow","timeline_level","Timeline","events","uniqueID","level","limit","shift","ERROR","INFO","DEBUG","sendfn","bundle","lib","cluster","features","TransportStrategy","failAttempt","onInitialized","serializedTransport","strategy_builder_Transports","strategy_builder_defineTransport","transportClass","enabledTransports","disabledTransports","strategy_builder_UnsupportedStrategy","transport_strategy","deferred","getHttpHost","opts","getWebsocketHost","getWebsocketHostFromCluster","shouldUseTLS","forceTLS","getEnableStatsConfig","enableStats","disableStats","buildUserAuthenticator","userAuthentication","__assign","paramsProvider","dynamicParams","composeChannelQuery","user_authenticator","buildChannelAuthorizer","channelAuthorization","authTransport","authEndpoint","customHandler","channelAuthorizerGenerator","deprecatedAuthorizerOptions","ChannelAuthorizerProxy","authorizer","buildChannelAuth","channel_authorizer_composeChannelQuery","channel_authorizer","WatchlistFacade","bindWatchlistInternalEvent","watchlist_extends","forEach","watchlistEvent","UserFacade","signin_requested","serverToUserChannel","_signinDoneResolve","_onAuthorize","err","_cleanup","_signin","_newSigninPromiseIfNeeded","watchlist","_onSigninSuccess","user_extends","signin","userAuthenticator","_subscribeChannels","done","resolve","reject","promise","Promise","res","rej","flat_promise","setDone","then","pusher_Pusher","app_key","checkAppKey","statsHost","timelineParams","global_emitter","sessionID","timeline_timeline","getClientFeatures","timelineSender","subscribeAll","internal","instances","isReady","allChannels","timelineSenderTimer","event_name","channel_name","Runtime","__webpack_exports__","__webpack_module_cache__","flarum","reg","_webpack_runtimes","cachedModule","__webpack_modules__","a","definition","g","globalThis","Function","obj","prop","_typeof","iterator","_defineProperty","toPrimitive","TypeError","toPropertyKey","configurable","writable","Set","registerDiscussionStreamEvents","eventNames","discussionStreamEventNames","onUserChannelReady","userChannel","userChannelCallbacks","onPublicChannelReady","publicChannel","publicChannelCallbacks","getDiscussionStreamEventNames","from","notifyUserChannelReady","notifyPublicChannelReady","NotificationToast","view","toasts","attrs","className","trans","entry","discussion","notification","subject","_discussion","toastDiscussion","onclick","dismiss","href","title","nextId","NotificationToastState","_app$data$settings","_app$data","_settings$flarumReal","dismissAfterS","settings","redraw","index","findIndex","splice","CORE_POSTED_EVENT","CORE_RENAMED_EVENT","CORE_REVISED_EVENT","global","freeSelf","freeGlobal","root","reWhitespace","reTrimStart","string","trimmedEndIndex","objectProto","nativeObjectToString","symToStringTag","isOwn","tag","unmasked","getRawTag","objectToString","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","isObjectLike","baseGetTag","isSymbol","isObject","other","baseTrim","isBinary","nativeMax","nativeMin","func","wait","leading","trailing","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","maxing","invokeFunc","time","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","toNumber","cancel","flush","debounce","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","_objectSpread","getOwnPropertyDescriptors","defineProperties","Discussion","websocketEventPosted","_this$discussion","pushPayload","oldCount","commentCount","update","hasFocus","$","one","websocketEventStreamUpdate","_this$discussion2","_app$websocket_channe","_app$websocket_channe2","_app$websocket_channe3","_app$websocket_channe4","_app$websocket_channe5","_app$websocket_channe6","public","_app$websocket_channe7","_app$websocket_channe8","_app$websocket_channe9","_app$websocket_channe0","_app$websocket_channe1","_app$websocket_channe10","_app$websocket_channe11","_app$websocket_channe12","_app$websocket_channe13","_app$websocket_channe14","items","attribute","_app$session","typingUsers","getTypingUsers","classes","typingIcon","namedUsers","showUsers","_app$session$user$pre","_app$session$user$pre2","preferences","users","others","previousContent","usersTyping","typingTruncationListener","typingListener","invalidateWhen","latestTime","displayName","userTyping","discloseOnline","actorIsTyping","_app$session$user","_app$session$user2","checkTyping","_fields","_fields$content","composingReplyTo","currentContent","fields","content","editor","checkFn","route","param","match","WebsocketUpdates","releaseInterval","discussions","has","getReleaseInterval","release","addDiscussion","startTimer","autoRelease","seconds","onTimerCallback","onTimer","DiscussionList","_realtimeWebsocketUpdates","_realtimeReleaseTimeout","_realtimeWebsocketEventPosted","_params$filter","getParams","activeTag","tags","getBy","noFilters","q","sort","_recipientUsers","_ref","_recipientGroups","_ref2","_recipientUsers2","_ref3","_recipientGroups2","_ref4","_tags","_ref5","_tags2","_ref6","_subscription","_ref7","_tags3","_ref8","_discussions$getPages","_app$current$get","_subscription3","_ref0","entity","routeName","recipientUsers","recipientGroups","includes","_tag$isHidden","_tag$subscription","isHidden","subscription","subscribedTag","_tag$subscription2","_tag$subscription3","_params$filter2","_subscription2","_ref9","websocketUpdates","getPages","pushOnIndex","pushOnView","releaseUpdates","buttonLabel","releaseTimeout","second","RealtimeUserPreferencesItems","_preferences","typingIndicatorLoading","onchange","savePreferences","extendUserPreferences","canViewWhoTypes","label","toArray","onDiscussionStreamEvent","discussionStreamEvents","onUserChannelEvent","channelBindings","onPublicChannelEvent","onBothChannelsEvent","app","extension","forum","secure","toastState","toastEl","appendChild","mount","_user$unreadNotificat","_user$newNotification","pushAttributes","unreadNotificationCount","newNotificationCount"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum.js","mappings":"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","sources":["webpack://@flarum/realtime/Pusher/webpack/universalModuleDefinition","webpack://@flarum/realtime/Pusher/webpack/bootstrap","webpack://@flarum/realtime/Pusher/node_modules/@stablelib/base64/base64.ts","webpack://@flarum/realtime/Pusher/node_modules/@stablelib/utf8/utf8.ts","webpack://@flarum/realtime/Pusher/src/core/pusher.js","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/script_receiver_factory.ts","webpack://@flarum/realtime/Pusher/src/core/auth/options.ts","webpack://@flarum/realtime/Pusher/src/core/defaults.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/dependency_loader.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/dependencies.ts","webpack://@flarum/realtime/Pusher/src/core/utils/url_store.ts","webpack://@flarum/realtime/Pusher/src/core/base64.ts","webpack://@flarum/realtime/Pusher/src/core/errors.ts","webpack://@flarum/realtime/Pusher/src/runtimes/isomorphic/auth/xhr_auth.ts","webpack://@flarum/realtime/Pusher/src/core/utils/timers/abstract_timer.ts","webpack://@flarum/realtime/Pusher/src/core/utils/timers/index.ts","webpack://@flarum/realtime/Pusher/src/core/util.ts","webpack://@flarum/realtime/Pusher/src/core/utils/collections.ts","webpack://@flarum/realtime/Pusher/src/core/logger.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/auth/jsonp_auth.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/script_request.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/dom/jsonp_request.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/timeline/jsonp_timeline.ts","webpack://@flarum/realtime/Pusher/src/core/transports/url_schemes.ts","webpack://@flarum/realtime/Pusher/src/core/events/callback_registry.ts","webpack://@flarum/realtime/Pusher/src/core/events/dispatcher.ts","webpack://@flarum/realtime/Pusher/src/core/transports/transport_connection.ts","webpack://@flarum/realtime/Pusher/src/core/transports/transport.ts","webpack://@flarum/realtime/Pusher/src/runtimes/isomorphic/transports/transports.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/transports/transports.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/net_info.ts","webpack://@flarum/realtime/Pusher/src/core/transports/assistant_to_the_transport_manager.ts","webpack://@flarum/realtime/Pusher/src/core/connection/protocol/protocol.ts","webpack://@flarum/realtime/Pusher/src/core/connection/connection.ts","webpack://@flarum/realtime/Pusher/src/core/connection/handshake/index.ts","webpack://@flarum/realtime/Pusher/src/core/timeline/timeline_sender.ts","webpack://@flarum/realtime/Pusher/src/core/channels/channel.ts","webpack://@flarum/realtime/Pusher/src/core/channels/private_channel.ts","webpack://@flarum/realtime/Pusher/src/core/channels/members.ts","webpack://@flarum/realtime/Pusher/src/core/channels/presence_channel.ts","webpack://@flarum/realtime/Pusher/src/core/channels/encrypted_channel.ts","webpack://@flarum/realtime/Pusher/src/core/connection/connection_manager.ts","webpack://@flarum/realtime/Pusher/src/core/channels/channels.ts","webpack://@flarum/realtime/Pusher/src/core/utils/factory.ts","webpack://@flarum/realtime/Pusher/src/core/transports/transport_manager.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/sequential_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/best_connected_ever_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/cached_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/delayed_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/if_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/first_connected_strategy.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/default_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/http/state.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/http/http_xdomain_request.ts","webpack://@flarum/realtime/Pusher/src/core/http/http_request.ts","webpack://@flarum/realtime/Pusher/src/core/http/http_socket.ts","webpack://@flarum/realtime/Pusher/src/core/timeline/level.ts","webpack://@flarum/realtime/Pusher/src/core/http/http_streaming_socket.ts","webpack://@flarum/realtime/Pusher/src/core/http/http_polling_socket.ts","webpack://@flarum/realtime/Pusher/src/runtimes/isomorphic/http/http_xhr_request.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/runtime.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/transports/transport_connection_initializer.ts","webpack://@flarum/realtime/Pusher/src/runtimes/isomorphic/http/http.ts","webpack://@flarum/realtime/Pusher/src/runtimes/web/http/http.ts","webpack://@flarum/realtime/Pusher/src/core/timeline/timeline.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/transport_strategy.ts","webpack://@flarum/realtime/Pusher/src/core/strategies/strategy_builder.ts","webpack://@flarum/realtime/Pusher/src/core/config.ts","webpack://@flarum/realtime/Pusher/src/core/auth/user_authenticator.ts","webpack://@flarum/realtime/Pusher/src/core/auth/deprecated_channel_authorizer.ts","webpack://@flarum/realtime/Pusher/src/core/auth/channel_authorizer.ts","webpack://@flarum/realtime/Pusher/src/core/watchlist.ts","webpack://@flarum/realtime/Pusher/src/core/user.ts","webpack://@flarum/realtime/Pusher/src/core/utils/flat_promise.ts","webpack://@flarum/realtime/Pusher/src/core/pusher.ts","webpack://@flarum/realtime/webpack/bootstrap","webpack://@flarum/realtime/webpack/runtime/compat get default export","webpack://@flarum/realtime/webpack/runtime/define property getters","webpack://@flarum/realtime/webpack/runtime/global","webpack://@flarum/realtime/webpack/runtime/hasOwnProperty shorthand","webpack://@flarum/realtime/webpack/runtime/make namespace object","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'forum/app')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/extend')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/Application')\"","webpack://@flarum/realtime/../../../node_modules/@babel/runtime/helpers/esm/typeof.js","webpack://@flarum/realtime/../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://@flarum/realtime/../../../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","webpack://@flarum/realtime/../../../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","webpack://@flarum/realtime/./src/forum/RealtimeState.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/Component')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'forum/components/NotificationType')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/models/Discussion')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/Link')\"","webpack://@flarum/realtime/./src/forum/components/NotificationToast.tsx","webpack://@flarum/realtime/./src/forum/states/NotificationToastState.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'forum/components/DiscussionPage')\"","webpack://@flarum/realtime/./src/forum/extend/Discussion/NewActivity.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/utils/Stream')\"","webpack://@flarum/realtime/../../../node_modules/lodash-es/isObject.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_freeGlobal.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_root.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/now.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_trimmedEndIndex.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_baseTrim.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_Symbol.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_getRawTag.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_objectToString.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/_baseGetTag.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/toNumber.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/isSymbol.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/isObjectLike.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/debounce.js","webpack://@flarum/realtime/../../../node_modules/lodash-es/throttle.js","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/Icon')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/utils/classList')\"","webpack://@flarum/realtime/./src/forum/extend/Discussion/TypingIndicator.tsx","webpack://@flarum/realtime/./src/forum/extend/Discussion.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/models/Post')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'forum/components/IndexPage')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/Button')\"","webpack://@flarum/realtime/./src/forum/extend/DiscussionList/WebsocketUpdates.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/utils/extractText')\"","webpack://@flarum/realtime/./src/forum/extend/DiscussionList.ts","webpack://@flarum/realtime/./src/forum/extend/DiscussionList/NewActivity.ts","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/FieldSet')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/utils/ItemList')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/components/Switch')\"","webpack://@flarum/realtime/./src/forum/extend/User/RealtimeUserPreferences.tsx","webpack://@flarum/realtime/./src/forum/extend/User/extendUserPreferences.tsx","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/extenders')\"","webpack://@flarum/realtime/external root \"flarum.reg.get('core', 'common/models/User')\"","webpack://@flarum/realtime/./src/forum/extend.ts","webpack://@flarum/realtime/./src/forum/index.ts","webpack://@flarum/realtime/./src/forum/extenders/Realtime.ts","webpack://@flarum/realtime/./src/forum/extend/Application.ts","webpack://@flarum/realtime/./src/forum/extend/User.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Pusher\"] = factory();\n\telse\n\t\troot[\"Pusher\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 2);\n","// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\n\n/**\n * Package base64 implements Base64 encoding and decoding.\n */\n\n// Invalid character used in decoding to indicate\n// that the character to decode is out of range of\n// alphabet and cannot be decoded.\nconst INVALID_BYTE = 256;\n\n/**\n * Implements standard Base64 encoding.\n *\n * Operates in constant time.\n */\nexport class Coder {\n // TODO(dchest): methods to encode chunk-by-chunk.\n\n constructor(private _paddingCharacter = \"=\") { }\n\n encodedLength(length: number): number {\n if (!this._paddingCharacter) {\n return (length * 8 + 5) / 6 | 0;\n }\n return (length + 2) / 3 * 4 | 0;\n }\n\n encode(data: Uint8Array): string {\n let out = \"\";\n\n let i = 0;\n for (; i < data.length - 2; i += 3) {\n let c = (data[i] << 16) | (data[i + 1] << 8) | (data[i + 2]);\n out += this._encodeByte((c >>> 3 * 6) & 63);\n out += this._encodeByte((c >>> 2 * 6) & 63);\n out += this._encodeByte((c >>> 1 * 6) & 63);\n out += this._encodeByte((c >>> 0 * 6) & 63);\n }\n\n const left = data.length - i;\n if (left > 0) {\n let c = (data[i] << 16) | (left === 2 ? data[i + 1] << 8 : 0);\n out += this._encodeByte((c >>> 3 * 6) & 63);\n out += this._encodeByte((c >>> 2 * 6) & 63);\n if (left === 2) {\n out += this._encodeByte((c >>> 1 * 6) & 63);\n } else {\n out += this._paddingCharacter || \"\";\n }\n out += this._paddingCharacter || \"\";\n }\n\n return out;\n }\n\n maxDecodedLength(length: number): number {\n if (!this._paddingCharacter) {\n return (length * 6 + 7) / 8 | 0;\n }\n return length / 4 * 3 | 0;\n }\n\n decodedLength(s: string): number {\n return this.maxDecodedLength(s.length - this._getPaddingLength(s));\n }\n\n decode(s: string): Uint8Array {\n if (s.length === 0) {\n return new Uint8Array(0);\n }\n const paddingLength = this._getPaddingLength(s);\n const length = s.length - paddingLength;\n const out = new Uint8Array(this.maxDecodedLength(length));\n let op = 0;\n let i = 0;\n let haveBad = 0;\n let v0 = 0, v1 = 0, v2 = 0, v3 = 0;\n for (; i < length - 4; i += 4) {\n v0 = this._decodeChar(s.charCodeAt(i + 0));\n v1 = this._decodeChar(s.charCodeAt(i + 1));\n v2 = this._decodeChar(s.charCodeAt(i + 2));\n v3 = this._decodeChar(s.charCodeAt(i + 3));\n out[op++] = (v0 << 2) | (v1 >>> 4);\n out[op++] = (v1 << 4) | (v2 >>> 2);\n out[op++] = (v2 << 6) | v3;\n haveBad |= v0 & INVALID_BYTE;\n haveBad |= v1 & INVALID_BYTE;\n haveBad |= v2 & INVALID_BYTE;\n haveBad |= v3 & INVALID_BYTE;\n }\n if (i < length - 1) {\n v0 = this._decodeChar(s.charCodeAt(i));\n v1 = this._decodeChar(s.charCodeAt(i + 1));\n out[op++] = (v0 << 2) | (v1 >>> 4);\n haveBad |= v0 & INVALID_BYTE;\n haveBad |= v1 & INVALID_BYTE;\n }\n if (i < length - 2) {\n v2 = this._decodeChar(s.charCodeAt(i + 2));\n out[op++] = (v1 << 4) | (v2 >>> 2);\n haveBad |= v2 & INVALID_BYTE;\n }\n if (i < length - 3) {\n v3 = this._decodeChar(s.charCodeAt(i + 3));\n out[op++] = (v2 << 6) | v3;\n haveBad |= v3 & INVALID_BYTE;\n }\n if (haveBad !== 0) {\n throw new Error(\"Base64Coder: incorrect characters for decoding\");\n }\n return out;\n }\n\n // Standard encoding have the following encoded/decoded ranges,\n // which we need to convert between.\n //\n // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 + /\n // Index: 0 - 25 26 - 51 52 - 61 62 63\n // ASCII: 65 - 90 97 - 122 48 - 57 43 47\n //\n\n // Encode 6 bits in b into a new character.\n protected _encodeByte(b: number): string {\n // Encoding uses constant time operations as follows:\n //\n // 1. Define comparison of A with B using (A - B) >>> 8:\n // if A > B, then result is positive integer\n // if A <= B, then result is 0\n //\n // 2. Define selection of C or 0 using bitwise AND: X & C:\n // if X == 0, then result is 0\n // if X != 0, then result is C\n //\n // 3. Start with the smallest comparison (b >= 0), which is always\n // true, so set the result to the starting ASCII value (65).\n //\n // 4. Continue comparing b to higher ASCII values, and selecting\n // zero if comparison isn't true, otherwise selecting a value\n // to add to result, which:\n //\n // a) undoes the previous addition\n // b) provides new value to add\n //\n let result = b;\n // b >= 0\n result += 65;\n // b > 25\n result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n // b > 51\n result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n // b > 61\n result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 43);\n // b > 62\n result += ((62 - b) >>> 8) & ((62 - 43) - 63 + 47);\n\n return String.fromCharCode(result);\n }\n\n // Decode a character code into a byte.\n // Must return 256 if character is out of alphabet range.\n protected _decodeChar(c: number): number {\n // Decoding works similar to encoding: using the same comparison\n // function, but now it works on ranges: result is always incremented\n // by value, but this value becomes zero if the range is not\n // satisfied.\n //\n // Decoding starts with invalid value, 256, which is then\n // subtracted when the range is satisfied. If none of the ranges\n // apply, the function returns 256, which is then checked by\n // the caller to throw error.\n let result = INVALID_BYTE; // start with invalid character\n\n // c == 43 (c > 42 and c < 44)\n result += (((42 - c) & (c - 44)) >>> 8) & (-INVALID_BYTE + c - 43 + 62);\n // c == 47 (c > 46 and c < 48)\n result += (((46 - c) & (c - 48)) >>> 8) & (-INVALID_BYTE + c - 47 + 63);\n // c > 47 and c < 58\n result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n // c > 64 and c < 91\n result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n // c > 96 and c < 123\n result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n\n return result;\n }\n\n private _getPaddingLength(s: string): number {\n let paddingLength = 0;\n if (this._paddingCharacter) {\n for (let i = s.length - 1; i >= 0; i--) {\n if (s[i] !== this._paddingCharacter) {\n break;\n }\n paddingLength++;\n }\n if (s.length < 4 || paddingLength > 2) {\n throw new Error(\"Base64Coder: incorrect padding\");\n }\n }\n return paddingLength;\n }\n\n}\n\nconst stdCoder = new Coder();\n\nexport function encode(data: Uint8Array): string {\n return stdCoder.encode(data);\n}\n\nexport function decode(s: string): Uint8Array {\n return stdCoder.decode(s);\n}\n\n/**\n * Implements URL-safe Base64 encoding.\n * (Same as Base64, but '+' is replaced with '-', and '/' with '_').\n *\n * Operates in constant time.\n */\nexport class URLSafeCoder extends Coder {\n // URL-safe encoding have the following encoded/decoded ranges:\n //\n // ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 - _\n // Index: 0 - 25 26 - 51 52 - 61 62 63\n // ASCII: 65 - 90 97 - 122 48 - 57 45 95\n //\n\n protected _encodeByte(b: number): string {\n let result = b;\n // b >= 0\n result += 65;\n // b > 25\n result += ((25 - b) >>> 8) & ((0 - 65) - 26 + 97);\n // b > 51\n result += ((51 - b) >>> 8) & ((26 - 97) - 52 + 48);\n // b > 61\n result += ((61 - b) >>> 8) & ((52 - 48) - 62 + 45);\n // b > 62\n result += ((62 - b) >>> 8) & ((62 - 45) - 63 + 95);\n\n return String.fromCharCode(result);\n }\n\n protected _decodeChar(c: number): number {\n let result = INVALID_BYTE;\n\n // c == 45 (c > 44 and c < 46)\n result += (((44 - c) & (c - 46)) >>> 8) & (-INVALID_BYTE + c - 45 + 62);\n // c == 95 (c > 94 and c < 96)\n result += (((94 - c) & (c - 96)) >>> 8) & (-INVALID_BYTE + c - 95 + 63);\n // c > 47 and c < 58\n result += (((47 - c) & (c - 58)) >>> 8) & (-INVALID_BYTE + c - 48 + 52);\n // c > 64 and c < 91\n result += (((64 - c) & (c - 91)) >>> 8) & (-INVALID_BYTE + c - 65 + 0);\n // c > 96 and c < 123\n result += (((96 - c) & (c - 123)) >>> 8) & (-INVALID_BYTE + c - 97 + 26);\n\n return result;\n }\n}\n\nconst urlSafeCoder = new URLSafeCoder();\n\nexport function encodeURLSafe(data: Uint8Array): string {\n return urlSafeCoder.encode(data);\n}\n\nexport function decodeURLSafe(s: string): Uint8Array {\n return urlSafeCoder.decode(s);\n}\n\n\nexport const encodedLength = (length: number) =>\n stdCoder.encodedLength(length);\n\nexport const maxDecodedLength = (length: number) =>\n stdCoder.maxDecodedLength(length);\n\nexport const decodedLength = (s: string) =>\n stdCoder.decodedLength(s);\n","// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\n\n/**\n * Package utf8 implements UTF-8 encoding and decoding.\n */\n\nconst INVALID_UTF16 = \"utf8: invalid string\";\nconst INVALID_UTF8 = \"utf8: invalid source encoding\";\n\n/**\n * Encodes the given string into UTF-8 byte array.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nexport function encode(s: string): Uint8Array {\n // Calculate result length and allocate output array.\n // encodedLength() also validates string and throws errors,\n // so we don't need repeat validation here.\n const arr = new Uint8Array(encodedLength(s));\n\n let pos = 0;\n for (let i = 0; i < s.length; i++) {\n let c = s.charCodeAt(i);\n if (c < 0x80) {\n arr[pos++] = c;\n } else if (c < 0x800) {\n arr[pos++] = 0xc0 | c >> 6;\n arr[pos++] = 0x80 | c & 0x3f;\n } else if (c < 0xd800) {\n arr[pos++] = 0xe0 | c >> 12;\n arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n arr[pos++] = 0x80 | c & 0x3f;\n } else {\n i++; // get one more character\n c = (c & 0x3ff) << 10;\n c |= s.charCodeAt(i) & 0x3ff;\n c += 0x10000;\n\n arr[pos++] = 0xf0 | c >> 18;\n arr[pos++] = 0x80 | (c >> 12) & 0x3f;\n arr[pos++] = 0x80 | (c >> 6) & 0x3f;\n arr[pos++] = 0x80 | c & 0x3f;\n }\n }\n return arr;\n}\n\n/**\n * Returns the number of bytes required to encode the given string into UTF-8.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nexport function encodedLength(s: string): number {\n let result = 0;\n for (let i = 0; i < s.length; i++) {\n const c = s.charCodeAt(i);\n if (c < 0x80) {\n result += 1;\n } else if (c < 0x800) {\n result += 2;\n } else if (c < 0xd800) {\n result += 3;\n } else if (c <= 0xdfff) {\n if (i >= s.length - 1) {\n throw new Error(INVALID_UTF16);\n }\n i++; // \"eat\" next character\n result += 4;\n } else {\n throw new Error(INVALID_UTF16);\n }\n }\n return result;\n}\n\n/**\n * Decodes the given byte array from UTF-8 into a string.\n * Throws if encoding is invalid.\n */\nexport function decode(arr: Uint8Array): string {\n const chars: string[] = [];\n for (let i = 0; i < arr.length; i++) {\n let b = arr[i];\n\n if (b & 0x80) {\n let min;\n if (b < 0xe0) {\n // Need 1 more byte.\n if (i >= arr.length) {\n throw new Error(INVALID_UTF8);\n }\n const n1 = arr[++i];\n if ((n1 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x1f) << 6 | (n1 & 0x3f);\n min = 0x80;\n } else if (b < 0xf0) {\n // Need 2 more bytes.\n if (i >= arr.length - 1) {\n throw new Error(INVALID_UTF8);\n }\n const n1 = arr[++i];\n const n2 = arr[++i];\n if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x0f) << 12 | (n1 & 0x3f) << 6 | (n2 & 0x3f);\n min = 0x800;\n } else if (b < 0xf8) {\n // Need 3 more bytes.\n if (i >= arr.length - 2) {\n throw new Error(INVALID_UTF8);\n }\n const n1 = arr[++i];\n const n2 = arr[++i];\n const n3 = arr[++i];\n if ((n1 & 0xc0) !== 0x80 || (n2 & 0xc0) !== 0x80 || (n3 & 0xc0) !== 0x80) {\n throw new Error(INVALID_UTF8);\n }\n b = (b & 0x0f) << 18 | (n1 & 0x3f) << 12 | (n2 & 0x3f) << 6 | (n3 & 0x3f);\n min = 0x10000;\n } else {\n throw new Error(INVALID_UTF8);\n }\n\n if (b < min || (b >= 0xd800 && b <= 0xdfff)) {\n throw new Error(INVALID_UTF8);\n }\n\n if (b >= 0x10000) {\n // Surrogate pair.\n if (b > 0x10ffff) {\n throw new Error(INVALID_UTF8);\n }\n b -= 0x10000;\n chars.push(String.fromCharCode(0xd800 | (b >> 10)));\n b = 0xdc00 | (b & 0x3ff);\n }\n }\n\n chars.push(String.fromCharCode(b));\n }\n return chars.join(\"\");\n}\n","// required so we don't have to do require('pusher').default etc.\nmodule.exports = require('./pusher').default;\n","import ScriptReceiver from './script_receiver';\n\n/** Builds receivers for JSONP and Script requests.\n *\n * Each receiver is an object with following fields:\n * - number - unique (for the factory instance), numerical id of the receiver\n * - id - a string ID that can be used in DOM attributes\n * - name - name of the function triggering the receiver\n * - callback - callback function\n *\n * Receivers are triggered only once, on the first callback call.\n *\n * Receivers can be called by their name or by accessing factory object\n * by the number key.\n *\n * @param {String} prefix the prefix used in ids\n * @param {String} name the name of the object\n */\nexport class ScriptReceiverFactory {\n lastId: number;\n prefix: string;\n name: string;\n\n constructor(prefix: string, name: string) {\n this.lastId = 0;\n this.prefix = prefix;\n this.name = name;\n }\n\n create(callback: Function): ScriptReceiver {\n this.lastId++;\n\n var number = this.lastId;\n var id = this.prefix + number;\n var name = this.name + '[' + number + ']';\n\n var called = false;\n var callbackWrapper = function() {\n if (!called) {\n callback.apply(null, arguments);\n called = true;\n }\n };\n\n this[number] = callbackWrapper;\n return { number: number, id: id, name: name, callback: callbackWrapper };\n }\n\n remove(receiver: ScriptReceiver) {\n delete this[receiver.number];\n }\n}\n\nexport var ScriptReceivers = new ScriptReceiverFactory(\n '_pusher_script_',\n 'Pusher.ScriptReceivers'\n);\n","export enum AuthRequestType {\n UserAuthentication = 'user-authentication',\n ChannelAuthorization = 'channel-authorization'\n}\n\nexport interface ChannelAuthorizationData {\n auth: string;\n channel_data?: string;\n shared_secret?: string;\n}\n\nexport type ChannelAuthorizationCallback = (\n error: Error | null,\n authData: ChannelAuthorizationData | null\n) => void;\n\nexport interface ChannelAuthorizationRequestParams {\n socketId: string;\n channelName: string;\n}\n\nexport interface ChannelAuthorizationHandler {\n (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback\n ): void;\n}\n\nexport interface UserAuthenticationData {\n auth: string;\n user_data: string;\n}\n\nexport type UserAuthenticationCallback = (\n error: Error | null,\n authData: UserAuthenticationData | null\n) => void;\n\nexport interface UserAuthenticationRequestParams {\n socketId: string;\n}\n\nexport interface UserAuthenticationHandler {\n (\n params: UserAuthenticationRequestParams,\n callback: UserAuthenticationCallback\n ): void;\n}\n\nexport type AuthTransportCallback =\n | ChannelAuthorizationCallback\n | UserAuthenticationCallback;\n\nexport interface AuthOptionsT {\n transport: 'ajax' | 'jsonp';\n endpoint: string;\n params?: any;\n headers?: any;\n paramsProvider?: () => any;\n headersProvider?: () => any;\n customHandler?: AuthHandler;\n}\n\nexport declare type UserAuthenticationOptions = AuthOptionsT<\n UserAuthenticationHandler\n>;\nexport declare type ChannelAuthorizationOptions = AuthOptionsT<\n ChannelAuthorizationHandler\n>;\n\nexport interface InternalAuthOptions {\n transport: 'ajax' | 'jsonp';\n endpoint: string;\n params?: any;\n headers?: any;\n paramsProvider?: () => any;\n headersProvider?: () => any;\n}\n","import {\n ChannelAuthorizationOptions,\n UserAuthenticationOptions\n} from './auth/options';\nimport { AuthTransport } from './config';\n\nexport interface DefaultConfig {\n VERSION: string;\n PROTOCOL: number;\n wsPort: number;\n wssPort: number;\n wsPath: string;\n httpHost: string;\n httpPort: number;\n httpsPort: number;\n httpPath: string;\n stats_host: string;\n authEndpoint: string;\n authTransport: AuthTransport;\n activityTimeout: number;\n pongTimeout: number;\n unavailableTimeout: number;\n cluster: string;\n userAuthentication: UserAuthenticationOptions;\n channelAuthorization: ChannelAuthorizationOptions;\n\n cdn_http?: string;\n cdn_https?: string;\n dependency_suffix?: string;\n}\n\nvar Defaults: DefaultConfig = {\n VERSION: VERSION,\n PROTOCOL: 7,\n\n wsPort: 80,\n wssPort: 443,\n wsPath: '',\n // DEPRECATED: SockJS fallback parameters\n httpHost: 'sockjs.pusher.com',\n httpPort: 80,\n httpsPort: 443,\n httpPath: '/pusher',\n // DEPRECATED: Stats\n stats_host: 'stats.pusher.com',\n // DEPRECATED: Other settings\n authEndpoint: '/pusher/auth',\n authTransport: 'ajax',\n activityTimeout: 120000,\n pongTimeout: 30000,\n unavailableTimeout: 10000,\n cluster: 'mt1',\n userAuthentication: {\n endpoint: '/pusher/user-auth',\n transport: 'ajax'\n },\n channelAuthorization: {\n endpoint: '/pusher/auth',\n transport: 'ajax'\n },\n\n // CDN configuration\n cdn_http: CDN_HTTP,\n cdn_https: CDN_HTTPS,\n dependency_suffix: DEPENDENCY_SUFFIX\n};\n\nexport default Defaults;\n","import {\n ScriptReceivers,\n ScriptReceiverFactory\n} from './script_receiver_factory';\nimport Runtime from 'runtime';\nimport ScriptRequest from './script_request';\n\n/** Handles loading dependency files.\n *\n * Dependency loaders don't remember whether a resource has been loaded or\n * not. It is caller's responsibility to make sure the resource is not loaded\n * twice. This is because it's impossible to detect resource loading status\n * without knowing its content.\n *\n * Options:\n * - cdn_http - url to HTTP CND\n * - cdn_https - url to HTTPS CDN\n * - version - version of pusher-js\n * - suffix - suffix appended to all names of dependency files\n *\n * @param {Object} options\n */\nexport default class DependencyLoader {\n options: any;\n receivers: ScriptReceiverFactory;\n loading: any;\n\n constructor(options: any) {\n this.options = options;\n this.receivers = options.receivers || ScriptReceivers;\n this.loading = {};\n }\n\n /** Loads the dependency from CDN.\n *\n * @param {String} name\n * @param {Function} callback\n */\n load(name: string, options: any, callback: Function) {\n var self = this;\n\n if (self.loading[name] && self.loading[name].length > 0) {\n self.loading[name].push(callback);\n } else {\n self.loading[name] = [callback];\n\n var request = Runtime.createScriptRequest(self.getPath(name, options));\n var receiver = self.receivers.create(function(error) {\n self.receivers.remove(receiver);\n\n if (self.loading[name]) {\n var callbacks = self.loading[name];\n delete self.loading[name];\n\n var successCallback = function(wasSuccessful) {\n if (!wasSuccessful) {\n request.cleanup();\n }\n };\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](error, successCallback);\n }\n }\n });\n request.send(receiver);\n }\n }\n\n /** Returns a root URL for pusher-js CDN.\n *\n * @returns {String}\n */\n getRoot(options: any): string {\n var cdn;\n var protocol = Runtime.getDocument().location.protocol;\n if ((options && options.useTLS) || protocol === 'https:') {\n cdn = this.options.cdn_https;\n } else {\n cdn = this.options.cdn_http;\n }\n // make sure there are no double slashes\n return cdn.replace(/\\/*$/, '') + '/' + this.options.version;\n }\n\n /** Returns a full path to a dependency file.\n *\n * @param {String} name\n * @returns {String}\n */\n getPath(name: string, options: any): string {\n return this.getRoot(options) + '/' + name + this.options.suffix + '.js';\n }\n}\n","import { ScriptReceiverFactory } from './script_receiver_factory';\nimport Defaults from 'core/defaults';\nimport DependencyLoader from './dependency_loader';\n\nexport var DependenciesReceivers = new ScriptReceiverFactory(\n '_pusher_dependencies',\n 'Pusher.DependenciesReceivers'\n);\n\nexport var Dependencies = new DependencyLoader({\n cdn_http: Defaults.cdn_http,\n cdn_https: Defaults.cdn_https,\n version: Defaults.VERSION,\n suffix: Defaults.dependency_suffix,\n receivers: DependenciesReceivers\n});\n","/**\n * A place to store help URLs for error messages etc\n */\n\nconst urlStore = {\n baseUrl: 'https://pusher.com',\n urls: {\n authenticationEndpoint: {\n path: '/docs/channels/server_api/authenticating_users'\n },\n authorizationEndpoint: {\n path: '/docs/channels/server_api/authorizing-users/'\n },\n javascriptQuickStart: {\n path: '/docs/javascript_quick_start'\n },\n triggeringClientEvents: {\n path: '/docs/client_api_guide/client_events#trigger-events'\n },\n encryptedChannelSupport: {\n fullUrl:\n 'https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support'\n }\n }\n};\n\n/** Builds a consistent string with links to pusher documentation\n *\n * @param {string} key - relevant key in the url_store.urls object\n * @return {string} suffix string to append to log message\n */\nconst buildLogSuffix = function(key: string): string {\n const urlPrefix = 'See:';\n const urlObj = urlStore.urls[key];\n if (!urlObj) return '';\n\n let url;\n if (urlObj.fullUrl) {\n url = urlObj.fullUrl;\n } else if (urlObj.path) {\n url = urlStore.baseUrl + urlObj.path;\n }\n\n if (!url) return '';\n return `${urlPrefix} ${url}`;\n};\n\nexport default { buildLogSuffix };\n","export default function encode(s: any): string {\n return btoa(utob(s));\n}\n\nvar fromCharCode = String.fromCharCode;\n\nvar b64chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nvar b64tab = {};\n\nfor (var i = 0, l = b64chars.length; i < l; i++) {\n b64tab[b64chars.charAt(i)] = i;\n}\n\nvar cb_utob = function(c) {\n var cc = c.charCodeAt(0);\n return cc < 0x80\n ? c\n : cc < 0x800\n ? fromCharCode(0xc0 | (cc >>> 6)) + fromCharCode(0x80 | (cc & 0x3f))\n : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) +\n fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) +\n fromCharCode(0x80 | (cc & 0x3f));\n};\n\nvar utob = function(u) {\n return u.replace(/[^\\x00-\\x7F]/g, cb_utob);\n};\n\nvar cb_encode = function(ccc) {\n var padlen = [0, 2, 1][ccc.length % 3];\n var ord =\n (ccc.charCodeAt(0) << 16) |\n ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) |\n (ccc.length > 2 ? ccc.charCodeAt(2) : 0);\n var chars = [\n b64chars.charAt(ord >>> 18),\n b64chars.charAt((ord >>> 12) & 63),\n padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),\n padlen >= 1 ? '=' : b64chars.charAt(ord & 63)\n ];\n return chars.join('');\n};\n\nvar btoa =\n global.btoa ||\n function(b) {\n return b.replace(/[\\s\\S]{1,3}/g, cb_encode);\n };\n","/** Error classes used throughout the library. */\n// https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\nexport class BadEventName extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class BadChannelName extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RequestTimedOut extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class TransportPriorityTooLow extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class TransportClosed extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedFeature extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedTransport extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedStrategy extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class HTTPAuthError extends Error {\n status: number;\n constructor(status: number, msg?: string) {\n super(msg);\n this.status = status;\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import TimelineSender from 'core/timeline/timeline_sender';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from 'runtime';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport AbstractRuntime from 'runtimes/interface';\nimport UrlStore from 'core/utils/url_store';\nimport {\n AuthRequestType,\n AuthTransportCallback,\n InternalAuthOptions\n} from 'core/auth/options';\nimport { HTTPAuthError } from 'core/errors';\n\nconst ajax: AuthTransport = function(\n context: AbstractRuntime,\n query: string,\n authOptions: InternalAuthOptions,\n authRequestType: AuthRequestType,\n callback: AuthTransportCallback\n) {\n const xhr = Runtime.createXHR();\n xhr.open('POST', authOptions.endpoint, true);\n\n // add request headers\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n for (var headerName in authOptions.headers) {\n xhr.setRequestHeader(headerName, authOptions.headers[headerName]);\n }\n if (authOptions.headersProvider != null) {\n let dynamicHeaders = authOptions.headersProvider();\n for (var headerName in dynamicHeaders) {\n xhr.setRequestHeader(headerName, dynamicHeaders[headerName]);\n }\n }\n\n xhr.onreadystatechange = function() {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n let data;\n let parsed = false;\n\n try {\n data = JSON.parse(xhr.responseText);\n parsed = true;\n } catch (e) {\n callback(\n new HTTPAuthError(\n 200,\n `JSON returned from ${authRequestType.toString()} endpoint was invalid, yet status code was 200. Data was: ${\n xhr.responseText\n }`\n ),\n null\n );\n }\n\n if (parsed) {\n // prevents double execution.\n callback(null, data);\n }\n } else {\n let suffix = '';\n switch (authRequestType) {\n case AuthRequestType.UserAuthentication:\n suffix = UrlStore.buildLogSuffix('authenticationEndpoint');\n break;\n case AuthRequestType.ChannelAuthorization:\n suffix = `Clients must be authorized to join private or presence channels. ${UrlStore.buildLogSuffix(\n 'authorizationEndpoint'\n )}`;\n break;\n }\n callback(\n new HTTPAuthError(\n xhr.status,\n `Unable to retrieve auth string from ${authRequestType.toString()} endpoint - ` +\n `received status: ${xhr.status} from ${authOptions.endpoint}. ${suffix}`\n ),\n null\n );\n }\n }\n };\n\n xhr.send(query);\n return xhr;\n};\n\nexport default ajax;\n","import TimedCallback from './timed_callback';\nimport { Delay, Scheduler, Canceller } from './scheduling';\n\nabstract class Timer {\n protected clear: Canceller;\n protected timer: number | void;\n\n constructor(\n set: Scheduler,\n clear: Canceller,\n delay: Delay,\n callback: TimedCallback\n ) {\n this.clear = clear;\n this.timer = set(() => {\n if (this.timer) {\n this.timer = callback(this.timer);\n }\n }, delay);\n }\n\n /** Returns whether the timer is still running.\n *\n * @return {Boolean}\n */\n isRunning(): boolean {\n return this.timer !== null;\n }\n\n /** Aborts a timer when it's running. */\n ensureAborted() {\n if (this.timer) {\n this.clear(this.timer);\n this.timer = null;\n }\n }\n}\n\nexport default Timer;\n","import Timer from './abstract_timer';\nimport TimedCallback from './timed_callback';\nimport { Delay } from './scheduling';\n\n// We need to bind clear functions this way to avoid exceptions on IE8\nfunction clearTimeout(timer) {\n global.clearTimeout(timer);\n}\nfunction clearInterval(timer) {\n global.clearInterval(timer);\n}\n\n/** Cross-browser compatible one-off timer abstraction.\n *\n * @param {Number} delay\n * @param {Function} callback\n */\nexport class OneOffTimer extends Timer {\n constructor(delay: Delay, callback: TimedCallback) {\n super(setTimeout, clearTimeout, delay, function(timer) {\n callback();\n return null;\n });\n }\n}\n\n/** Cross-browser compatible periodic timer abstraction.\n *\n * @param {Number} delay\n * @param {Function} callback\n */\nexport class PeriodicTimer extends Timer {\n constructor(delay: Delay, callback: TimedCallback) {\n super(setInterval, clearInterval, delay, function(timer) {\n callback();\n return timer;\n });\n }\n}\n","import * as Collections from './utils/collections';\nimport TimedCallback from './utils/timers/timed_callback';\nimport { OneOffTimer, PeriodicTimer } from './utils/timers';\n\nvar Util = {\n now(): number {\n if (Date.now) {\n return Date.now();\n } else {\n return new Date().valueOf();\n }\n },\n\n defer(callback: TimedCallback): OneOffTimer {\n return new OneOffTimer(0, callback);\n },\n\n /** Builds a function that will proxy a method call to its first argument.\n *\n * Allows partial application of arguments, so additional arguments are\n * prepended to the argument list.\n *\n * @param {String} name method name\n * @return {Function} proxy function\n */\n method(name: string, ...args: any[]): Function {\n var boundArguments = Array.prototype.slice.call(arguments, 1);\n return function(object) {\n return object[name].apply(object, boundArguments.concat(arguments));\n };\n }\n};\n\nexport default Util;\n","import base64encode from '../base64';\nimport Util from '../util';\n\n/** Merges multiple objects into the target argument.\n *\n * For properties that are plain Objects, performs a deep-merge. For the\n * rest it just copies the value of the property.\n *\n * To extend prototypes use it as following:\n * Pusher.Util.extend(Target.prototype, Base.prototype)\n *\n * You can also use it to merge objects without altering them:\n * Pusher.Util.extend({}, object1, object2)\n *\n * @param {Object} target\n * @return {Object} the target argument\n */\nexport function extend(target: any, ...sources: any[]): T {\n for (var i = 0; i < sources.length; i++) {\n var extensions = sources[i];\n for (var property in extensions) {\n if (\n extensions[property] &&\n extensions[property].constructor &&\n extensions[property].constructor === Object\n ) {\n target[property] = extend(target[property] || {}, extensions[property]);\n } else {\n target[property] = extensions[property];\n }\n }\n }\n return target;\n}\n\nexport function stringify(): string {\n var m = ['Pusher'];\n for (var i = 0; i < arguments.length; i++) {\n if (typeof arguments[i] === 'string') {\n m.push(arguments[i]);\n } else {\n m.push(safeJSONStringify(arguments[i]));\n }\n }\n return m.join(' : ');\n}\n\nexport function arrayIndexOf(array: any[], item: any): number {\n // MSIE doesn't have array.indexOf\n var nativeIndexOf = Array.prototype.indexOf;\n if (array === null) {\n return -1;\n }\n if (nativeIndexOf && array.indexOf === nativeIndexOf) {\n return array.indexOf(item);\n }\n for (var i = 0, l = array.length; i < l; i++) {\n if (array[i] === item) {\n return i;\n }\n }\n return -1;\n}\n\n/** Applies a function f to all properties of an object.\n *\n * Function f gets 3 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function objectApply(object: any, f: Function) {\n for (var key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n f(object[key], key, object);\n }\n }\n}\n\n/** Return a list of objects own proerty keys\n *\n * @param {Object} object\n * @returns {Array}\n */\nexport function keys(object: any): string[] {\n var keys = [];\n objectApply(object, function(_, key) {\n keys.push(key);\n });\n return keys;\n}\n\n/** Return a list of object's own property values\n *\n * @param {Object} object\n * @returns {Array}\n */\nexport function values(object: any): any[] {\n var values = [];\n objectApply(object, function(value) {\n values.push(value);\n });\n return values;\n}\n\n/** Applies a function f to all elements of an array.\n *\n * Function f gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function apply(array: any[], f: Function, context?: any) {\n for (var i = 0; i < array.length; i++) {\n f.call(context || global, array[i], i, array);\n }\n}\n\n/** Maps all elements of the array and returns the result.\n *\n * Function f gets 4 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n * - reference to the destination array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function map(array: any[], f: Function): any[] {\n var result = [];\n for (var i = 0; i < array.length; i++) {\n result.push(f(array[i], i, array, result));\n }\n return result;\n}\n\n/** Maps all elements of the object and returns the result.\n *\n * Function f gets 4 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the source object\n * - reference to the destination object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function mapObject(object: any, f: Function): any {\n var result = {};\n objectApply(object, function(value, key) {\n result[key] = f(value);\n });\n return result;\n}\n\n/** Filters elements of the array using a test function.\n *\n * Function test gets 4 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n * - reference to the destination array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function filter(array: any[], test: Function): any[] {\n test =\n test ||\n function(value) {\n return !!value;\n };\n\n var result = [];\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array, result)) {\n result.push(array[i]);\n }\n }\n return result;\n}\n\n/** Filters properties of the object using a test function.\n *\n * Function test gets 4 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the source object\n * - reference to the destination object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function filterObject(object: Object, test: Function) {\n var result = {};\n objectApply(object, function(value, key) {\n if ((test && test(value, key, object, result)) || Boolean(value)) {\n result[key] = value;\n }\n });\n return result;\n}\n\n/** Flattens an object into a two-dimensional array.\n *\n * @param {Object} object\n * @return {Array} resulting array of [key, value] pairs\n */\nexport function flatten(object: Object): any[] {\n var result = [];\n objectApply(object, function(value, key) {\n result.push([key, value]);\n });\n return result;\n}\n\n/** Checks whether any element of the array passes the test.\n *\n * Function test gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function any(array: any[], test: Function): boolean {\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array)) {\n return true;\n }\n }\n return false;\n}\n\n/** Checks whether all elements of the array pass the test.\n *\n * Function test gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function all(array: any[], test: Function): boolean {\n for (var i = 0; i < array.length; i++) {\n if (!test(array[i], i, array)) {\n return false;\n }\n }\n return true;\n}\n\nexport function encodeParamsObject(data): string {\n return mapObject(data, function(value) {\n if (typeof value === 'object') {\n value = safeJSONStringify(value);\n }\n return encodeURIComponent(base64encode(value.toString()));\n });\n}\n\nexport function buildQueryString(data: any): string {\n var params = filterObject(data, function(value) {\n return value !== undefined;\n });\n\n var query = map(\n flatten(encodeParamsObject(params)),\n Util.method('join', '=')\n ).join('&');\n\n return query;\n}\n\n/**\n * See https://github.com/douglascrockford/JSON-js/blob/master/cycle.js\n *\n * Remove circular references from an object. Required for JSON.stringify in\n * React Native, which tends to blow up a lot.\n *\n * @param {any} object\n * @return {any} Decycled object\n */\nexport function decycleObject(object: any): any {\n var objects = [],\n paths = [];\n\n return (function derez(value, path) {\n var i, name, nu;\n\n switch (typeof value) {\n case 'object':\n if (!value) {\n return null;\n }\n for (i = 0; i < objects.length; i += 1) {\n if (objects[i] === value) {\n return { $ref: paths[i] };\n }\n }\n\n objects.push(value);\n paths.push(path);\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n nu = [];\n for (i = 0; i < value.length; i += 1) {\n nu[i] = derez(value[i], path + '[' + i + ']');\n }\n } else {\n nu = {};\n for (name in value) {\n if (Object.prototype.hasOwnProperty.call(value, name)) {\n nu[name] = derez(\n value[name],\n path + '[' + JSON.stringify(name) + ']'\n );\n }\n }\n }\n return nu;\n case 'number':\n case 'string':\n case 'boolean':\n return value;\n }\n })(object, '$');\n}\n\n/**\n * Provides a cross-browser and cross-platform way to safely stringify objects\n * into JSON. This is particularly necessary for ReactNative, where circular JSON\n * structures throw an exception.\n *\n * @param {any} source The object to stringify\n * @return {string} The serialized output.\n */\nexport function safeJSONStringify(source: any): string {\n try {\n return JSON.stringify(source);\n } catch (e) {\n return JSON.stringify(decycleObject(source));\n }\n}\n","import { stringify } from './utils/collections';\nimport Pusher from './pusher';\n\nclass Logger {\n debug(...args: any[]) {\n this.log(this.globalLog, args);\n }\n\n warn(...args: any[]) {\n this.log(this.globalLogWarn, args);\n }\n\n error(...args: any[]) {\n this.log(this.globalLogError, args);\n }\n\n private globalLog = (message: string) => {\n if (global.console && global.console.log) {\n global.console.log(message);\n }\n };\n\n private globalLogWarn(message: string) {\n if (global.console && global.console.warn) {\n global.console.warn(message);\n } else {\n this.globalLog(message);\n }\n }\n\n private globalLogError(message: string) {\n if (global.console && global.console.error) {\n global.console.error(message);\n } else {\n this.globalLogWarn(message);\n }\n }\n\n private log(\n defaultLoggingFunction: (message: string) => void,\n ...args: any[]\n ) {\n var message = stringify.apply(this, arguments);\n if (Pusher.log) {\n Pusher.log(message);\n } else if (Pusher.logToConsole) {\n const log = defaultLoggingFunction.bind(this);\n log(message);\n }\n }\n}\n\nexport default new Logger();\n","import Browser from '../browser';\nimport Logger from 'core/logger';\nimport JSONPRequest from '../dom/jsonp_request';\nimport { ScriptReceivers } from '../dom/script_receiver_factory';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport {\n AuthRequestType,\n AuthTransportCallback,\n InternalAuthOptions\n} from 'core/auth/options';\n\nvar jsonp: AuthTransport = function(\n context: Browser,\n query: string,\n authOptions: InternalAuthOptions,\n authRequestType: AuthRequestType,\n callback: AuthTransportCallback\n) {\n if (\n authOptions.headers !== undefined ||\n authOptions.headersProvider != null\n ) {\n Logger.warn(\n `To send headers with the ${authRequestType.toString()} request, you must use AJAX, rather than JSONP.`\n );\n }\n\n var callbackName = context.nextAuthCallbackID.toString();\n context.nextAuthCallbackID++;\n\n var document = context.getDocument();\n var script = document.createElement('script');\n // Hacked wrapper.\n context.auth_callbacks[callbackName] = function(data) {\n callback(null, data);\n };\n\n var callback_name = \"Pusher.auth_callbacks['\" + callbackName + \"']\";\n script.src =\n authOptions.endpoint +\n '?callback=' +\n encodeURIComponent(callback_name) +\n '&' +\n query;\n\n var head =\n document.getElementsByTagName('head')[0] || document.documentElement;\n head.insertBefore(script, head.firstChild);\n};\n\nexport default jsonp;\n","import ScriptReceiver from './script_receiver';\n\n/** Sends a generic HTTP GET request using a script tag.\n *\n * By constructing URL in a specific way, it can be used for loading\n * JavaScript resources or JSONP requests. It can notify about errors, but\n * only in certain environments. Please take care of monitoring the state of\n * the request yourself.\n *\n * @param {String} src\n */\nexport default class ScriptRequest {\n src: string;\n script: any;\n errorScript: any;\n\n constructor(src: string) {\n this.src = src;\n }\n\n send(receiver: ScriptReceiver) {\n var self = this;\n var errorString = 'Error loading ' + self.src;\n\n self.script = document.createElement('script');\n self.script.id = receiver.id;\n self.script.src = self.src;\n self.script.type = 'text/javascript';\n self.script.charset = 'UTF-8';\n\n if (self.script.addEventListener) {\n self.script.onerror = function() {\n receiver.callback(errorString);\n };\n self.script.onload = function() {\n receiver.callback(null);\n };\n } else {\n self.script.onreadystatechange = function() {\n if (\n self.script.readyState === 'loaded' ||\n self.script.readyState === 'complete'\n ) {\n receiver.callback(null);\n }\n };\n }\n\n // Opera<11.6 hack for missing onerror callback\n if (\n self.script.async === undefined &&\n (document).attachEvent &&\n /opera/i.test(navigator.userAgent)\n ) {\n self.errorScript = document.createElement('script');\n self.errorScript.id = receiver.id + '_error';\n self.errorScript.text = receiver.name + \"('\" + errorString + \"');\";\n self.script.async = self.errorScript.async = false;\n } else {\n self.script.async = true;\n }\n\n var head = document.getElementsByTagName('head')[0];\n head.insertBefore(self.script, head.firstChild);\n if (self.errorScript) {\n head.insertBefore(self.errorScript, self.script.nextSibling);\n }\n }\n\n /** Cleans up the DOM remains of the script request. */\n cleanup() {\n if (this.script) {\n this.script.onload = this.script.onerror = null;\n this.script.onreadystatechange = null;\n }\n if (this.script && this.script.parentNode) {\n this.script.parentNode.removeChild(this.script);\n }\n if (this.errorScript && this.errorScript.parentNode) {\n this.errorScript.parentNode.removeChild(this.errorScript);\n }\n this.script = null;\n this.errorScript = null;\n }\n}\n","import ScriptReceiver from './script_receiver';\nimport ScriptRequest from './script_request';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from '../runtime';\n\n/** Sends data via JSONP.\n *\n * Data is a key-value map. Its values are JSON-encoded and then passed\n * through base64. Finally, keys and encoded values are appended to the query\n * string.\n *\n * The class itself does not guarantee raising errors on failures, as it's not\n * possible to support such feature on all browsers. Instead, JSONP endpoint\n * should call back in a way that's easy to distinguish from browser calls,\n * for example by passing a second argument to the receiver.\n *\n * @param {String} url\n * @param {Object} data key-value map of data to be submitted\n */\nexport default class JSONPRequest {\n url: string;\n data: any;\n request: ScriptRequest;\n\n constructor(url: string, data: any) {\n this.url = url;\n this.data = data;\n }\n\n /** Sends the actual JSONP request.\n *\n * @param {ScriptReceiver} receiver\n */\n send(receiver: ScriptReceiver) {\n if (this.request) {\n return;\n }\n\n var query = Collections.buildQueryString(this.data);\n var url = this.url + '/' + receiver.number + '?' + query;\n this.request = Runtime.createScriptRequest(url);\n this.request.send(receiver);\n }\n\n /** Cleans up the DOM remains of the JSONP request. */\n cleanup() {\n if (this.request) {\n this.request.cleanup();\n }\n }\n}\n","import TimelineSender from 'core/timeline/timeline_sender';\nimport TimelineTransport from 'core/timeline/timeline_transport';\nimport Browser from 'runtime';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport { ScriptReceivers } from '../dom/script_receiver_factory';\n\nvar getAgent = function(sender: TimelineSender, useTLS: boolean) {\n return function(data: any, callback: Function) {\n var scheme = 'http' + (useTLS ? 's' : '') + '://';\n var url =\n scheme + (sender.host || sender.options.host) + sender.options.path;\n var request = Browser.createJSONPRequest(url, data);\n\n var receiver = Browser.ScriptReceivers.create(function(error, result) {\n ScriptReceivers.remove(receiver);\n request.cleanup();\n\n if (result && result.host) {\n sender.host = result.host;\n }\n if (callback) {\n callback(error, result);\n }\n });\n request.send(receiver);\n };\n};\n\nvar jsonp = {\n name: 'jsonp',\n getAgent\n};\n\nexport default jsonp;\n","import Defaults from '../defaults';\nimport { default as URLScheme, URLSchemeParams } from './url_scheme';\n\nfunction getGenericURL(\n baseScheme: string,\n params: URLSchemeParams,\n path: string\n): string {\n var scheme = baseScheme + (params.useTLS ? 's' : '');\n var host = params.useTLS ? params.hostTLS : params.hostNonTLS;\n return scheme + '://' + host + path;\n}\n\nfunction getGenericPath(key: string, queryString?: string): string {\n var path = '/app/' + key;\n var query =\n '?protocol=' +\n Defaults.PROTOCOL +\n '&client=js' +\n '&version=' +\n Defaults.VERSION +\n (queryString ? '&' + queryString : '');\n return path + query;\n}\n\nexport var ws: URLScheme = {\n getInitial: function(key: string, params: URLSchemeParams): string {\n var path = (params.httpPath || '') + getGenericPath(key, 'flash=false');\n return getGenericURL('ws', params, path);\n }\n};\n\nexport var http: URLScheme = {\n getInitial: function(key: string, params: URLSchemeParams): string {\n var path = (params.httpPath || '/pusher') + getGenericPath(key);\n return getGenericURL('http', params, path);\n }\n};\n\nexport var sockjs: URLScheme = {\n getInitial: function(key: string, params: URLSchemeParams): string {\n return getGenericURL('http', params, params.httpPath || '/pusher');\n },\n getPath: function(key: string, params: URLSchemeParams): string {\n return getGenericPath(key);\n }\n};\n","import Callback from './callback';\nimport * as Collections from '../utils/collections';\nimport CallbackTable from './callback_table';\n\nexport default class CallbackRegistry {\n _callbacks: CallbackTable;\n\n constructor() {\n this._callbacks = {};\n }\n\n get(name: string): Callback[] {\n return this._callbacks[prefix(name)];\n }\n\n add(name: string, callback: Function, context: any) {\n var prefixedEventName = prefix(name);\n this._callbacks[prefixedEventName] =\n this._callbacks[prefixedEventName] || [];\n this._callbacks[prefixedEventName].push({\n fn: callback,\n context: context\n });\n }\n\n remove(name?: string, callback?: Function, context?: any) {\n if (!name && !callback && !context) {\n this._callbacks = {};\n return;\n }\n\n var names = name ? [prefix(name)] : Collections.keys(this._callbacks);\n\n if (callback || context) {\n this.removeCallback(names, callback, context);\n } else {\n this.removeAllCallbacks(names);\n }\n }\n\n private removeCallback(names: string[], callback: Function, context: any) {\n Collections.apply(\n names,\n function(name) {\n this._callbacks[name] = Collections.filter(\n this._callbacks[name] || [],\n function(binding) {\n return (\n (callback && callback !== binding.fn) ||\n (context && context !== binding.context)\n );\n }\n );\n if (this._callbacks[name].length === 0) {\n delete this._callbacks[name];\n }\n },\n this\n );\n }\n\n private removeAllCallbacks(names: string[]) {\n Collections.apply(\n names,\n function(name) {\n delete this._callbacks[name];\n },\n this\n );\n }\n}\n\nfunction prefix(name: string): string {\n return '_' + name;\n}\n","import * as Collections from '../utils/collections';\nimport Callback from './callback';\nimport Metadata from '../channels/metadata';\nimport CallbackRegistry from './callback_registry';\n\n/** Manages callback bindings and event emitting.\n *\n * @param Function failThrough called when no listeners are bound to an event\n */\nexport default class Dispatcher {\n callbacks: CallbackRegistry;\n global_callbacks: Function[];\n failThrough: Function;\n\n constructor(failThrough?: Function) {\n this.callbacks = new CallbackRegistry();\n this.global_callbacks = [];\n this.failThrough = failThrough;\n }\n\n bind(eventName: string, callback: Function, context?: any) {\n this.callbacks.add(eventName, callback, context);\n return this;\n }\n\n bind_global(callback: Function) {\n this.global_callbacks.push(callback);\n return this;\n }\n\n unbind(eventName?: string, callback?: Function, context?: any) {\n this.callbacks.remove(eventName, callback, context);\n return this;\n }\n\n unbind_global(callback?: Function) {\n if (!callback) {\n this.global_callbacks = [];\n return this;\n }\n\n this.global_callbacks = Collections.filter(\n this.global_callbacks || [],\n c => c !== callback\n );\n\n return this;\n }\n\n unbind_all() {\n this.unbind();\n this.unbind_global();\n return this;\n }\n\n emit(eventName: string, data?: any, metadata?: Metadata): Dispatcher {\n for (var i = 0; i < this.global_callbacks.length; i++) {\n this.global_callbacks[i](eventName, data);\n }\n\n var callbacks = this.callbacks.get(eventName);\n var args = [];\n\n if (metadata) {\n // if there's a metadata argument, we need to call the callback with both\n // data and metadata regardless of whether data is undefined\n args.push(data, metadata);\n } else if (data) {\n // metadata is undefined, so we only need to call the callback with data\n // if data exists\n args.push(data);\n }\n\n if (callbacks && callbacks.length > 0) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].fn.apply(callbacks[i].context || global, args);\n }\n } else if (this.failThrough) {\n this.failThrough(eventName, data);\n }\n\n return this;\n }\n}\n","import Util from '../util';\nimport * as Collections from '../utils/collections';\nimport { default as EventsDispatcher } from '../events/dispatcher';\nimport Logger from '../logger';\nimport TransportHooks from './transport_hooks';\nimport Socket from '../socket';\nimport Runtime from 'runtime';\nimport Timeline from '../timeline/timeline';\nimport TransportConnectionOptions from './transport_connection_options';\n\n/** Provides universal API for transport connections.\n *\n * Transport connection is a low-level object that wraps a connection method\n * and exposes a simple evented interface for the connection state and\n * messaging. It does not implement Pusher-specific WebSocket protocol.\n *\n * Additionally, it fetches resources needed for transport to work and exposes\n * an interface for querying transport features.\n *\n * States:\n * - new - initial state after constructing the object\n * - initializing - during initialization phase, usually fetching resources\n * - intialized - ready to establish a connection\n * - connection - when connection is being established\n * - open - when connection ready to be used\n * - closed - after connection was closed be either side\n *\n * Emits:\n * - error - after the connection raised an error\n *\n * Options:\n * - useTLS - whether connection should be over TLS\n * - hostTLS - host to connect to when connection is over TLS\n * - hostNonTLS - host to connect to when connection is over TLS\n *\n * @param {String} key application key\n * @param {Object} options\n */\nexport default class TransportConnection extends EventsDispatcher {\n hooks: TransportHooks;\n name: string;\n priority: number;\n key: string;\n options: TransportConnectionOptions;\n state: string;\n timeline: Timeline;\n activityTimeout: number;\n id: number;\n socket: Socket;\n beforeOpen: Function;\n initialize: Function;\n\n constructor(\n hooks: TransportHooks,\n name: string,\n priority: number,\n key: string,\n options: TransportConnectionOptions\n ) {\n super();\n this.initialize = Runtime.transportConnectionInitializer;\n this.hooks = hooks;\n this.name = name;\n this.priority = priority;\n this.key = key;\n this.options = options;\n\n this.state = 'new';\n this.timeline = options.timeline;\n this.activityTimeout = options.activityTimeout;\n this.id = this.timeline.generateUniqueID();\n }\n\n /** Checks whether the transport handles activity checks by itself.\n *\n * @return {Boolean}\n */\n handlesActivityChecks(): boolean {\n return Boolean(this.hooks.handlesActivityChecks);\n }\n\n /** Checks whether the transport supports the ping/pong API.\n *\n * @return {Boolean}\n */\n supportsPing(): boolean {\n return Boolean(this.hooks.supportsPing);\n }\n\n /** Tries to establish a connection.\n *\n * @returns {Boolean} false if transport is in invalid state\n */\n connect(): boolean {\n if (this.socket || this.state !== 'initialized') {\n return false;\n }\n\n var url = this.hooks.urls.getInitial(this.key, this.options);\n try {\n this.socket = this.hooks.getSocket(url, this.options);\n } catch (e) {\n Util.defer(() => {\n this.onError(e);\n this.changeState('closed');\n });\n return false;\n }\n\n this.bindListeners();\n\n Logger.debug('Connecting', { transport: this.name, url });\n this.changeState('connecting');\n return true;\n }\n\n /** Closes the connection.\n *\n * @return {Boolean} true if there was a connection to close\n */\n close(): boolean {\n if (this.socket) {\n this.socket.close();\n return true;\n } else {\n return false;\n }\n }\n\n /** Sends data over the open connection.\n *\n * @param {String} data\n * @return {Boolean} true only when in the \"open\" state\n */\n send(data: any): boolean {\n if (this.state === 'open') {\n // Workaround for MobileSafari bug (see https://gist.github.com/2052006)\n Util.defer(() => {\n if (this.socket) {\n this.socket.send(data);\n }\n });\n return true;\n } else {\n return false;\n }\n }\n\n /** Sends a ping if the connection is open and transport supports it. */\n ping() {\n if (this.state === 'open' && this.supportsPing()) {\n this.socket.ping();\n }\n }\n\n private onOpen() {\n if (this.hooks.beforeOpen) {\n this.hooks.beforeOpen(\n this.socket,\n this.hooks.urls.getPath(this.key, this.options)\n );\n }\n this.changeState('open');\n this.socket.onopen = undefined;\n }\n\n private onError(error) {\n this.emit('error', { type: 'WebSocketError', error: error });\n this.timeline.error(this.buildTimelineMessage({ error: error.toString() }));\n }\n\n private onClose(closeEvent?: any) {\n if (closeEvent) {\n this.changeState('closed', {\n code: closeEvent.code,\n reason: closeEvent.reason,\n wasClean: closeEvent.wasClean\n });\n } else {\n this.changeState('closed');\n }\n this.unbindListeners();\n this.socket = undefined;\n }\n\n private onMessage(message) {\n this.emit('message', message);\n }\n\n private onActivity() {\n this.emit('activity');\n }\n\n private bindListeners() {\n this.socket.onopen = () => {\n this.onOpen();\n };\n this.socket.onerror = error => {\n this.onError(error);\n };\n this.socket.onclose = closeEvent => {\n this.onClose(closeEvent);\n };\n this.socket.onmessage = message => {\n this.onMessage(message);\n };\n\n if (this.supportsPing()) {\n this.socket.onactivity = () => {\n this.onActivity();\n };\n }\n }\n\n private unbindListeners() {\n if (this.socket) {\n this.socket.onopen = undefined;\n this.socket.onerror = undefined;\n this.socket.onclose = undefined;\n this.socket.onmessage = undefined;\n if (this.supportsPing()) {\n this.socket.onactivity = undefined;\n }\n }\n }\n\n private changeState(state: string, params?: any) {\n this.state = state;\n this.timeline.info(\n this.buildTimelineMessage({\n state: state,\n params: params\n })\n );\n this.emit(state, params);\n }\n\n buildTimelineMessage(message): any {\n return Collections.extend({ cid: this.id }, message);\n }\n}\n","import Factory from '../utils/factory';\nimport TransportHooks from './transport_hooks';\nimport TransportConnection from './transport_connection';\nimport TransportConnectionOptions from './transport_connection_options';\n\n/** Provides interface for transport connection instantiation.\n *\n * Takes transport-specific hooks as the only argument, which allow checking\n * for transport support and creating its connections.\n *\n * Supported hooks: * - file - the name of the file to be fetched during initialization\n * - urls - URL scheme to be used by transport\n * - handlesActivityCheck - true when the transport handles activity checks\n * - supportsPing - true when the transport has a ping/activity API\n * - isSupported - tells whether the transport is supported in the environment\n * - getSocket - creates a WebSocket-compatible transport socket\n *\n * See transports.js for specific implementations.\n *\n * @param {Object} hooks object containing all needed transport hooks\n */\nexport default class Transport {\n hooks: TransportHooks;\n\n constructor(hooks: TransportHooks) {\n this.hooks = hooks;\n }\n\n /** Returns whether the transport is supported in the environment.\n *\n * @param {Object} envronment te environment details (encryption, settings)\n * @returns {Boolean} true when the transport is supported\n */\n isSupported(environment: any): boolean {\n return this.hooks.isSupported(environment);\n }\n\n /** Creates a transport connection.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {String} key the application key\n * @param {Object} options\n * @returns {TransportConnection}\n */\n createConnection(\n name: string,\n priority: number,\n key: string,\n options: any\n ): TransportConnection {\n return new TransportConnection(this.hooks, name, priority, key, options);\n }\n}\n","import * as URLSchemes from 'core/transports/url_schemes';\nimport URLScheme from 'core/transports/url_scheme';\nimport Transport from 'core/transports/transport';\nimport Util from 'core/util';\nimport * as Collections from 'core/utils/collections';\nimport TransportHooks from 'core/transports/transport_hooks';\nimport TransportsTable from 'core/transports/transports_table';\nimport Runtime from 'runtime';\n\n/** WebSocket transport.\n *\n * Uses native WebSocket implementation, including MozWebSocket supported by\n * earlier Firefox versions.\n */\nvar WSTransport = new Transport({\n urls: URLSchemes.ws,\n handlesActivityChecks: false,\n supportsPing: false,\n\n isInitialized: function() {\n return Boolean(Runtime.getWebSocketAPI());\n },\n isSupported: function(): boolean {\n return Boolean(Runtime.getWebSocketAPI());\n },\n getSocket: function(url) {\n return Runtime.createWebSocket(url);\n }\n});\n\nvar httpConfiguration = {\n urls: URLSchemes.http,\n handlesActivityChecks: false,\n supportsPing: true,\n isInitialized: function() {\n return true;\n }\n};\n\nexport var streamingConfiguration = Collections.extend(\n {\n getSocket: function(url) {\n return Runtime.HTTPFactory.createStreamingSocket(url);\n }\n },\n httpConfiguration\n);\nexport var pollingConfiguration = Collections.extend(\n {\n getSocket: function(url) {\n return Runtime.HTTPFactory.createPollingSocket(url);\n }\n },\n httpConfiguration\n);\n\nvar xhrConfiguration = {\n isSupported: function(): boolean {\n return Runtime.isXHRSupported();\n }\n};\n\n/** HTTP streaming transport using CORS-enabled XMLHttpRequest. */\nvar XHRStreamingTransport = new Transport(\n (\n Collections.extend({}, streamingConfiguration, xhrConfiguration)\n )\n);\n\n/** HTTP long-polling transport using CORS-enabled XMLHttpRequest. */\nvar XHRPollingTransport = new Transport(\n Collections.extend({}, pollingConfiguration, xhrConfiguration)\n);\n\nvar Transports: TransportsTable = {\n ws: WSTransport,\n xhr_streaming: XHRStreamingTransport,\n xhr_polling: XHRPollingTransport\n};\n\nexport default Transports;\n","import {\n default as Transports,\n streamingConfiguration,\n pollingConfiguration\n} from 'isomorphic/transports/transports';\nimport Transport from 'core/transports/transport';\nimport TransportHooks from 'core/transports/transport_hooks';\nimport * as URLSchemes from 'core/transports/url_schemes';\nimport Runtime from 'runtime';\nimport { Dependencies } from '../dom/dependencies';\nimport * as Collections from 'core/utils/collections';\n\nvar SockJSTransport = new Transport({\n file: 'sockjs',\n urls: URLSchemes.sockjs,\n handlesActivityChecks: true,\n supportsPing: false,\n\n isSupported: function() {\n return true;\n },\n isInitialized: function() {\n return window.SockJS !== undefined;\n },\n getSocket: function(url, options) {\n return new window.SockJS(url, null, {\n js_path: Dependencies.getPath('sockjs', {\n useTLS: options.useTLS\n }),\n ignore_null_origin: options.ignoreNullOrigin\n });\n },\n beforeOpen: function(socket, path) {\n socket.send(\n JSON.stringify({\n path: path\n })\n );\n }\n});\n\nvar xdrConfiguration = {\n isSupported: function(environment): boolean {\n var yes = Runtime.isXDRSupported(environment.useTLS);\n return yes;\n }\n};\n\n/** HTTP streaming transport using XDomainRequest (IE 8,9). */\nvar XDRStreamingTransport = new Transport(\n (\n Collections.extend({}, streamingConfiguration, xdrConfiguration)\n )\n);\n\n/** HTTP long-polling transport using XDomainRequest (IE 8,9). */\nvar XDRPollingTransport = new Transport(\n Collections.extend({}, pollingConfiguration, xdrConfiguration)\n);\n\nTransports.xdr_streaming = XDRStreamingTransport;\nTransports.xdr_polling = XDRPollingTransport;\nTransports.sockjs = SockJSTransport;\n\nexport default Transports;\n","import Reachability from 'core/reachability';\nimport { default as EventsDispatcher } from 'core/events/dispatcher';\n\n/** Really basic interface providing network availability info.\n *\n * Emits:\n * - online - when browser goes online\n * - offline - when browser goes offline\n */\nexport class NetInfo extends EventsDispatcher implements Reachability {\n constructor() {\n super();\n var self = this;\n // This is okay, as IE doesn't support this stuff anyway.\n if (window.addEventListener !== undefined) {\n window.addEventListener(\n 'online',\n function() {\n self.emit('online');\n },\n false\n );\n window.addEventListener(\n 'offline',\n function() {\n self.emit('offline');\n },\n false\n );\n }\n }\n\n /** Returns whether browser is online or not\n *\n * Offline means definitely offline (no connection to router).\n * Inverse does NOT mean definitely online (only currently supported in Safari\n * and even there only means the device has a connection to the router).\n *\n * @return {Boolean}\n */\n isOnline(): boolean {\n if (window.navigator.onLine === undefined) {\n return true;\n } else {\n return window.navigator.onLine;\n }\n }\n}\n\nexport var Network = new NetInfo();\n","import Util from '../util';\nimport * as Collections from '../utils/collections';\nimport TransportManager from './transport_manager';\nimport TransportConnection from './transport_connection';\nimport Transport from './transport';\nimport PingDelayOptions from './ping_delay_options';\n\n/** Creates transport connections monitored by a transport manager.\n *\n * When a transport is closed, it might mean the environment does not support\n * it. It's possible that messages get stuck in an intermediate buffer or\n * proxies terminate inactive connections. To combat these problems,\n * assistants monitor the connection lifetime, report unclean exits and\n * adjust ping timeouts to keep the connection active. The decision to disable\n * a transport is the manager's responsibility.\n *\n * @param {TransportManager} manager\n * @param {TransportConnection} transport\n * @param {Object} options\n */\nexport default class AssistantToTheTransportManager {\n manager: TransportManager;\n transport: Transport;\n minPingDelay: number;\n maxPingDelay: number;\n pingDelay: number;\n\n constructor(\n manager: TransportManager,\n transport: Transport,\n options: PingDelayOptions\n ) {\n this.manager = manager;\n this.transport = transport;\n this.minPingDelay = options.minPingDelay;\n this.maxPingDelay = options.maxPingDelay;\n this.pingDelay = undefined;\n }\n\n /** Creates a transport connection.\n *\n * This function has the same API as Transport#createConnection.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {String} key the application key\n * @param {Object} options\n * @returns {TransportConnection}\n */\n createConnection(\n name: string,\n priority: number,\n key: string,\n options: Object\n ): TransportConnection {\n options = Collections.extend({}, options, {\n activityTimeout: this.pingDelay\n });\n var connection = this.transport.createConnection(\n name,\n priority,\n key,\n options\n );\n\n var openTimestamp = null;\n\n var onOpen = function() {\n connection.unbind('open', onOpen);\n connection.bind('closed', onClosed);\n openTimestamp = Util.now();\n };\n var onClosed = closeEvent => {\n connection.unbind('closed', onClosed);\n\n if (closeEvent.code === 1002 || closeEvent.code === 1003) {\n // we don't want to use transports not obeying the protocol\n this.manager.reportDeath();\n } else if (!closeEvent.wasClean && openTimestamp) {\n // report deaths only for short-living transport\n var lifespan = Util.now() - openTimestamp;\n if (lifespan < 2 * this.maxPingDelay) {\n this.manager.reportDeath();\n this.pingDelay = Math.max(lifespan / 2, this.minPingDelay);\n }\n }\n };\n\n connection.bind('open', onOpen);\n return connection;\n }\n\n /** Returns whether the transport is supported in the environment.\n *\n * This function has the same API as Transport#isSupported. Might return false\n * when the manager decides to kill the transport.\n *\n * @param {Object} environment the environment details (encryption, settings)\n * @returns {Boolean} true when the transport is supported\n */\n isSupported(environment: string): boolean {\n return this.manager.isAlive() && this.transport.isSupported(environment);\n }\n}\n","import Action from './action';\nimport { PusherEvent } from './message-types';\n/**\n * Provides functions for handling Pusher protocol-specific messages.\n */\n\nconst Protocol = {\n /**\n * Decodes a message in a Pusher format.\n *\n * The MessageEvent we receive from the transport should contain a pusher event\n * (https://pusher.com/docs/pusher_protocol#events) serialized as JSON in the\n * data field\n *\n * The pusher event may contain a data field too, and it may also be\n * serialised as JSON\n *\n * Throws errors when messages are not parse'able.\n *\n * @param {MessageEvent} messageEvent\n * @return {PusherEvent}\n */\n decodeMessage: function(messageEvent: MessageEvent): PusherEvent {\n try {\n var messageData = JSON.parse(messageEvent.data);\n var pusherEventData = messageData.data;\n if (typeof pusherEventData === 'string') {\n try {\n pusherEventData = JSON.parse(messageData.data);\n } catch (e) {}\n }\n var pusherEvent: PusherEvent = {\n event: messageData.event,\n channel: messageData.channel,\n data: pusherEventData\n };\n if (messageData.user_id) {\n pusherEvent.user_id = messageData.user_id;\n }\n return pusherEvent;\n } catch (e) {\n throw { type: 'MessageParseError', error: e, data: messageEvent.data };\n }\n },\n\n /**\n * Encodes a message to be sent.\n *\n * @param {PusherEvent} event\n * @return {String}\n */\n encodeMessage: function(event: PusherEvent): string {\n return JSON.stringify(event);\n },\n\n /**\n * Processes a handshake message and returns appropriate actions.\n *\n * Returns an object with an 'action' and other action-specific properties.\n *\n * There are three outcomes when calling this function. First is a successful\n * connection attempt, when pusher:connection_established is received, which\n * results in a 'connected' action with an 'id' property. When passed a\n * pusher:error event, it returns a result with action appropriate to the\n * close code and an error. Otherwise, it raises an exception.\n *\n * @param {String} message\n * @result Object\n */\n processHandshake: function(messageEvent: MessageEvent): Action {\n var message = Protocol.decodeMessage(messageEvent);\n\n if (message.event === 'pusher:connection_established') {\n if (!message.data.activity_timeout) {\n throw 'No activity timeout specified in handshake';\n }\n return {\n action: 'connected',\n id: message.data.socket_id,\n activityTimeout: message.data.activity_timeout * 1000\n };\n } else if (message.event === 'pusher:error') {\n // From protocol 6 close codes are sent only once, so this only\n // happens when connection does not support close codes\n return {\n action: this.getCloseAction(message.data),\n error: this.getCloseError(message.data)\n };\n } else {\n throw 'Invalid handshake';\n }\n },\n\n /**\n * Dispatches the close event and returns an appropriate action name.\n *\n * See:\n * 1. https://developer.mozilla.org/en-US/docs/WebSockets/WebSockets_reference/CloseEvent\n * 2. http://pusher.com/docs/pusher_protocol\n *\n * @param {CloseEvent} closeEvent\n * @return {String} close action name\n */\n getCloseAction: function(closeEvent): string {\n if (closeEvent.code < 4000) {\n // ignore 1000 CLOSE_NORMAL, 1001 CLOSE_GOING_AWAY,\n // 1005 CLOSE_NO_STATUS, 1006 CLOSE_ABNORMAL\n // ignore 1007...3999\n // handle 1002 CLOSE_PROTOCOL_ERROR, 1003 CLOSE_UNSUPPORTED,\n // 1004 CLOSE_TOO_LARGE\n if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {\n return 'backoff';\n } else {\n return null;\n }\n } else if (closeEvent.code === 4000) {\n return 'tls_only';\n } else if (closeEvent.code < 4100) {\n return 'refused';\n } else if (closeEvent.code < 4200) {\n return 'backoff';\n } else if (closeEvent.code < 4300) {\n return 'retry';\n } else {\n // unknown error\n return 'refused';\n }\n },\n\n /**\n * Returns an error or null basing on the close event.\n *\n * Null is returned when connection was closed cleanly. Otherwise, an object\n * with error details is returned.\n *\n * @param {CloseEvent} closeEvent\n * @return {Object} error object\n */\n getCloseError: function(closeEvent): any {\n if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {\n return {\n type: 'PusherError',\n data: {\n code: closeEvent.code,\n message: closeEvent.reason || closeEvent.message\n }\n };\n } else {\n return null;\n }\n }\n};\n\nexport default Protocol;\n","import * as Collections from '../utils/collections';\nimport { default as EventsDispatcher } from '../events/dispatcher';\nimport Protocol from './protocol/protocol';\nimport { PusherEvent } from './protocol/message-types';\nimport Logger from '../logger';\nimport TransportConnection from '../transports/transport_connection';\nimport Socket from '../socket';\n/**\n * Provides Pusher protocol interface for transports.\n *\n * Emits following events:\n * - message - on received messages\n * - ping - on ping requests\n * - pong - on pong responses\n * - error - when the transport emits an error\n * - closed - after closing the transport\n *\n * It also emits more events when connection closes with a code.\n * See Protocol.getCloseAction to get more details.\n *\n * @param {Number} id\n * @param {AbstractTransport} transport\n */\nexport default class Connection extends EventsDispatcher implements Socket {\n id: string;\n transport: TransportConnection;\n activityTimeout: number;\n\n constructor(id: string, transport: TransportConnection) {\n super();\n this.id = id;\n this.transport = transport;\n this.activityTimeout = transport.activityTimeout;\n this.bindListeners();\n }\n\n /** Returns whether used transport handles activity checks by itself\n *\n * @returns {Boolean} true if activity checks are handled by the transport\n */\n handlesActivityChecks() {\n return this.transport.handlesActivityChecks();\n }\n\n /** Sends raw data.\n *\n * @param {String} data\n */\n send(data: any): boolean {\n return this.transport.send(data);\n }\n\n /** Sends an event.\n *\n * @param {String} name\n * @param {String} data\n * @param {String} [channel]\n * @returns {Boolean} whether message was sent or not\n */\n send_event(name: string, data: any, channel?: string): boolean {\n var event: PusherEvent = { event: name, data: data };\n if (channel) {\n event.channel = channel;\n }\n Logger.debug('Event sent', event);\n return this.send(Protocol.encodeMessage(event));\n }\n\n /** Sends a ping message to the server.\n *\n * Basing on the underlying transport, it might send either transport's\n * protocol-specific ping or pusher:ping event.\n */\n ping() {\n if (this.transport.supportsPing()) {\n this.transport.ping();\n } else {\n this.send_event('pusher:ping', {});\n }\n }\n\n /** Closes the connection. */\n close() {\n this.transport.close();\n }\n\n private bindListeners() {\n var listeners = {\n message: (messageEvent: MessageEvent) => {\n var pusherEvent;\n try {\n pusherEvent = Protocol.decodeMessage(messageEvent);\n } catch (e) {\n this.emit('error', {\n type: 'MessageParseError',\n error: e,\n data: messageEvent.data\n });\n }\n\n if (pusherEvent !== undefined) {\n Logger.debug('Event recd', pusherEvent);\n\n switch (pusherEvent.event) {\n case 'pusher:error':\n this.emit('error', {\n type: 'PusherError',\n data: pusherEvent.data\n });\n break;\n case 'pusher:ping':\n this.emit('ping');\n break;\n case 'pusher:pong':\n this.emit('pong');\n break;\n }\n this.emit('message', pusherEvent);\n }\n },\n activity: () => {\n this.emit('activity');\n },\n error: error => {\n this.emit('error', error);\n },\n closed: closeEvent => {\n unbindListeners();\n\n if (closeEvent && closeEvent.code) {\n this.handleCloseEvent(closeEvent);\n }\n\n this.transport = null;\n this.emit('closed');\n }\n };\n\n var unbindListeners = () => {\n Collections.objectApply(listeners, (listener, event) => {\n this.transport.unbind(event, listener);\n });\n };\n\n Collections.objectApply(listeners, (listener, event) => {\n this.transport.bind(event, listener);\n });\n }\n\n private handleCloseEvent(closeEvent: any) {\n var action = Protocol.getCloseAction(closeEvent);\n var error = Protocol.getCloseError(closeEvent);\n if (error) {\n this.emit('error', error);\n }\n if (action) {\n this.emit(action, { action: action, error: error });\n }\n }\n}\n","import Util from '../../util';\nimport * as Collections from '../../utils/collections';\nimport Protocol from '../protocol/protocol';\nimport Connection from '../connection';\nimport TransportConnection from '../../transports/transport_connection';\nimport HandshakePayload from './handshake_payload';\n\n/**\n * Handles Pusher protocol handshakes for transports.\n *\n * Calls back with a result object after handshake is completed. Results\n * always have two fields:\n * - action - string describing action to be taken after the handshake\n * - transport - the transport object passed to the constructor\n *\n * Different actions can set different additional properties on the result.\n * In the case of 'connected' action, there will be a 'connection' property\n * containing a Connection object for the transport. Other actions should\n * carry an 'error' property.\n *\n * @param {AbstractTransport} transport\n * @param {Function} callback\n */\nexport default class Handshake {\n transport: TransportConnection;\n callback: (HandshakePayload) => void;\n onMessage: Function;\n onClosed: Function;\n\n constructor(\n transport: TransportConnection,\n callback: (HandshakePayload) => void\n ) {\n this.transport = transport;\n this.callback = callback;\n this.bindListeners();\n }\n\n close() {\n this.unbindListeners();\n this.transport.close();\n }\n\n private bindListeners() {\n this.onMessage = m => {\n this.unbindListeners();\n\n var result;\n try {\n result = Protocol.processHandshake(m);\n } catch (e) {\n this.finish('error', { error: e });\n this.transport.close();\n return;\n }\n\n if (result.action === 'connected') {\n this.finish('connected', {\n connection: new Connection(result.id, this.transport),\n activityTimeout: result.activityTimeout\n });\n } else {\n this.finish(result.action, { error: result.error });\n this.transport.close();\n }\n };\n\n this.onClosed = closeEvent => {\n this.unbindListeners();\n\n var action = Protocol.getCloseAction(closeEvent) || 'backoff';\n var error = Protocol.getCloseError(closeEvent);\n this.finish(action, { error: error });\n };\n\n this.transport.bind('message', this.onMessage);\n this.transport.bind('closed', this.onClosed);\n }\n\n private unbindListeners() {\n this.transport.unbind('message', this.onMessage);\n this.transport.unbind('closed', this.onClosed);\n }\n\n private finish(action: string, params: any) {\n this.callback(\n Collections.extend({ transport: this.transport, action: action }, params)\n );\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport base64encode from '../base64';\nimport Timeline from './timeline';\nimport Runtime from 'runtime';\n\nexport interface TimelineSenderOptions {\n host?: string;\n port?: number;\n path?: string;\n}\n\nexport default class TimelineSender {\n timeline: Timeline;\n options: TimelineSenderOptions;\n host: string;\n\n constructor(timeline: Timeline, options: TimelineSenderOptions) {\n this.timeline = timeline;\n this.options = options || {};\n }\n\n send(useTLS: boolean, callback?: Function) {\n if (this.timeline.isEmpty()) {\n return;\n }\n\n this.timeline.send(\n Runtime.TimelineTransport.getAgent(this, useTLS),\n callback\n );\n }\n}\n","import { default as EventsDispatcher } from '../events/dispatcher';\nimport * as Errors from '../errors';\nimport Logger from '../logger';\nimport Pusher from '../pusher';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport Metadata from './metadata';\nimport UrlStore from '../utils/url_store';\nimport {\n ChannelAuthorizationData,\n ChannelAuthorizationCallback\n} from '../auth/options';\nimport { HTTPAuthError } from '../errors';\n\n/** Provides base public channel interface with an event emitter.\n *\n * Emits:\n * - pusher:subscription_succeeded - after subscribing successfully\n * - other non-internal events\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class Channel extends EventsDispatcher {\n name: string;\n pusher: Pusher;\n subscribed: boolean;\n subscriptionPending: boolean;\n subscriptionCancelled: boolean;\n subscriptionCount: null;\n\n constructor(name: string, pusher: Pusher) {\n super(function(event, data) {\n Logger.debug('No callbacks on ' + name + ' for ' + event);\n });\n\n this.name = name;\n this.pusher = pusher;\n this.subscribed = false;\n this.subscriptionPending = false;\n this.subscriptionCancelled = false;\n }\n\n /** Skips authorization, since public channels don't require it.\n *\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n return callback(null, { auth: '' });\n }\n\n /** Triggers an event */\n trigger(event: string, data: any) {\n if (event.indexOf('client-') !== 0) {\n throw new Errors.BadEventName(\n \"Event '\" + event + \"' does not start with 'client-'\"\n );\n }\n if (!this.subscribed) {\n var suffix = UrlStore.buildLogSuffix('triggeringClientEvents');\n Logger.warn(\n `Client event triggered before channel 'subscription_succeeded' event . ${suffix}`\n );\n }\n return this.pusher.send_event(event, data, this.name);\n }\n\n /** Signals disconnection to the channel. For internal use only. */\n disconnect() {\n this.subscribed = false;\n this.subscriptionPending = false;\n }\n\n /** Handles a PusherEvent. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n if (eventName === 'pusher_internal:subscription_succeeded') {\n this.handleSubscriptionSucceededEvent(event);\n } else if (eventName === 'pusher_internal:subscription_count') {\n this.handleSubscriptionCountEvent(event);\n } else if (eventName.indexOf('pusher_internal:') !== 0) {\n var metadata: Metadata = {};\n this.emit(eventName, data, metadata);\n }\n }\n\n handleSubscriptionSucceededEvent(event: PusherEvent) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n } else {\n this.emit('pusher:subscription_succeeded', event.data);\n }\n }\n\n handleSubscriptionCountEvent(event: PusherEvent) {\n if (event.data.subscription_count) {\n this.subscriptionCount = event.data.subscription_count;\n }\n\n this.emit('pusher:subscription_count', event.data);\n }\n\n /** Sends a subscription request. For internal use only. */\n subscribe() {\n if (this.subscribed) {\n return;\n }\n this.subscriptionPending = true;\n this.subscriptionCancelled = false;\n this.authorize(\n this.pusher.connection.socket_id,\n (error: Error | null, data: ChannelAuthorizationData) => {\n if (error) {\n this.subscriptionPending = false;\n // Why not bind to 'pusher:subscription_error' a level up, and log there?\n // Binding to this event would cause the warning about no callbacks being\n // bound (see constructor) to be suppressed, that's not what we want.\n Logger.error(error.toString());\n this.emit(\n 'pusher:subscription_error',\n Object.assign(\n {},\n {\n type: 'AuthError',\n error: error.message\n },\n error instanceof HTTPAuthError ? { status: error.status } : {}\n )\n );\n } else {\n this.pusher.send_event('pusher:subscribe', {\n auth: data.auth,\n channel_data: data.channel_data,\n channel: this.name\n });\n }\n }\n );\n }\n\n /** Sends an unsubscription request. For internal use only. */\n unsubscribe() {\n this.subscribed = false;\n this.pusher.send_event('pusher:unsubscribe', {\n channel: this.name\n });\n }\n\n /** Cancels an in progress subscription. For internal use only. */\n cancelSubscription() {\n this.subscriptionCancelled = true;\n }\n\n /** Reinstates an in progress subscripiton. For internal use only. */\n reinstateSubscription() {\n this.subscriptionCancelled = false;\n }\n}\n","import Factory from '../utils/factory';\nimport Channel from './channel';\nimport { ChannelAuthorizationCallback } from '../auth/options';\n\n/** Extends public channels to provide private channel interface.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class PrivateChannel extends Channel {\n /** Authorizes the connection to use the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n return this.pusher.config.channelAuthorizer(\n {\n channelName: this.name,\n socketId: socketId\n },\n callback\n );\n }\n}\n","import * as Collections from '../utils/collections';\n\n/** Represents a collection of members of a presence channel. */\nexport default class Members {\n members: any;\n count: number;\n myID: any;\n me: any;\n\n constructor() {\n this.reset();\n }\n\n /** Returns member's info for given id.\n *\n * Resulting object containts two fields - id and info.\n *\n * @param {Number} id\n * @return {Object} member's info or null\n */\n get(id: string): any {\n if (Object.prototype.hasOwnProperty.call(this.members, id)) {\n return {\n id: id,\n info: this.members[id]\n };\n } else {\n return null;\n }\n }\n\n /** Calls back for each member in unspecified order.\n *\n * @param {Function} callback\n */\n each(callback: Function) {\n Collections.objectApply(this.members, (member, id) => {\n callback(this.get(id));\n });\n }\n\n /** Updates the id for connected member. For internal use only. */\n setMyID(id: string) {\n this.myID = id;\n }\n\n /** Handles subscription data. For internal use only. */\n onSubscription(subscriptionData: any) {\n this.members = subscriptionData.presence.hash;\n this.count = subscriptionData.presence.count;\n this.me = this.get(this.myID);\n }\n\n /** Adds a new member to the collection. For internal use only. */\n addMember(memberData: any) {\n if (this.get(memberData.user_id) === null) {\n this.count++;\n }\n this.members[memberData.user_id] = memberData.user_info;\n return this.get(memberData.user_id);\n }\n\n /** Adds a member from the collection. For internal use only. */\n removeMember(memberData: any) {\n var member = this.get(memberData.user_id);\n if (member) {\n delete this.members[memberData.user_id];\n this.count--;\n }\n return member;\n }\n\n /** Resets the collection to the initial state. For internal use only. */\n reset() {\n this.members = {};\n this.count = 0;\n this.myID = null;\n this.me = null;\n }\n}\n","import PrivateChannel from './private_channel';\nimport Logger from '../logger';\nimport Members from './members';\nimport Pusher from '../pusher';\nimport UrlStore from 'core/utils/url_store';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport Metadata from './metadata';\nimport { ChannelAuthorizationData } from '../auth/options';\n\nexport default class PresenceChannel extends PrivateChannel {\n members: Members;\n\n /** Adds presence channel functionality to private channels.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\n constructor(name: string, pusher: Pusher) {\n super(name, pusher);\n this.members = new Members();\n }\n\n /** Authorizes the connection as a member of the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: Function) {\n super.authorize(socketId, async (error, authData) => {\n if (!error) {\n authData = authData as ChannelAuthorizationData;\n if (authData.channel_data != null) {\n var channelData = JSON.parse(authData.channel_data);\n this.members.setMyID(channelData.user_id);\n } else {\n await this.pusher.user.signinDonePromise;\n if (this.pusher.user.user_data != null) {\n // If the user is signed in, get the id of the authenticated user\n // and allow the presence authorization to continue.\n this.members.setMyID(this.pusher.user.user_data.id);\n } else {\n let suffix = UrlStore.buildLogSuffix('authorizationEndpoint');\n Logger.error(\n `Invalid auth response for channel '${this.name}', ` +\n `expected 'channel_data' field. ${suffix}, ` +\n `or the user should be signed in.`\n );\n callback('Invalid auth response');\n return;\n }\n }\n }\n callback(error, authData);\n });\n }\n\n /** Handles presence and subscription events. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n if (eventName.indexOf('pusher_internal:') === 0) {\n this.handleInternalEvent(event);\n } else {\n var data = event.data;\n var metadata: Metadata = {};\n if (event.user_id) {\n metadata.user_id = event.user_id;\n }\n this.emit(eventName, data, metadata);\n }\n }\n handleInternalEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n switch (eventName) {\n case 'pusher_internal:subscription_succeeded':\n this.handleSubscriptionSucceededEvent(event);\n break;\n case 'pusher_internal:subscription_count':\n this.handleSubscriptionCountEvent(event);\n break;\n case 'pusher_internal:member_added':\n var addedMember = this.members.addMember(data);\n this.emit('pusher:member_added', addedMember);\n break;\n case 'pusher_internal:member_removed':\n var removedMember = this.members.removeMember(data);\n if (removedMember) {\n this.emit('pusher:member_removed', removedMember);\n }\n break;\n }\n }\n\n handleSubscriptionSucceededEvent(event: PusherEvent) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n } else {\n this.members.onSubscription(event.data);\n this.emit('pusher:subscription_succeeded', this.members);\n }\n }\n\n /** Resets the channel state, including members map. For internal use only. */\n disconnect() {\n this.members.reset();\n super.disconnect();\n }\n}\n","import PrivateChannel from './private_channel';\nimport * as Errors from '../errors';\nimport Logger from '../logger';\nimport Pusher from '../pusher';\nimport { decode as encodeUTF8 } from '@stablelib/utf8';\nimport { decode as decodeBase64 } from '@stablelib/base64';\nimport Dispatcher from '../events/dispatcher';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport {\n ChannelAuthorizationData,\n ChannelAuthorizationCallback\n} from '../auth/options';\nimport * as nacl from 'tweetnacl';\n\n/** Extends private channels to provide encrypted channel interface.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class EncryptedChannel extends PrivateChannel {\n key: Uint8Array = null;\n nacl: nacl;\n\n constructor(name: string, pusher: Pusher, nacl: nacl) {\n super(name, pusher);\n this.nacl = nacl;\n }\n\n /** Authorizes the connection to use the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n super.authorize(\n socketId,\n (error: Error | null, authData: ChannelAuthorizationData) => {\n if (error) {\n callback(error, authData);\n return;\n }\n let sharedSecret = authData['shared_secret'];\n if (!sharedSecret) {\n callback(\n new Error(\n `No shared_secret key in auth payload for encrypted channel: ${this.name}`\n ),\n null\n );\n return;\n }\n this.key = decodeBase64(sharedSecret);\n delete authData['shared_secret'];\n callback(null, authData);\n }\n );\n }\n\n trigger(event: string, data: any): boolean {\n throw new Errors.UnsupportedFeature(\n 'Client events are not currently supported for encrypted channels'\n );\n }\n\n /** Handles an event. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n if (\n eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0\n ) {\n super.handleEvent(event);\n return;\n }\n this.handleEncryptedEvent(eventName, data);\n }\n\n private handleEncryptedEvent(event: string, data: any): void {\n if (!this.key) {\n Logger.debug(\n 'Received encrypted event before key has been retrieved from the authEndpoint'\n );\n return;\n }\n if (!data.ciphertext || !data.nonce) {\n Logger.error(\n 'Unexpected format for encrypted event, expected object with `ciphertext` and `nonce` fields, got: ' +\n data\n );\n return;\n }\n let cipherText = decodeBase64(data.ciphertext);\n if (cipherText.length < this.nacl.secretbox.overheadLength) {\n Logger.error(\n `Expected encrypted event ciphertext length to be ${this.nacl.secretbox.overheadLength}, got: ${cipherText.length}`\n );\n return;\n }\n let nonce = decodeBase64(data.nonce);\n if (nonce.length < this.nacl.secretbox.nonceLength) {\n Logger.error(\n `Expected encrypted event nonce length to be ${this.nacl.secretbox.nonceLength}, got: ${nonce.length}`\n );\n return;\n }\n\n let bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n Logger.debug(\n 'Failed to decrypt an event, probably because it was encrypted with a different key. Fetching a new key from the authEndpoint...'\n );\n // Try a single time to retrieve a new auth key and decrypt the event with it\n // If this fails, a new key will be requested when a new message is received\n this.authorize(this.pusher.connection.socket_id, (error, authData) => {\n if (error) {\n Logger.error(\n `Failed to make a request to the authEndpoint: ${authData}. Unable to fetch new key, so dropping encrypted event`\n );\n return;\n }\n bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n Logger.error(\n `Failed to decrypt event with new key. Dropping encrypted event`\n );\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n return;\n });\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n }\n\n // Try and parse the decrypted bytes as JSON. If we can't parse it, just\n // return the utf-8 string\n getDataToEmit(bytes: Uint8Array): string {\n let raw = encodeUTF8(bytes);\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n }\n}\n","import { default as EventsDispatcher } from '../events/dispatcher';\nimport { OneOffTimer as Timer } from '../utils/timers';\nimport { Config } from '../config';\nimport Logger from '../logger';\nimport HandshakePayload from './handshake/handshake_payload';\nimport Connection from './connection';\nimport Strategy from '../strategies/strategy';\nimport StrategyRunner from '../strategies/strategy_runner';\nimport * as Collections from '../utils/collections';\nimport Timeline from '../timeline/timeline';\nimport ConnectionManagerOptions from './connection_manager_options';\nimport Runtime from 'runtime';\n\nimport {\n ErrorCallbacks,\n HandshakeCallbacks,\n ConnectionCallbacks\n} from './callbacks';\nimport Action from './protocol/action';\n\n/** Manages connection to Pusher.\n *\n * Uses a strategy (currently only default), timers and network availability\n * info to establish a connection and export its state. In case of failures,\n * manages reconnection attempts.\n *\n * Exports state changes as following events:\n * - \"state_change\", { previous: p, current: state }\n * - state\n *\n * States:\n * - initialized - initial state, never transitioned to\n * - connecting - connection is being established\n * - connected - connection has been fully established\n * - disconnected - on requested disconnection\n * - unavailable - after connection timeout or when there's no network\n * - failed - when the connection strategy is not supported\n *\n * Options:\n * - unavailableTimeout - time to transition to unavailable state\n * - activityTimeout - time after which ping message should be sent\n * - pongTimeout - time for Pusher to respond with pong before reconnecting\n *\n * @param {String} key application key\n * @param {Object} options\n */\nexport default class ConnectionManager extends EventsDispatcher {\n key: string;\n options: ConnectionManagerOptions;\n state: string;\n connection: Connection;\n usingTLS: boolean;\n timeline: Timeline;\n socket_id: string;\n unavailableTimer: Timer;\n activityTimer: Timer;\n retryTimer: Timer;\n activityTimeout: number;\n strategy: Strategy;\n runner: StrategyRunner;\n errorCallbacks: ErrorCallbacks;\n handshakeCallbacks: HandshakeCallbacks;\n connectionCallbacks: ConnectionCallbacks;\n\n constructor(key: string, options: ConnectionManagerOptions) {\n super();\n this.state = 'initialized';\n this.connection = null;\n\n this.key = key;\n this.options = options;\n this.timeline = this.options.timeline;\n this.usingTLS = this.options.useTLS;\n\n this.errorCallbacks = this.buildErrorCallbacks();\n this.connectionCallbacks = this.buildConnectionCallbacks(\n this.errorCallbacks\n );\n this.handshakeCallbacks = this.buildHandshakeCallbacks(this.errorCallbacks);\n\n var Network = Runtime.getNetwork();\n\n Network.bind('online', () => {\n this.timeline.info({ netinfo: 'online' });\n if (this.state === 'connecting' || this.state === 'unavailable') {\n this.retryIn(0);\n }\n });\n Network.bind('offline', () => {\n this.timeline.info({ netinfo: 'offline' });\n if (this.connection) {\n this.sendActivityCheck();\n }\n });\n\n this.updateStrategy();\n }\n\n /** Establishes a connection to Pusher.\n *\n * Does nothing when connection is already established. See top-level doc\n * to find events emitted on connection attempts.\n */\n connect() {\n if (this.connection || this.runner) {\n return;\n }\n if (!this.strategy.isSupported()) {\n this.updateState('failed');\n return;\n }\n this.updateState('connecting');\n this.startConnecting();\n this.setUnavailableTimer();\n }\n\n /** Sends raw data.\n *\n * @param {String} data\n */\n send(data) {\n if (this.connection) {\n return this.connection.send(data);\n } else {\n return false;\n }\n }\n\n /** Sends an event.\n *\n * @param {String} name\n * @param {String} data\n * @param {String} [channel]\n * @returns {Boolean} whether message was sent or not\n */\n send_event(name: string, data: any, channel?: string) {\n if (this.connection) {\n return this.connection.send_event(name, data, channel);\n } else {\n return false;\n }\n }\n\n /** Closes the connection. */\n disconnect() {\n this.disconnectInternally();\n this.updateState('disconnected');\n }\n\n isUsingTLS() {\n return this.usingTLS;\n }\n\n private startConnecting() {\n var callback = (error, handshake) => {\n if (error) {\n this.runner = this.strategy.connect(0, callback);\n } else {\n if (handshake.action === 'error') {\n this.emit('error', {\n type: 'HandshakeError',\n error: handshake.error\n });\n this.timeline.error({ handshakeError: handshake.error });\n } else {\n this.abortConnecting(); // we don't support switching connections yet\n this.handshakeCallbacks[handshake.action](handshake);\n }\n }\n };\n this.runner = this.strategy.connect(0, callback);\n }\n\n private abortConnecting() {\n if (this.runner) {\n this.runner.abort();\n this.runner = null;\n }\n }\n\n private disconnectInternally() {\n this.abortConnecting();\n this.clearRetryTimer();\n this.clearUnavailableTimer();\n if (this.connection) {\n var connection = this.abandonConnection();\n connection.close();\n }\n }\n\n private updateStrategy() {\n this.strategy = this.options.getStrategy({\n key: this.key,\n timeline: this.timeline,\n useTLS: this.usingTLS\n });\n }\n\n private retryIn(delay) {\n this.timeline.info({ action: 'retry', delay: delay });\n if (delay > 0) {\n this.emit('connecting_in', Math.round(delay / 1000));\n }\n this.retryTimer = new Timer(delay || 0, () => {\n this.disconnectInternally();\n this.connect();\n });\n }\n\n private clearRetryTimer() {\n if (this.retryTimer) {\n this.retryTimer.ensureAborted();\n this.retryTimer = null;\n }\n }\n\n private setUnavailableTimer() {\n this.unavailableTimer = new Timer(this.options.unavailableTimeout, () => {\n this.updateState('unavailable');\n });\n }\n\n private clearUnavailableTimer() {\n if (this.unavailableTimer) {\n this.unavailableTimer.ensureAborted();\n }\n }\n\n private sendActivityCheck() {\n this.stopActivityCheck();\n this.connection.ping();\n // wait for pong response\n this.activityTimer = new Timer(this.options.pongTimeout, () => {\n this.timeline.error({ pong_timed_out: this.options.pongTimeout });\n this.retryIn(0);\n });\n }\n\n private resetActivityCheck() {\n this.stopActivityCheck();\n // send ping after inactivity\n if (this.connection && !this.connection.handlesActivityChecks()) {\n this.activityTimer = new Timer(this.activityTimeout, () => {\n this.sendActivityCheck();\n });\n }\n }\n\n private stopActivityCheck() {\n if (this.activityTimer) {\n this.activityTimer.ensureAborted();\n }\n }\n\n private buildConnectionCallbacks(\n errorCallbacks: ErrorCallbacks\n ): ConnectionCallbacks {\n return Collections.extend({}, errorCallbacks, {\n message: message => {\n // includes pong messages from server\n this.resetActivityCheck();\n this.emit('message', message);\n },\n ping: () => {\n this.send_event('pusher:pong', {});\n },\n activity: () => {\n this.resetActivityCheck();\n },\n error: error => {\n // just emit error to user - socket will already be closed by browser\n this.emit('error', error);\n },\n closed: () => {\n this.abandonConnection();\n if (this.shouldRetry()) {\n this.retryIn(1000);\n }\n }\n });\n }\n\n private buildHandshakeCallbacks(\n errorCallbacks: ErrorCallbacks\n ): HandshakeCallbacks {\n return Collections.extend({}, errorCallbacks, {\n connected: (handshake: HandshakePayload) => {\n this.activityTimeout = Math.min(\n this.options.activityTimeout,\n handshake.activityTimeout,\n handshake.connection.activityTimeout || Infinity\n );\n this.clearUnavailableTimer();\n this.setConnection(handshake.connection);\n this.socket_id = this.connection.id;\n this.updateState('connected', { socket_id: this.socket_id });\n }\n });\n }\n\n private buildErrorCallbacks(): ErrorCallbacks {\n let withErrorEmitted = callback => {\n return (result: Action | HandshakePayload) => {\n if (result.error) {\n this.emit('error', { type: 'WebSocketError', error: result.error });\n }\n callback(result);\n };\n };\n\n return {\n tls_only: withErrorEmitted(() => {\n this.usingTLS = true;\n this.updateStrategy();\n this.retryIn(0);\n }),\n refused: withErrorEmitted(() => {\n this.disconnect();\n }),\n backoff: withErrorEmitted(() => {\n this.retryIn(1000);\n }),\n retry: withErrorEmitted(() => {\n this.retryIn(0);\n })\n };\n }\n\n private setConnection(connection) {\n this.connection = connection;\n for (var event in this.connectionCallbacks) {\n this.connection.bind(event, this.connectionCallbacks[event]);\n }\n this.resetActivityCheck();\n }\n\n private abandonConnection() {\n if (!this.connection) {\n return;\n }\n this.stopActivityCheck();\n for (var event in this.connectionCallbacks) {\n this.connection.unbind(event, this.connectionCallbacks[event]);\n }\n var connection = this.connection;\n this.connection = null;\n return connection;\n }\n\n private updateState(newState: string, data?: any) {\n var previousState = this.state;\n this.state = newState;\n if (previousState !== newState) {\n var newStateDescription = newState;\n if (newStateDescription === 'connected') {\n newStateDescription += ' with new socket ID ' + data.socket_id;\n }\n Logger.debug(\n 'State changed',\n previousState + ' -> ' + newStateDescription\n );\n this.timeline.info({ state: newState, params: data });\n this.emit('state_change', { previous: previousState, current: newState });\n this.emit(newState, data);\n }\n }\n\n private shouldRetry(): boolean {\n return this.state === 'connecting' || this.state === 'connected';\n }\n}\n","import Channel from './channel';\nimport * as Collections from '../utils/collections';\nimport ChannelTable from './channel_table';\nimport Factory from '../utils/factory';\nimport Pusher from '../pusher';\nimport Logger from '../logger';\nimport * as Errors from '../errors';\nimport urlStore from '../utils/url_store';\n\n/** Handles a channel map. */\nexport default class Channels {\n channels: ChannelTable;\n\n constructor() {\n this.channels = {};\n }\n\n /** Creates or retrieves an existing channel by its name.\n *\n * @param {String} name\n * @param {Pusher} pusher\n * @return {Channel}\n */\n add(name: string, pusher: Pusher) {\n if (!this.channels[name]) {\n this.channels[name] = createChannel(name, pusher);\n }\n return this.channels[name];\n }\n\n /** Returns a list of all channels\n *\n * @return {Array}\n */\n all(): Channel[] {\n return Collections.values(this.channels);\n }\n\n /** Finds a channel by its name.\n *\n * @param {String} name\n * @return {Channel} channel or null if it doesn't exist\n */\n find(name: string) {\n return this.channels[name];\n }\n\n /** Removes a channel from the map.\n *\n * @param {String} name\n */\n remove(name: string) {\n var channel = this.channels[name];\n delete this.channels[name];\n return channel;\n }\n\n /** Proxies disconnection signal to all channels. */\n disconnect() {\n Collections.objectApply(this.channels, function(channel) {\n channel.disconnect();\n });\n }\n}\n\nfunction createChannel(name: string, pusher: Pusher): Channel {\n if (name.indexOf('private-encrypted-') === 0) {\n if (pusher.config.nacl) {\n return Factory.createEncryptedChannel(name, pusher, pusher.config.nacl);\n }\n let errMsg =\n 'Tried to subscribe to a private-encrypted- channel but no nacl implementation available';\n let suffix = urlStore.buildLogSuffix('encryptedChannelSupport');\n throw new Errors.UnsupportedFeature(`${errMsg}. ${suffix}`);\n } else if (name.indexOf('private-') === 0) {\n return Factory.createPrivateChannel(name, pusher);\n } else if (name.indexOf('presence-') === 0) {\n return Factory.createPresenceChannel(name, pusher);\n } else if (name.indexOf('#') === 0) {\n throw new Errors.BadChannelName(\n 'Cannot create a channel with name \"' + name + '\".'\n );\n } else {\n return Factory.createChannel(name, pusher);\n }\n}\n","import AssistantToTheTransportManager from '../transports/assistant_to_the_transport_manager';\nimport PingDelayOptions from '../transports/ping_delay_options';\nimport Transport from '../transports/transport';\nimport TransportManager from '../transports/transport_manager';\nimport Handshake from '../connection/handshake';\nimport TransportConnection from '../transports/transport_connection';\nimport SocketHooks from '../http/socket_hooks';\nimport HTTPSocket from '../http/http_socket';\n\nimport Timeline from '../timeline/timeline';\nimport {\n default as TimelineSender,\n TimelineSenderOptions\n} from '../timeline/timeline_sender';\nimport PresenceChannel from '../channels/presence_channel';\nimport PrivateChannel from '../channels/private_channel';\nimport EncryptedChannel from '../channels/encrypted_channel';\nimport Channel from '../channels/channel';\nimport ConnectionManager from '../connection/connection_manager';\nimport ConnectionManagerOptions from '../connection/connection_manager_options';\nimport Ajax from '../http/ajax';\nimport Channels from '../channels/channels';\nimport Pusher from '../pusher';\nimport { Config } from '../config';\nimport * as nacl from 'tweetnacl';\n\nvar Factory = {\n createChannels(): Channels {\n return new Channels();\n },\n\n createConnectionManager(\n key: string,\n options: ConnectionManagerOptions\n ): ConnectionManager {\n return new ConnectionManager(key, options);\n },\n\n createChannel(name: string, pusher: Pusher): Channel {\n return new Channel(name, pusher);\n },\n\n createPrivateChannel(name: string, pusher: Pusher): PrivateChannel {\n return new PrivateChannel(name, pusher);\n },\n\n createPresenceChannel(name: string, pusher: Pusher): PresenceChannel {\n return new PresenceChannel(name, pusher);\n },\n\n createEncryptedChannel(\n name: string,\n pusher: Pusher,\n nacl: nacl\n ): EncryptedChannel {\n return new EncryptedChannel(name, pusher, nacl);\n },\n\n createTimelineSender(timeline: Timeline, options: TimelineSenderOptions) {\n return new TimelineSender(timeline, options);\n },\n\n createHandshake(\n transport: TransportConnection,\n callback: (HandshakePayload) => void\n ): Handshake {\n return new Handshake(transport, callback);\n },\n\n createAssistantToTheTransportManager(\n manager: TransportManager,\n transport: Transport,\n options: PingDelayOptions\n ): AssistantToTheTransportManager {\n return new AssistantToTheTransportManager(manager, transport, options);\n }\n};\n\nexport default Factory;\n","import AssistantToTheTransportManager from './assistant_to_the_transport_manager';\nimport Transport from './transport';\nimport PingDelayOptions from './ping_delay_options';\nimport Factory from '../utils/factory';\n\nexport interface TransportManagerOptions extends PingDelayOptions {\n lives?: number;\n}\n\n/** Keeps track of the number of lives left for a transport.\n *\n * In the beginning of a session, transports may be assigned a number of\n * lives. When an AssistantToTheTransportManager instance reports a transport\n * connection closed uncleanly, the transport loses a life. When the number\n * of lives drops to zero, the transport gets disabled by its manager.\n *\n * @param {Object} options\n */\nexport default class TransportManager {\n options: TransportManagerOptions;\n livesLeft: number;\n\n constructor(options: TransportManagerOptions) {\n this.options = options || {};\n this.livesLeft = this.options.lives || Infinity;\n }\n\n /** Creates a assistant for the transport.\n *\n * @param {Transport} transport\n * @returns {AssistantToTheTransportManager}\n */\n getAssistant(transport: Transport): AssistantToTheTransportManager {\n return Factory.createAssistantToTheTransportManager(this, transport, {\n minPingDelay: this.options.minPingDelay,\n maxPingDelay: this.options.maxPingDelay\n });\n }\n\n /** Returns whether the transport has any lives left.\n *\n * @returns {Boolean}\n */\n isAlive(): boolean {\n return this.livesLeft > 0;\n }\n\n /** Takes one life from the transport. */\n reportDeath() {\n this.livesLeft -= 1;\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport { OneOffTimer as Timer } from '../utils/timers';\nimport Strategy from './strategy';\nimport StrategyOptions from './strategy_options';\n\n/** Loops through strategies with optional timeouts.\n *\n * Options:\n * - loop - whether it should loop through the substrategy list\n * - timeout - initial timeout for a single substrategy\n * - timeoutLimit - maximum timeout\n *\n * @param {Strategy[]} strategies\n * @param {Object} options\n */\nexport default class SequentialStrategy implements Strategy {\n strategies: Strategy[];\n loop: boolean;\n failFast: boolean;\n timeout: number;\n timeoutLimit: number;\n\n constructor(strategies: Strategy[], options: StrategyOptions) {\n this.strategies = strategies;\n this.loop = Boolean(options.loop);\n this.failFast = Boolean(options.failFast);\n this.timeout = options.timeout;\n this.timeoutLimit = options.timeoutLimit;\n }\n\n isSupported(): boolean {\n return Collections.any(this.strategies, Util.method('isSupported'));\n }\n\n connect(minPriority: number, callback: Function) {\n var strategies = this.strategies;\n var current = 0;\n var timeout = this.timeout;\n var runner = null;\n\n var tryNextStrategy = (error, handshake) => {\n if (handshake) {\n callback(null, handshake);\n } else {\n current = current + 1;\n if (this.loop) {\n current = current % strategies.length;\n }\n\n if (current < strategies.length) {\n if (timeout) {\n timeout = timeout * 2;\n if (this.timeoutLimit) {\n timeout = Math.min(timeout, this.timeoutLimit);\n }\n }\n runner = this.tryStrategy(\n strategies[current],\n minPriority,\n { timeout, failFast: this.failFast },\n tryNextStrategy\n );\n } else {\n callback(true);\n }\n }\n };\n\n runner = this.tryStrategy(\n strategies[current],\n minPriority,\n { timeout: timeout, failFast: this.failFast },\n tryNextStrategy\n );\n\n return {\n abort: function() {\n runner.abort();\n },\n forceMinPriority: function(p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n }\n\n private tryStrategy(\n strategy: Strategy,\n minPriority: number,\n options: StrategyOptions,\n callback: Function\n ) {\n var timer = null;\n var runner = null;\n\n if (options.timeout > 0) {\n timer = new Timer(options.timeout, function() {\n runner.abort();\n callback(true);\n });\n }\n\n runner = strategy.connect(minPriority, function(error, handshake) {\n if (error && timer && timer.isRunning() && !options.failFast) {\n // advance to the next strategy after the timeout\n return;\n }\n if (timer) {\n timer.ensureAborted();\n }\n callback(error, handshake);\n });\n\n return {\n abort: function() {\n if (timer) {\n timer.ensureAborted();\n }\n runner.abort();\n },\n forceMinPriority: function(p) {\n runner.forceMinPriority(p);\n }\n };\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport Strategy from './strategy';\n\n/** Launches all substrategies and emits prioritized connected transports.\n *\n * @param {Array} strategies\n */\nexport default class BestConnectedEverStrategy implements Strategy {\n strategies: Strategy[];\n\n constructor(strategies: Strategy[]) {\n this.strategies = strategies;\n }\n\n isSupported(): boolean {\n return Collections.any(this.strategies, Util.method('isSupported'));\n }\n\n connect(minPriority: number, callback: Function) {\n return connect(this.strategies, minPriority, function(i, runners) {\n return function(error, handshake) {\n runners[i].error = error;\n if (error) {\n if (allRunnersFailed(runners)) {\n callback(true);\n }\n return;\n }\n Collections.apply(runners, function(runner) {\n runner.forceMinPriority(handshake.transport.priority);\n });\n callback(null, handshake);\n };\n });\n }\n}\n\n/** Connects to all strategies in parallel.\n *\n * Callback builder should be a function that takes two arguments: index\n * and a list of runners. It should return another function that will be\n * passed to the substrategy with given index. Runners can be aborted using\n * abortRunner(s) functions from this class.\n *\n * @param {Array} strategies\n * @param {Function} callbackBuilder\n * @return {Object} strategy runner\n */\nfunction connect(\n strategies: Strategy[],\n minPriority: number,\n callbackBuilder: Function\n) {\n var runners = Collections.map(strategies, function(strategy, i, _, rs) {\n return strategy.connect(minPriority, callbackBuilder(i, rs));\n });\n return {\n abort: function() {\n Collections.apply(runners, abortRunner);\n },\n forceMinPriority: function(p) {\n Collections.apply(runners, function(runner) {\n runner.forceMinPriority(p);\n });\n }\n };\n}\n\nfunction allRunnersFailed(runners): boolean {\n return Collections.all(runners, function(runner) {\n return Boolean(runner.error);\n });\n}\n\nfunction abortRunner(runner) {\n if (!runner.error && !runner.aborted) {\n runner.abort();\n runner.aborted = true;\n }\n}\n","import Util from '../util';\nimport Runtime from 'runtime';\nimport Strategy from './strategy';\nimport SequentialStrategy from './sequential_strategy';\nimport StrategyOptions from './strategy_options';\nimport TransportStrategy from './transport_strategy';\nimport Timeline from '../timeline/timeline';\nimport * as Collections from '../utils/collections';\n\nexport interface TransportStrategyDictionary {\n [key: string]: TransportStrategy;\n}\n\n/** Caches last successful transport and uses it for following attempts.\n *\n * @param {Strategy} strategy\n * @param {Object} transports\n * @param {Object} options\n */\nexport default class CachedStrategy implements Strategy {\n strategy: Strategy;\n transports: TransportStrategyDictionary;\n ttl: number;\n usingTLS: boolean;\n timeline: Timeline;\n\n constructor(\n strategy: Strategy,\n transports: TransportStrategyDictionary,\n options: StrategyOptions\n ) {\n this.strategy = strategy;\n this.transports = transports;\n this.ttl = options.ttl || 1800 * 1000;\n this.usingTLS = options.useTLS;\n this.timeline = options.timeline;\n }\n\n isSupported(): boolean {\n return this.strategy.isSupported();\n }\n\n connect(minPriority: number, callback: Function) {\n var usingTLS = this.usingTLS;\n var info = fetchTransportCache(usingTLS);\n\n var strategies = [this.strategy];\n if (info && info.timestamp + this.ttl >= Util.now()) {\n var transport = this.transports[info.transport];\n if (transport) {\n this.timeline.info({\n cached: true,\n transport: info.transport,\n latency: info.latency\n });\n strategies.push(\n new SequentialStrategy([transport], {\n timeout: info.latency * 2 + 1000,\n failFast: true\n })\n );\n }\n }\n\n var startTimestamp = Util.now();\n var runner = strategies\n .pop()\n .connect(minPriority, function cb(error, handshake) {\n if (error) {\n flushTransportCache(usingTLS);\n if (strategies.length > 0) {\n startTimestamp = Util.now();\n runner = strategies.pop().connect(minPriority, cb);\n } else {\n callback(error);\n }\n } else {\n storeTransportCache(\n usingTLS,\n handshake.transport.name,\n Util.now() - startTimestamp\n );\n callback(null, handshake);\n }\n });\n\n return {\n abort: function() {\n runner.abort();\n },\n forceMinPriority: function(p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n }\n}\n\nfunction getTransportCacheKey(usingTLS: boolean): string {\n return 'pusherTransport' + (usingTLS ? 'TLS' : 'NonTLS');\n}\n\nfunction fetchTransportCache(usingTLS: boolean): any {\n var storage = Runtime.getLocalStorage();\n if (storage) {\n try {\n var serializedCache = storage[getTransportCacheKey(usingTLS)];\n if (serializedCache) {\n return JSON.parse(serializedCache);\n }\n } catch (e) {\n flushTransportCache(usingTLS);\n }\n }\n return null;\n}\n\nfunction storeTransportCache(\n usingTLS: boolean,\n transport: TransportStrategy,\n latency: number\n) {\n var storage = Runtime.getLocalStorage();\n if (storage) {\n try {\n storage[getTransportCacheKey(usingTLS)] = Collections.safeJSONStringify({\n timestamp: Util.now(),\n transport: transport,\n latency: latency\n });\n } catch (e) {\n // catch over quota exceptions raised by localStorage\n }\n }\n}\n\nfunction flushTransportCache(usingTLS: boolean) {\n var storage = Runtime.getLocalStorage();\n if (storage) {\n try {\n delete storage[getTransportCacheKey(usingTLS)];\n } catch (e) {\n // catch exceptions raised by localStorage\n }\n }\n}\n","import { OneOffTimer as Timer } from '../utils/timers';\nimport Strategy from './strategy';\nimport StrategyOptions from './strategy_options';\n\n/** Runs substrategy after specified delay.\n *\n * Options:\n * - delay - time in miliseconds to delay the substrategy attempt\n *\n * @param {Strategy} strategy\n * @param {Object} options\n */\nexport default class DelayedStrategy implements Strategy {\n strategy: Strategy;\n options: { delay: number };\n\n constructor(strategy: Strategy, { delay: number }) {\n this.strategy = strategy;\n this.options = { delay: number };\n }\n\n isSupported(): boolean {\n return this.strategy.isSupported();\n }\n\n connect(minPriority: number, callback: Function) {\n var strategy = this.strategy;\n var runner;\n var timer = new Timer(this.options.delay, function() {\n runner = strategy.connect(minPriority, callback);\n });\n\n return {\n abort: function() {\n timer.ensureAborted();\n if (runner) {\n runner.abort();\n }\n },\n forceMinPriority: function(p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n }\n };\n }\n}\n","import Strategy from './strategy';\nimport StrategyRunner from './strategy_runner';\n\n/** Proxies method calls to one of substrategies basing on the test function.\n *\n * @param {Function} test\n * @param {Strategy} trueBranch strategy used when test returns true\n * @param {Strategy} falseBranch strategy used when test returns false\n */\nexport default class IfStrategy implements Strategy {\n test: () => boolean;\n trueBranch: Strategy;\n falseBranch: Strategy;\n\n constructor(\n test: () => boolean,\n trueBranch: Strategy,\n falseBranch: Strategy\n ) {\n this.test = test;\n this.trueBranch = trueBranch;\n this.falseBranch = falseBranch;\n }\n\n isSupported(): boolean {\n var branch = this.test() ? this.trueBranch : this.falseBranch;\n return branch.isSupported();\n }\n\n connect(minPriority: number, callback: Function): StrategyRunner {\n var branch = this.test() ? this.trueBranch : this.falseBranch;\n return branch.connect(minPriority, callback);\n }\n}\n","import Strategy from './strategy';\nimport StrategyRunner from './strategy_runner';\n\n/** Launches the substrategy and terminates on the first open connection.\n *\n * @param {Strategy} strategy\n */\nexport default class FirstConnectedStrategy implements Strategy {\n strategy: Strategy;\n\n constructor(strategy: Strategy) {\n this.strategy = strategy;\n }\n\n isSupported(): boolean {\n return this.strategy.isSupported();\n }\n\n connect(minPriority: number, callback: Function): StrategyRunner {\n var runner = this.strategy.connect(minPriority, function(error, handshake) {\n if (handshake) {\n runner.abort();\n }\n callback(error, handshake);\n });\n return runner;\n }\n}\n","import * as Collections from 'core/utils/collections';\nimport TransportManager from 'core/transports/transport_manager';\nimport Strategy from 'core/strategies/strategy';\nimport StrategyOptions from 'core/strategies/strategy_options';\nimport SequentialStrategy from 'core/strategies/sequential_strategy';\nimport BestConnectedEverStrategy from 'core/strategies/best_connected_ever_strategy';\nimport CachedStrategy, {\n TransportStrategyDictionary\n} from 'core/strategies/cached_strategy';\nimport DelayedStrategy from 'core/strategies/delayed_strategy';\nimport IfStrategy from 'core/strategies/if_strategy';\nimport FirstConnectedStrategy from 'core/strategies/first_connected_strategy';\nimport { Config } from 'core/config';\n\nfunction testSupportsStrategy(strategy: Strategy) {\n return function() {\n return strategy.isSupported();\n };\n}\n\nvar getDefaultStrategy = function(\n config: Config,\n baseOptions: StrategyOptions,\n defineTransport: Function\n): Strategy {\n var definedTransports = {};\n\n function defineTransportStrategy(\n name: string,\n type: string,\n priority: number,\n options: StrategyOptions,\n manager?: TransportManager\n ) {\n var transport = defineTransport(\n config,\n name,\n type,\n priority,\n options,\n manager\n );\n\n definedTransports[name] = transport;\n\n return transport;\n }\n\n var ws_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.wsHost + ':' + config.wsPort,\n hostTLS: config.wsHost + ':' + config.wssPort,\n httpPath: config.wsPath\n });\n var wss_options: StrategyOptions = Object.assign({}, ws_options, {\n useTLS: true\n });\n var sockjs_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.httpHost + ':' + config.httpPort,\n hostTLS: config.httpHost + ':' + config.httpsPort,\n httpPath: config.httpPath\n });\n\n var timeouts = {\n loop: true,\n timeout: 15000,\n timeoutLimit: 60000\n };\n\n var ws_manager = new TransportManager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout\n });\n var streaming_manager = new TransportManager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout\n });\n\n var ws_transport = defineTransportStrategy(\n 'ws',\n 'ws',\n 3,\n ws_options,\n ws_manager\n );\n var wss_transport = defineTransportStrategy(\n 'wss',\n 'ws',\n 3,\n wss_options,\n ws_manager\n );\n var sockjs_transport = defineTransportStrategy(\n 'sockjs',\n 'sockjs',\n 1,\n sockjs_options\n );\n var xhr_streaming_transport = defineTransportStrategy(\n 'xhr_streaming',\n 'xhr_streaming',\n 1,\n sockjs_options,\n streaming_manager\n );\n var xdr_streaming_transport = defineTransportStrategy(\n 'xdr_streaming',\n 'xdr_streaming',\n 1,\n sockjs_options,\n streaming_manager\n );\n var xhr_polling_transport = defineTransportStrategy(\n 'xhr_polling',\n 'xhr_polling',\n 1,\n sockjs_options\n );\n var xdr_polling_transport = defineTransportStrategy(\n 'xdr_polling',\n 'xdr_polling',\n 1,\n sockjs_options\n );\n\n var ws_loop = new SequentialStrategy([ws_transport], timeouts);\n var wss_loop = new SequentialStrategy([wss_transport], timeouts);\n var sockjs_loop = new SequentialStrategy([sockjs_transport], timeouts);\n var streaming_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(xhr_streaming_transport),\n xhr_streaming_transport,\n xdr_streaming_transport\n )\n ],\n timeouts\n );\n var polling_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(xhr_polling_transport),\n xhr_polling_transport,\n xdr_polling_transport\n )\n ],\n timeouts\n );\n\n var http_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(streaming_loop),\n new BestConnectedEverStrategy([\n streaming_loop,\n new DelayedStrategy(polling_loop, { delay: 4000 })\n ]),\n polling_loop\n )\n ],\n timeouts\n );\n\n var http_fallback_loop = new IfStrategy(\n testSupportsStrategy(http_loop),\n http_loop,\n sockjs_loop\n );\n\n var wsStrategy;\n if (baseOptions.useTLS) {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(http_fallback_loop, { delay: 2000 })\n ]);\n } else {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(wss_loop, { delay: 2000 }),\n new DelayedStrategy(http_fallback_loop, { delay: 5000 })\n ]);\n }\n\n return new CachedStrategy(\n new FirstConnectedStrategy(\n new IfStrategy(\n testSupportsStrategy(ws_transport),\n wsStrategy,\n http_fallback_loop\n )\n ),\n definedTransports,\n {\n ttl: 1800000,\n timeline: baseOptions.timeline,\n useTLS: baseOptions.useTLS\n }\n );\n};\n\nexport default getDefaultStrategy;\n","enum State {\n CONNECTING = 0,\n OPEN = 1,\n CLOSED = 3\n}\n\nexport default State;\n","import HTTPRequest from 'core/http/http_request';\nimport RequestHooks from 'core/http/request_hooks';\nimport Ajax from 'core/http/ajax';\nimport * as Errors from 'core/errors';\n\nvar hooks: RequestHooks = {\n getRequest: function(socket: HTTPRequest): Ajax {\n var xdr = new (window).XDomainRequest();\n xdr.ontimeout = function() {\n socket.emit('error', new Errors.RequestTimedOut());\n socket.close();\n };\n xdr.onerror = function(e) {\n socket.emit('error', e);\n socket.close();\n };\n xdr.onprogress = function() {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n };\n xdr.onload = function() {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n socket.emit('finished', 200);\n socket.close();\n };\n return xdr;\n },\n abortRequest: function(xdr: Ajax) {\n xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null;\n xdr.abort();\n }\n};\n\nexport default hooks;\n","import Runtime from 'runtime';\nimport RequestHooks from './request_hooks';\nimport Ajax from './ajax';\nimport { default as EventsDispatcher } from '../events/dispatcher';\n\nconst MAX_BUFFER_LENGTH = 256 * 1024;\n\nexport default class HTTPRequest extends EventsDispatcher {\n hooks: RequestHooks;\n method: string;\n url: string;\n position: number;\n xhr: Ajax;\n unloader: Function;\n\n constructor(hooks: RequestHooks, method: string, url: string) {\n super();\n this.hooks = hooks;\n this.method = method;\n this.url = url;\n }\n\n start(payload?: any) {\n this.position = 0;\n this.xhr = this.hooks.getRequest(this);\n\n this.unloader = () => {\n this.close();\n };\n Runtime.addUnloadListener(this.unloader);\n\n this.xhr.open(this.method, this.url, true);\n\n if (this.xhr.setRequestHeader) {\n this.xhr.setRequestHeader('Content-Type', 'application/json'); // ReactNative doesn't set this header by default.\n }\n this.xhr.send(payload);\n }\n\n close() {\n if (this.unloader) {\n Runtime.removeUnloadListener(this.unloader);\n this.unloader = null;\n }\n if (this.xhr) {\n this.hooks.abortRequest(this.xhr);\n this.xhr = null;\n }\n }\n\n onChunk(status: number, data: any) {\n while (true) {\n var chunk = this.advanceBuffer(data);\n if (chunk) {\n this.emit('chunk', { status: status, data: chunk });\n } else {\n break;\n }\n }\n if (this.isBufferTooLong(data)) {\n this.emit('buffer_too_long');\n }\n }\n\n private advanceBuffer(buffer: any[]): any {\n var unreadData = buffer.slice(this.position);\n var endOfLinePosition = unreadData.indexOf('\\n');\n\n if (endOfLinePosition !== -1) {\n this.position += endOfLinePosition + 1;\n return unreadData.slice(0, endOfLinePosition);\n } else {\n // chunk is not finished yet, don't move the buffer pointer\n return null;\n }\n }\n\n private isBufferTooLong(buffer: any): boolean {\n return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH;\n }\n}\n","import URLLocation from './url_location';\nimport State from './state';\nimport Socket from '../socket';\nimport SocketHooks from './socket_hooks';\nimport Util from '../util';\nimport Ajax from './ajax';\nimport HTTPRequest from './http_request';\nimport Runtime from 'runtime';\n\nvar autoIncrement = 1;\n\nclass HTTPSocket implements Socket {\n hooks: SocketHooks;\n session: string;\n location: URLLocation;\n readyState: State;\n stream: HTTPRequest;\n\n onopen: () => void;\n onerror: (error: any) => void;\n onclose: (closeEvent: any) => void;\n onmessage: (message: any) => void;\n onactivity: () => void;\n\n constructor(hooks: SocketHooks, url: string) {\n this.hooks = hooks;\n this.session = randomNumber(1000) + '/' + randomString(8);\n this.location = getLocation(url);\n this.readyState = State.CONNECTING;\n this.openStream();\n }\n\n send(payload: any) {\n return this.sendRaw(JSON.stringify([payload]));\n }\n\n ping() {\n this.hooks.sendHeartbeat(this);\n }\n\n close(code: any, reason: any) {\n this.onClose(code, reason, true);\n }\n\n /** For internal use only */\n sendRaw(payload: any): boolean {\n if (this.readyState === State.OPEN) {\n try {\n Runtime.createSocketRequest(\n 'POST',\n getUniqueURL(getSendURL(this.location, this.session))\n ).start(payload);\n return true;\n } catch (e) {\n return false;\n }\n } else {\n return false;\n }\n }\n\n /** For internal use only */\n reconnect() {\n this.closeStream();\n this.openStream();\n }\n\n /** For internal use only */\n onClose(code, reason, wasClean) {\n this.closeStream();\n this.readyState = State.CLOSED;\n if (this.onclose) {\n this.onclose({\n code: code,\n reason: reason,\n wasClean: wasClean\n });\n }\n }\n\n private onChunk(chunk) {\n if (chunk.status !== 200) {\n return;\n }\n if (this.readyState === State.OPEN) {\n this.onActivity();\n }\n\n var payload;\n var type = chunk.data.slice(0, 1);\n switch (type) {\n case 'o':\n payload = JSON.parse(chunk.data.slice(1) || '{}');\n this.onOpen(payload);\n break;\n case 'a':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n for (var i = 0; i < payload.length; i++) {\n this.onEvent(payload[i]);\n }\n break;\n case 'm':\n payload = JSON.parse(chunk.data.slice(1) || 'null');\n this.onEvent(payload);\n break;\n case 'h':\n this.hooks.onHeartbeat(this);\n break;\n case 'c':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n this.onClose(payload[0], payload[1], true);\n break;\n }\n }\n\n private onOpen(options) {\n if (this.readyState === State.CONNECTING) {\n if (options && options.hostname) {\n this.location.base = replaceHost(this.location.base, options.hostname);\n }\n this.readyState = State.OPEN;\n\n if (this.onopen) {\n this.onopen();\n }\n } else {\n this.onClose(1006, 'Server lost session', true);\n }\n }\n\n private onEvent(event) {\n if (this.readyState === State.OPEN && this.onmessage) {\n this.onmessage({ data: event });\n }\n }\n\n private onActivity() {\n if (this.onactivity) {\n this.onactivity();\n }\n }\n\n private onError(error) {\n if (this.onerror) {\n this.onerror(error);\n }\n }\n\n private openStream() {\n this.stream = Runtime.createSocketRequest(\n 'POST',\n getUniqueURL(this.hooks.getReceiveURL(this.location, this.session))\n );\n\n this.stream.bind('chunk', chunk => {\n this.onChunk(chunk);\n });\n this.stream.bind('finished', status => {\n this.hooks.onFinished(this, status);\n });\n this.stream.bind('buffer_too_long', () => {\n this.reconnect();\n });\n\n try {\n this.stream.start();\n } catch (error) {\n Util.defer(() => {\n this.onError(error);\n this.onClose(1006, 'Could not start streaming', false);\n });\n }\n }\n\n private closeStream() {\n if (this.stream) {\n this.stream.unbind_all();\n this.stream.close();\n this.stream = null;\n }\n }\n}\n\nfunction getLocation(url): URLLocation {\n var parts = /([^\\?]*)\\/*(\\??.*)/.exec(url);\n return {\n base: parts[1],\n queryString: parts[2]\n };\n}\n\nfunction getSendURL(url: URLLocation, session: string): string {\n return url.base + '/' + session + '/xhr_send';\n}\n\nfunction getUniqueURL(url: string): string {\n var separator = url.indexOf('?') === -1 ? '?' : '&';\n return url + separator + 't=' + +new Date() + '&n=' + autoIncrement++;\n}\n\nfunction replaceHost(url: string, hostname: string): string {\n var urlParts = /(https?:\\/\\/)([^\\/:]+)((\\/|:)?.*)/.exec(url);\n return urlParts[1] + hostname + urlParts[3];\n}\n\nfunction randomNumber(max: number): number {\n return Runtime.randomInt(max);\n}\n\nfunction randomString(length: number): string {\n var result = [];\n\n for (var i = 0; i < length; i++) {\n result.push(randomNumber(32).toString(32));\n }\n\n return result.join('');\n}\n\nexport default HTTPSocket;\n","enum TimelineLevel {\n ERROR = 3,\n INFO = 6,\n DEBUG = 7\n}\n\nexport default TimelineLevel;\n","import SocketHooks from './socket_hooks';\nimport HTTPSocket from './http_socket';\n\nvar hooks: SocketHooks = {\n getReceiveURL: function(url, session) {\n return url.base + '/' + session + '/xhr_streaming' + url.queryString;\n },\n onHeartbeat: function(socket) {\n socket.sendRaw('[]');\n },\n sendHeartbeat: function(socket) {\n socket.sendRaw('[]');\n },\n onFinished: function(socket, status) {\n socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n }\n};\n\nexport default hooks;\n","import SocketHooks from './socket_hooks';\nimport URLLocation from './url_location';\nimport HTTPSocket from './http_socket';\n\nvar hooks: SocketHooks = {\n getReceiveURL: function(url: URLLocation, session: string): string {\n return url.base + '/' + session + '/xhr' + url.queryString;\n },\n onHeartbeat: function() {\n // next HTTP request will reset server's activity timer\n },\n sendHeartbeat: function(socket) {\n socket.sendRaw('[]');\n },\n onFinished: function(socket, status) {\n if (status === 200) {\n socket.reconnect();\n } else {\n socket.onClose(1006, 'Connection interrupted (' + status + ')', false);\n }\n }\n};\n\nexport default hooks;\n","import HTTPRequest from 'core/http/http_request';\nimport RequestHooks from 'core/http/request_hooks';\nimport Ajax from 'core/http/ajax';\nimport Runtime from 'runtime';\n\nvar hooks: RequestHooks = {\n getRequest: function(socket: HTTPRequest): Ajax {\n var Constructor = Runtime.getXHRAPI();\n var xhr = new Constructor();\n xhr.onreadystatechange = xhr.onprogress = function() {\n switch (xhr.readyState) {\n case 3:\n if (xhr.responseText && xhr.responseText.length > 0) {\n socket.onChunk(xhr.status, xhr.responseText);\n }\n break;\n case 4:\n // this happens only on errors, never after calling close\n if (xhr.responseText && xhr.responseText.length > 0) {\n socket.onChunk(xhr.status, xhr.responseText);\n }\n socket.emit('finished', xhr.status);\n socket.close();\n break;\n }\n };\n return xhr;\n },\n abortRequest: function(xhr: Ajax) {\n xhr.onreadystatechange = null;\n xhr.abort();\n }\n};\n\nexport default hooks;\n","import Browser from './browser';\nimport { Dependencies, DependenciesReceivers } from './dom/dependencies';\nimport { AuthTransport, AuthTransports } from 'core/auth/auth_transports';\nimport xhrAuth from 'isomorphic/auth/xhr_auth';\nimport jsonpAuth from './auth/jsonp_auth';\nimport TimelineTransport from 'core/timeline/timeline_transport';\nimport TimelineSender from 'core/timeline/timeline_sender';\nimport ScriptRequest from './dom/script_request';\nimport JSONPRequest from './dom/jsonp_request';\nimport * as Collections from 'core/utils/collections';\nimport { ScriptReceivers } from './dom/script_receiver_factory';\nimport jsonpTimeline from './timeline/jsonp_timeline';\nimport Transports from './transports/transports';\nimport Ajax from 'core/http/ajax';\nimport { Network } from './net_info';\nimport getDefaultStrategy from './default_strategy';\nimport transportConnectionInitializer from './transports/transport_connection_initializer';\nimport HTTPFactory from './http/http';\nimport HTTPRequest from 'core/http/http_request';\n\nvar Runtime: Browser = {\n // for jsonp auth\n nextAuthCallbackID: 1,\n auth_callbacks: {},\n ScriptReceivers,\n DependenciesReceivers,\n getDefaultStrategy,\n Transports,\n transportConnectionInitializer,\n HTTPFactory,\n\n TimelineTransport: jsonpTimeline,\n\n getXHRAPI() {\n return window.XMLHttpRequest;\n },\n\n getWebSocketAPI() {\n return window.WebSocket || window.MozWebSocket;\n },\n\n setup(PusherClass): void {\n (window).Pusher = PusherClass; // JSONp requires Pusher to be in the global scope.\n var initializeOnDocumentBody = () => {\n this.onDocumentBody(PusherClass.ready);\n };\n if (!(window).JSON) {\n Dependencies.load('json2', {}, initializeOnDocumentBody);\n } else {\n initializeOnDocumentBody();\n }\n },\n\n getDocument(): Document {\n return document;\n },\n\n getProtocol(): string {\n return this.getDocument().location.protocol;\n },\n\n getAuthorizers(): AuthTransports {\n return { ajax: xhrAuth, jsonp: jsonpAuth };\n },\n\n onDocumentBody(callback: Function) {\n if (document.body) {\n callback();\n } else {\n setTimeout(() => {\n this.onDocumentBody(callback);\n }, 0);\n }\n },\n\n createJSONPRequest(url: string, data: any): JSONPRequest {\n return new JSONPRequest(url, data);\n },\n\n createScriptRequest(src: string): ScriptRequest {\n return new ScriptRequest(src);\n },\n\n getLocalStorage() {\n try {\n return window.localStorage;\n } catch (e) {\n return undefined;\n }\n },\n\n createXHR(): Ajax {\n if (this.getXHRAPI()) {\n return this.createXMLHttpRequest();\n } else {\n return this.createMicrosoftXHR();\n }\n },\n\n createXMLHttpRequest(): Ajax {\n var Constructor = this.getXHRAPI();\n return new Constructor();\n },\n\n createMicrosoftXHR(): Ajax {\n return new ActiveXObject('Microsoft.XMLHTTP');\n },\n\n getNetwork() {\n return Network;\n },\n\n createWebSocket(url: string): any {\n var Constructor = this.getWebSocketAPI();\n return new Constructor(url);\n },\n\n createSocketRequest(method: string, url: string): HTTPRequest {\n if (this.isXHRSupported()) {\n return this.HTTPFactory.createXHR(method, url);\n } else if (this.isXDRSupported(url.indexOf('https:') === 0)) {\n return this.HTTPFactory.createXDR(method, url);\n } else {\n throw 'Cross-origin HTTP requests are not supported';\n }\n },\n\n isXHRSupported(): boolean {\n var Constructor = this.getXHRAPI();\n return (\n Boolean(Constructor) && new Constructor().withCredentials !== undefined\n );\n },\n\n isXDRSupported(useTLS?: boolean): boolean {\n var protocol = useTLS ? 'https:' : 'http:';\n var documentProtocol = this.getProtocol();\n return (\n Boolean(window['XDomainRequest']) && documentProtocol === protocol\n );\n },\n\n addUnloadListener(listener: any) {\n if (window.addEventListener !== undefined) {\n window.addEventListener('unload', listener, false);\n } else if (window.attachEvent !== undefined) {\n window.attachEvent('onunload', listener);\n }\n },\n\n removeUnloadListener(listener: any) {\n if (window.addEventListener !== undefined) {\n window.removeEventListener('unload', listener, false);\n } else if (window.detachEvent !== undefined) {\n window.detachEvent('onunload', listener);\n }\n },\n\n randomInt(max: number): number {\n /**\n * Return values in the range of [0, 1[\n */\n const random = function() {\n const crypto = window.crypto || window['msCrypto'];\n const random = crypto.getRandomValues(new Uint32Array(1))[0];\n\n return random / 2 ** 32;\n };\n\n return Math.floor(random() * max);\n }\n};\n\nexport default Runtime;\n","import { Dependencies } from '../dom/dependencies';\n\n/** Initializes the transport.\n *\n * Fetches resources if needed and then transitions to initialized.\n */\nexport default function() {\n var self = this;\n\n self.timeline.info(\n self.buildTimelineMessage({\n transport: self.name + (self.options.useTLS ? 's' : '')\n })\n );\n\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n } else if (self.hooks.file) {\n self.changeState('initializing');\n Dependencies.load(\n self.hooks.file,\n { useTLS: self.options.useTLS },\n function(error, callback) {\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n callback(true);\n } else {\n if (error) {\n self.onError(error);\n }\n self.onClose();\n callback(false);\n }\n }\n );\n } else {\n self.onClose();\n }\n}\n","import HTTPRequest from 'core/http/http_request';\nimport HTTPSocket from 'core/http/http_socket';\nimport SocketHooks from 'core/http/socket_hooks';\nimport RequestHooks from 'core/http/request_hooks';\nimport streamingHooks from 'core/http/http_streaming_socket';\nimport pollingHooks from 'core/http/http_polling_socket';\nimport xhrHooks from './http_xhr_request';\nimport HTTPFactory from 'core/http/http_factory';\n\nvar HTTP: HTTPFactory = {\n createStreamingSocket(url: string): HTTPSocket {\n return this.createSocket(streamingHooks, url);\n },\n\n createPollingSocket(url: string): HTTPSocket {\n return this.createSocket(pollingHooks, url);\n },\n\n createSocket(hooks: SocketHooks, url: string): HTTPSocket {\n return new HTTPSocket(hooks, url);\n },\n\n createXHR(method: string, url: string): HTTPRequest {\n return this.createRequest(xhrHooks, method, url);\n },\n\n createRequest(hooks: RequestHooks, method: string, url: string): HTTPRequest {\n return new HTTPRequest(hooks, method, url);\n }\n};\n\nexport default HTTP;\n","import xdrHooks from './http_xdomain_request';\nimport HTTP from 'isomorphic/http/http';\n\nHTTP.createXDR = function(method, url) {\n return this.createRequest(xdrHooks, method, url);\n};\n\nexport default HTTP;\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport { default as Level } from './level';\n\nexport interface TimelineOptions {\n level?: Level;\n limit?: number;\n version?: string;\n cluster?: string;\n features?: string[];\n params?: any;\n}\n\nexport default class Timeline {\n key: string;\n session: number;\n events: any[];\n options: TimelineOptions;\n sent: number;\n uniqueID: number;\n\n constructor(key: string, session: number, options: TimelineOptions) {\n this.key = key;\n this.session = session;\n this.events = [];\n this.options = options || {};\n this.sent = 0;\n this.uniqueID = 0;\n }\n\n log(level, event) {\n if (level <= this.options.level) {\n this.events.push(\n Collections.extend({}, event, { timestamp: Util.now() })\n );\n if (this.options.limit && this.events.length > this.options.limit) {\n this.events.shift();\n }\n }\n }\n\n error(event) {\n this.log(Level.ERROR, event);\n }\n\n info(event) {\n this.log(Level.INFO, event);\n }\n\n debug(event) {\n this.log(Level.DEBUG, event);\n }\n\n isEmpty() {\n return this.events.length === 0;\n }\n\n send(sendfn, callback) {\n var data = Collections.extend(\n {\n session: this.session,\n bundle: this.sent + 1,\n key: this.key,\n lib: 'js',\n version: this.options.version,\n cluster: this.options.cluster,\n features: this.options.features,\n timeline: this.events\n },\n this.options.params\n );\n\n this.events = [];\n sendfn(data, (error, result) => {\n if (!error) {\n this.sent++;\n }\n if (callback) {\n callback(error, result);\n }\n });\n\n return true;\n }\n\n generateUniqueID(): number {\n this.uniqueID++;\n return this.uniqueID;\n }\n}\n","import Factory from '../utils/factory';\nimport Util from '../util';\nimport * as Errors from '../errors';\nimport * as Collections from '../utils/collections';\nimport Strategy from './strategy';\nimport Transport from '../transports/transport';\nimport StrategyOptions from './strategy_options';\nimport Handshake from '../connection/handshake';\n\n/** Provides a strategy interface for transports.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {Class} transport\n * @param {Object} options\n */\nexport default class TransportStrategy implements Strategy {\n name: string;\n priority: number;\n transport: Transport;\n options: StrategyOptions;\n\n constructor(\n name: string,\n priority: number,\n transport: Transport,\n options: StrategyOptions\n ) {\n this.name = name;\n this.priority = priority;\n this.transport = transport;\n this.options = options || {};\n }\n\n /** Returns whether the transport is supported in the browser.\n *\n * @returns {Boolean}\n */\n isSupported(): boolean {\n return this.transport.isSupported({\n useTLS: this.options.useTLS\n });\n }\n\n /** Launches a connection attempt and returns a strategy runner.\n *\n * @param {Function} callback\n * @return {Object} strategy runner\n */\n connect(minPriority: number, callback: Function) {\n if (!this.isSupported()) {\n return failAttempt(new Errors.UnsupportedStrategy(), callback);\n } else if (this.priority < minPriority) {\n return failAttempt(new Errors.TransportPriorityTooLow(), callback);\n }\n\n var connected = false;\n var transport = this.transport.createConnection(\n this.name,\n this.priority,\n this.options.key,\n this.options\n );\n var handshake = null;\n\n var onInitialized = function() {\n transport.unbind('initialized', onInitialized);\n transport.connect();\n };\n var onOpen = function() {\n handshake = Factory.createHandshake(transport, function(result) {\n connected = true;\n unbindListeners();\n callback(null, result);\n });\n };\n var onError = function(error) {\n unbindListeners();\n callback(error);\n };\n var onClosed = function() {\n unbindListeners();\n var serializedTransport;\n\n // The reason for this try/catch block is that on React Native\n // the WebSocket object is circular. Therefore transport.socket will\n // throw errors upon stringification. Collections.safeJSONStringify\n // discards circular references when serializing.\n serializedTransport = Collections.safeJSONStringify(transport);\n callback(new Errors.TransportClosed(serializedTransport));\n };\n\n var unbindListeners = function() {\n transport.unbind('initialized', onInitialized);\n transport.unbind('open', onOpen);\n transport.unbind('error', onError);\n transport.unbind('closed', onClosed);\n };\n\n transport.bind('initialized', onInitialized);\n transport.bind('open', onOpen);\n transport.bind('error', onError);\n transport.bind('closed', onClosed);\n\n // connect will be called automatically after initialization\n transport.initialize();\n\n return {\n abort: () => {\n if (connected) {\n return;\n }\n unbindListeners();\n if (handshake) {\n handshake.close();\n } else {\n transport.close();\n }\n },\n forceMinPriority: p => {\n if (connected) {\n return;\n }\n if (this.priority < p) {\n if (handshake) {\n handshake.close();\n } else {\n transport.close();\n }\n }\n }\n };\n }\n}\n\nfunction failAttempt(error: Error, callback: Function) {\n Util.defer(function() {\n callback(error);\n });\n return {\n abort: function() {},\n forceMinPriority: function() {}\n };\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport TransportManager from '../transports/transport_manager';\nimport * as Errors from '../errors';\nimport Strategy from './strategy';\nimport TransportStrategy from './transport_strategy';\nimport StrategyOptions from '../strategies/strategy_options';\nimport { Config } from '../config';\nimport Runtime from 'runtime';\n\nconst { Transports } = Runtime;\n\nexport var defineTransport = function(\n config: Config,\n name: string,\n type: string,\n priority: number,\n options: StrategyOptions,\n manager?: TransportManager\n): Strategy {\n var transportClass = Transports[type];\n if (!transportClass) {\n throw new Errors.UnsupportedTransport(type);\n }\n\n var enabled =\n (!config.enabledTransports ||\n Collections.arrayIndexOf(config.enabledTransports, name) !== -1) &&\n (!config.disabledTransports ||\n Collections.arrayIndexOf(config.disabledTransports, name) === -1);\n\n var transport;\n if (enabled) {\n options = Object.assign(\n { ignoreNullOrigin: config.ignoreNullOrigin },\n options\n );\n\n transport = new TransportStrategy(\n name,\n priority,\n manager ? manager.getAssistant(transportClass) : transportClass,\n options\n );\n } else {\n transport = UnsupportedStrategy;\n }\n\n return transport;\n};\n\nvar UnsupportedStrategy: Strategy = {\n isSupported: function() {\n return false;\n },\n connect: function(_, callback) {\n var deferred = Util.defer(function() {\n callback(new Errors.UnsupportedStrategy());\n });\n return {\n abort: function() {\n deferred.ensureAborted();\n },\n forceMinPriority: function() {}\n };\n }\n};\n","import { Options } from './options';\nimport Defaults from './defaults';\nimport {\n ChannelAuthorizationHandler,\n UserAuthenticationHandler,\n ChannelAuthorizationOptions\n} from './auth/options';\nimport UserAuthenticator from './auth/user_authenticator';\nimport ChannelAuthorizer from './auth/channel_authorizer';\nimport { ChannelAuthorizerProxy } from './auth/deprecated_channel_authorizer';\nimport Runtime from 'runtime';\nimport * as nacl from 'tweetnacl';\nimport Logger from './logger';\n\nexport type AuthTransport = 'ajax' | 'jsonp';\nexport type Transport =\n | 'ws'\n | 'wss'\n | 'xhr_streaming'\n | 'xhr_polling'\n | 'sockjs';\n\nexport interface Config {\n // these are all 'required' config parameters, it's not necessary for the user\n // to set them, but they have configured defaults.\n activityTimeout: number;\n enableStats: boolean;\n httpHost: string;\n httpPath: string;\n httpPort: number;\n httpsPort: number;\n pongTimeout: number;\n statsHost: string;\n unavailableTimeout: number;\n useTLS: boolean;\n wsHost: string;\n wsPath: string;\n wsPort: number;\n wssPort: number;\n userAuthenticator: UserAuthenticationHandler;\n channelAuthorizer: ChannelAuthorizationHandler;\n\n // these are all optional parameters or overrrides. The customer can set these\n // but it's not strictly necessary\n forceTLS?: boolean;\n cluster?: string;\n disabledTransports?: Transport[];\n enabledTransports?: Transport[];\n ignoreNullOrigin?: boolean;\n nacl?: nacl;\n timelineParams?: any;\n}\n\n// getConfig mainly sets the defaults for the options that are not provided\nexport function getConfig(opts: Options, pusher): Config {\n let config: Config = {\n activityTimeout: opts.activityTimeout || Defaults.activityTimeout,\n cluster: opts.cluster || Defaults.cluster,\n httpPath: opts.httpPath || Defaults.httpPath,\n httpPort: opts.httpPort || Defaults.httpPort,\n httpsPort: opts.httpsPort || Defaults.httpsPort,\n pongTimeout: opts.pongTimeout || Defaults.pongTimeout,\n statsHost: opts.statsHost || Defaults.stats_host,\n unavailableTimeout: opts.unavailableTimeout || Defaults.unavailableTimeout,\n wsPath: opts.wsPath || Defaults.wsPath,\n wsPort: opts.wsPort || Defaults.wsPort,\n wssPort: opts.wssPort || Defaults.wssPort,\n\n enableStats: getEnableStatsConfig(opts),\n httpHost: getHttpHost(opts),\n useTLS: shouldUseTLS(opts),\n wsHost: getWebsocketHost(opts),\n\n userAuthenticator: buildUserAuthenticator(opts),\n channelAuthorizer: buildChannelAuthorizer(opts, pusher)\n };\n\n if ('disabledTransports' in opts)\n config.disabledTransports = opts.disabledTransports;\n if ('enabledTransports' in opts)\n config.enabledTransports = opts.enabledTransports;\n if ('ignoreNullOrigin' in opts)\n config.ignoreNullOrigin = opts.ignoreNullOrigin;\n if ('timelineParams' in opts) config.timelineParams = opts.timelineParams;\n if ('nacl' in opts) {\n config.nacl = opts.nacl;\n }\n\n return config;\n}\n\nfunction getHttpHost(opts: Options): string {\n if (opts.httpHost) {\n return opts.httpHost;\n }\n if (opts.cluster) {\n return `sockjs-${opts.cluster}.pusher.com`;\n }\n return Defaults.httpHost;\n}\n\nfunction getWebsocketHost(opts: Options): string {\n if (opts.wsHost) {\n return opts.wsHost;\n }\n if (opts.cluster) {\n return getWebsocketHostFromCluster(opts.cluster);\n }\n return getWebsocketHostFromCluster(Defaults.cluster);\n}\n\nfunction getWebsocketHostFromCluster(cluster: string): string {\n return `ws-${cluster}.pusher.com`;\n}\n\nfunction shouldUseTLS(opts: Options): boolean {\n if (Runtime.getProtocol() === 'https:') {\n return true;\n } else if (opts.forceTLS === false) {\n return false;\n }\n return true;\n}\n\n// if enableStats is set take the value\n// if disableStats is set take the inverse\n// otherwise default to false\nfunction getEnableStatsConfig(opts: Options): boolean {\n if ('enableStats' in opts) {\n return opts.enableStats;\n }\n if ('disableStats' in opts) {\n return !opts.disableStats;\n }\n return false;\n}\n\nfunction buildUserAuthenticator(opts: Options): UserAuthenticationHandler {\n const userAuthentication = {\n ...Defaults.userAuthentication,\n ...opts.userAuthentication\n };\n if (\n 'customHandler' in userAuthentication &&\n userAuthentication['customHandler'] != null\n ) {\n return userAuthentication['customHandler'];\n }\n\n return UserAuthenticator(userAuthentication);\n}\n\nfunction buildChannelAuth(opts: Options, pusher): ChannelAuthorizationOptions {\n let channelAuthorization: ChannelAuthorizationOptions;\n if ('channelAuthorization' in opts) {\n channelAuthorization = {\n ...Defaults.channelAuthorization,\n ...opts.channelAuthorization\n };\n } else {\n channelAuthorization = {\n transport: opts.authTransport || Defaults.authTransport,\n endpoint: opts.authEndpoint || Defaults.authEndpoint\n };\n if ('auth' in opts) {\n if ('params' in opts.auth) channelAuthorization.params = opts.auth.params;\n if ('headers' in opts.auth)\n channelAuthorization.headers = opts.auth.headers;\n }\n if ('authorizer' in opts)\n channelAuthorization.customHandler = ChannelAuthorizerProxy(\n pusher,\n channelAuthorization,\n opts.authorizer\n );\n }\n return channelAuthorization;\n}\n\nfunction buildChannelAuthorizer(\n opts: Options,\n pusher\n): ChannelAuthorizationHandler {\n const channelAuthorization = buildChannelAuth(opts, pusher);\n if (\n 'customHandler' in channelAuthorization &&\n channelAuthorization['customHandler'] != null\n ) {\n return channelAuthorization['customHandler'];\n }\n\n return ChannelAuthorizer(channelAuthorization);\n}\n","import {\n UserAuthenticationCallback,\n InternalAuthOptions,\n UserAuthenticationHandler,\n UserAuthenticationRequestParams,\n AuthRequestType\n} from './options';\n\nimport Runtime from 'runtime';\n\nconst composeChannelQuery = (\n params: UserAuthenticationRequestParams,\n authOptions: InternalAuthOptions\n) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n\n return query;\n};\n\nconst UserAuthenticator = (\n authOptions: InternalAuthOptions\n): UserAuthenticationHandler => {\n if (typeof Runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n\n return (\n params: UserAuthenticationRequestParams,\n callback: UserAuthenticationCallback\n ) => {\n const query = composeChannelQuery(params, authOptions);\n\n Runtime.getAuthorizers()[authOptions.transport](\n Runtime,\n query,\n authOptions,\n AuthRequestType.UserAuthentication,\n callback\n );\n };\n};\n\nexport default UserAuthenticator;\n","import Channel from '../channels/channel';\nimport {\n ChannelAuthorizationCallback,\n ChannelAuthorizationHandler,\n ChannelAuthorizationRequestParams,\n InternalAuthOptions\n} from './options';\n\nexport interface DeprecatedChannelAuthorizer {\n authorize(socketId: string, callback: ChannelAuthorizationCallback): void;\n}\n\nexport interface ChannelAuthorizerGenerator {\n (\n channel: Channel,\n options: DeprecatedAuthorizerOptions\n ): DeprecatedChannelAuthorizer;\n}\n\nexport interface DeprecatedAuthOptions {\n params?: any;\n headers?: any;\n}\n\nexport interface DeprecatedAuthorizerOptions {\n authTransport: 'ajax' | 'jsonp';\n authEndpoint: string;\n auth?: DeprecatedAuthOptions;\n}\n\nexport const ChannelAuthorizerProxy = (\n pusher,\n authOptions: InternalAuthOptions,\n channelAuthorizerGenerator: ChannelAuthorizerGenerator\n): ChannelAuthorizationHandler => {\n const deprecatedAuthorizerOptions: DeprecatedAuthorizerOptions = {\n authTransport: authOptions.transport,\n authEndpoint: authOptions.endpoint,\n auth: {\n params: authOptions.params,\n headers: authOptions.headers\n }\n };\n return (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback\n ) => {\n const channel = pusher.channel(params.channelName);\n // This line creates a new channel authorizer every time.\n // In the past, this was only done once per channel and reused.\n // We can do that again if we want to keep this behavior intact.\n const channelAuthorizer: DeprecatedChannelAuthorizer = channelAuthorizerGenerator(\n channel,\n deprecatedAuthorizerOptions\n );\n channelAuthorizer.authorize(params.socketId, callback);\n };\n};\n","import {\n AuthRequestType,\n InternalAuthOptions,\n ChannelAuthorizationHandler,\n ChannelAuthorizationRequestParams,\n ChannelAuthorizationCallback\n} from './options';\n\nimport Runtime from 'runtime';\n\nconst composeChannelQuery = (\n params: ChannelAuthorizationRequestParams,\n authOptions: InternalAuthOptions\n) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n\n query += '&channel_name=' + encodeURIComponent(params.channelName);\n\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n\n return query;\n};\n\nconst ChannelAuthorizer = (\n authOptions: InternalAuthOptions\n): ChannelAuthorizationHandler => {\n if (typeof Runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n\n return (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback\n ) => {\n const query = composeChannelQuery(params, authOptions);\n\n Runtime.getAuthorizers()[authOptions.transport](\n Runtime,\n query,\n authOptions,\n AuthRequestType.ChannelAuthorization,\n callback\n );\n };\n};\n\nexport default ChannelAuthorizer;\n","import Logger from './logger';\nimport Pusher from './pusher';\nimport EventsDispatcher from './events/dispatcher';\n\nexport default class WatchlistFacade extends EventsDispatcher {\n private pusher: Pusher;\n\n public constructor(pusher: Pusher) {\n super(function(eventName, data) {\n Logger.debug(`No callbacks on watchlist events for ${eventName}`);\n });\n\n this.pusher = pusher;\n this.bindWatchlistInternalEvent();\n }\n\n handleEvent(pusherEvent) {\n pusherEvent.data.events.forEach(watchlistEvent => {\n this.emit(watchlistEvent.name, watchlistEvent);\n });\n }\n\n private bindWatchlistInternalEvent() {\n this.pusher.connection.bind('message', pusherEvent => {\n var eventName = pusherEvent.event;\n if (eventName === 'pusher_internal:watchlist_events') {\n this.handleEvent(pusherEvent);\n }\n });\n }\n}\n","import Pusher from './pusher';\nimport Logger from './logger';\nimport {\n UserAuthenticationData,\n UserAuthenticationCallback\n} from './auth/options';\nimport Channel from './channels/channel';\nimport WatchlistFacade from './watchlist';\nimport EventsDispatcher from './events/dispatcher';\nimport flatPromise from './utils/flat_promise';\n\nexport default class UserFacade extends EventsDispatcher {\n pusher: Pusher;\n signin_requested: boolean = false;\n user_data: any = null;\n serverToUserChannel: Channel = null;\n signinDonePromise: Promise = null;\n watchlist: WatchlistFacade;\n private _signinDoneResolve: Function = null;\n\n public constructor(pusher: Pusher) {\n super(function(eventName, data) {\n Logger.debug('No callbacks on user for ' + eventName);\n });\n this.pusher = pusher;\n this.pusher.connection.bind('state_change', ({ previous, current }) => {\n if (previous !== 'connected' && current === 'connected') {\n this._signin();\n }\n if (previous === 'connected' && current !== 'connected') {\n this._cleanup();\n this._newSigninPromiseIfNeeded();\n }\n });\n\n this.watchlist = new WatchlistFacade(pusher);\n\n this.pusher.connection.bind('message', event => {\n var eventName = event.event;\n if (eventName === 'pusher:signin_success') {\n this._onSigninSuccess(event.data);\n }\n if (\n this.serverToUserChannel &&\n this.serverToUserChannel.name === event.channel\n ) {\n this.serverToUserChannel.handleEvent(event);\n }\n });\n }\n\n public signin() {\n if (this.signin_requested) {\n return;\n }\n\n this.signin_requested = true;\n this._signin();\n }\n\n private _signin() {\n if (!this.signin_requested) {\n return;\n }\n\n this._newSigninPromiseIfNeeded();\n\n if (this.pusher.connection.state !== 'connected') {\n // Signin will be attempted when the connection is connected\n return;\n }\n\n this.pusher.config.userAuthenticator(\n {\n socketId: this.pusher.connection.socket_id\n },\n this._onAuthorize\n );\n }\n\n private _onAuthorize: UserAuthenticationCallback = (\n err,\n authData: UserAuthenticationData\n ) => {\n if (err) {\n Logger.warn(`Error during signin: ${err}`);\n this._cleanup();\n return;\n }\n\n this.pusher.send_event('pusher:signin', {\n auth: authData.auth,\n user_data: authData.user_data\n });\n\n // Later when we get pusher:singin_success event, the user will be marked as signed in\n };\n\n private _onSigninSuccess(data: any) {\n try {\n this.user_data = JSON.parse(data.user_data);\n } catch (e) {\n Logger.error(`Failed parsing user data after signin: ${data.user_data}`);\n this._cleanup();\n return;\n }\n\n if (typeof this.user_data.id !== 'string' || this.user_data.id === '') {\n Logger.error(\n `user_data doesn't contain an id. user_data: ${this.user_data}`\n );\n this._cleanup();\n return;\n }\n\n // Signin succeeded\n this._signinDoneResolve();\n this._subscribeChannels();\n }\n\n private _subscribeChannels() {\n const ensure_subscribed = channel => {\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n } else if (\n !channel.subscriptionPending &&\n this.pusher.connection.state === 'connected'\n ) {\n channel.subscribe();\n }\n };\n\n this.serverToUserChannel = new Channel(\n `#server-to-user-${this.user_data.id}`,\n this.pusher\n );\n this.serverToUserChannel.bind_global((eventName, data) => {\n if (\n eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0\n ) {\n // ignore internal events\n return;\n }\n this.emit(eventName, data);\n });\n ensure_subscribed(this.serverToUserChannel);\n }\n\n private _cleanup() {\n this.user_data = null;\n if (this.serverToUserChannel) {\n this.serverToUserChannel.unbind_all();\n this.serverToUserChannel.disconnect();\n this.serverToUserChannel = null;\n }\n\n if (this.signin_requested) {\n // If signin is in progress and cleanup is called,\n // Mark the current signin process as done.\n this._signinDoneResolve();\n }\n }\n\n private _newSigninPromiseIfNeeded() {\n if (!this.signin_requested) {\n return;\n }\n\n // If there is a promise and it is not resolved, return without creating a new one.\n if (this.signinDonePromise && !(this.signinDonePromise as any).done) {\n return;\n }\n\n // This promise is never rejected.\n // It gets resolved when the signin process is done whether it failed or succeeded\n const { promise, resolve, reject: _ } = flatPromise();\n (promise as any).done = false;\n const setDone = () => {\n (promise as any).done = true;\n };\n promise.then(setDone).catch(setDone);\n this.signinDonePromise = promise;\n this._signinDoneResolve = resolve;\n }\n}\n","function flatPromise() {\n let resolve, reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nexport default flatPromise;\n","import AbstractRuntime from '../runtimes/interface';\nimport Runtime from 'runtime';\nimport Util from './util';\nimport * as Collections from './utils/collections';\nimport Channels from './channels/channels';\nimport Channel from './channels/channel';\nimport { default as EventsDispatcher } from './events/dispatcher';\nimport Timeline from './timeline/timeline';\nimport TimelineSender from './timeline/timeline_sender';\nimport TimelineLevel from './timeline/level';\nimport { defineTransport } from './strategies/strategy_builder';\nimport ConnectionManager from './connection/connection_manager';\nimport ConnectionManagerOptions from './connection/connection_manager_options';\nimport { PeriodicTimer } from './utils/timers';\nimport Defaults from './defaults';\nimport * as DefaultConfig from './config';\nimport Logger from './logger';\nimport Factory from './utils/factory';\nimport UrlStore from 'core/utils/url_store';\nimport { Options } from './options';\nimport { Config, getConfig } from './config';\nimport StrategyOptions from './strategies/strategy_options';\nimport UserFacade from './user';\n\nexport default class Pusher {\n /* STATIC PROPERTIES */\n static instances: Pusher[] = [];\n static isReady: boolean = false;\n static logToConsole: boolean = false;\n\n // for jsonp\n static Runtime: AbstractRuntime = Runtime;\n static ScriptReceivers: any = (Runtime).ScriptReceivers;\n static DependenciesReceivers: any = (Runtime).DependenciesReceivers;\n static auth_callbacks: any = (Runtime).auth_callbacks;\n\n static ready() {\n Pusher.isReady = true;\n for (var i = 0, l = Pusher.instances.length; i < l; i++) {\n Pusher.instances[i].connect();\n }\n }\n\n static log: (message: any) => void;\n\n private static getClientFeatures(): string[] {\n return Collections.keys(\n Collections.filterObject({ ws: Runtime.Transports.ws }, function(t) {\n return t.isSupported({});\n })\n );\n }\n\n /* INSTANCE PROPERTIES */\n key: string;\n config: Config;\n channels: Channels;\n global_emitter: EventsDispatcher;\n sessionID: number;\n timeline: Timeline;\n timelineSender: TimelineSender;\n connection: ConnectionManager;\n timelineSenderTimer: PeriodicTimer;\n user: UserFacade;\n constructor(app_key: string, options?: Options) {\n checkAppKey(app_key);\n options = options || {};\n if (!options.cluster && !(options.wsHost || options.httpHost)) {\n let suffix = UrlStore.buildLogSuffix('javascriptQuickStart');\n Logger.warn(\n `You should always specify a cluster when connecting. ${suffix}`\n );\n }\n if ('disableStats' in options) {\n Logger.warn(\n 'The disableStats option is deprecated in favor of enableStats'\n );\n }\n\n this.key = app_key;\n this.config = getConfig(options, this);\n\n this.channels = Factory.createChannels();\n this.global_emitter = new EventsDispatcher();\n this.sessionID = Runtime.randomInt(1000000000);\n\n this.timeline = new Timeline(this.key, this.sessionID, {\n cluster: this.config.cluster,\n features: Pusher.getClientFeatures(),\n params: this.config.timelineParams || {},\n limit: 50,\n level: TimelineLevel.INFO,\n version: Defaults.VERSION\n });\n if (this.config.enableStats) {\n this.timelineSender = Factory.createTimelineSender(this.timeline, {\n host: this.config.statsHost,\n path: '/timeline/v2/' + Runtime.TimelineTransport.name\n });\n }\n\n var getStrategy = (options: StrategyOptions) => {\n return Runtime.getDefaultStrategy(this.config, options, defineTransport);\n };\n\n this.connection = Factory.createConnectionManager(this.key, {\n getStrategy: getStrategy,\n timeline: this.timeline,\n activityTimeout: this.config.activityTimeout,\n pongTimeout: this.config.pongTimeout,\n unavailableTimeout: this.config.unavailableTimeout,\n useTLS: Boolean(this.config.useTLS)\n });\n\n this.connection.bind('connected', () => {\n this.subscribeAll();\n if (this.timelineSender) {\n this.timelineSender.send(this.connection.isUsingTLS());\n }\n });\n\n this.connection.bind('message', event => {\n var eventName = event.event;\n var internal = eventName.indexOf('pusher_internal:') === 0;\n if (event.channel) {\n var channel = this.channel(event.channel);\n if (channel) {\n channel.handleEvent(event);\n }\n }\n // Emit globally [deprecated]\n if (!internal) {\n this.global_emitter.emit(event.event, event.data);\n }\n });\n this.connection.bind('connecting', () => {\n this.channels.disconnect();\n });\n this.connection.bind('disconnected', () => {\n this.channels.disconnect();\n });\n this.connection.bind('error', err => {\n Logger.warn(err);\n });\n\n Pusher.instances.push(this);\n this.timeline.info({ instances: Pusher.instances.length });\n\n this.user = new UserFacade(this);\n\n if (Pusher.isReady) {\n this.connect();\n }\n }\n\n channel(name: string): Channel {\n return this.channels.find(name);\n }\n\n allChannels(): Channel[] {\n return this.channels.all();\n }\n\n connect() {\n this.connection.connect();\n\n if (this.timelineSender) {\n if (!this.timelineSenderTimer) {\n var usingTLS = this.connection.isUsingTLS();\n var timelineSender = this.timelineSender;\n this.timelineSenderTimer = new PeriodicTimer(60000, function() {\n timelineSender.send(usingTLS);\n });\n }\n }\n }\n\n disconnect() {\n this.connection.disconnect();\n\n if (this.timelineSenderTimer) {\n this.timelineSenderTimer.ensureAborted();\n this.timelineSenderTimer = null;\n }\n }\n\n bind(event_name: string, callback: Function, context?: any): Pusher {\n this.global_emitter.bind(event_name, callback, context);\n return this;\n }\n\n unbind(event_name?: string, callback?: Function, context?: any): Pusher {\n this.global_emitter.unbind(event_name, callback, context);\n return this;\n }\n\n bind_global(callback: Function): Pusher {\n this.global_emitter.bind_global(callback);\n return this;\n }\n\n unbind_global(callback?: Function): Pusher {\n this.global_emitter.unbind_global(callback);\n return this;\n }\n\n unbind_all(callback?: Function): Pusher {\n this.global_emitter.unbind_all();\n return this;\n }\n\n subscribeAll() {\n var channelName;\n for (channelName in this.channels.channels) {\n if (this.channels.channels.hasOwnProperty(channelName)) {\n this.subscribe(channelName);\n }\n }\n }\n\n subscribe(channel_name: string) {\n var channel = this.channels.add(channel_name, this);\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n } else if (\n !channel.subscriptionPending &&\n this.connection.state === 'connected'\n ) {\n channel.subscribe();\n }\n return channel;\n }\n\n unsubscribe(channel_name: string) {\n var channel = this.channels.find(channel_name);\n if (channel && channel.subscriptionPending) {\n channel.cancelSubscription();\n } else {\n channel = this.channels.remove(channel_name);\n if (channel && channel.subscribed) {\n channel.unsubscribe();\n }\n }\n }\n\n send_event(event_name: string, data: any, channel?: string) {\n return this.connection.send_event(event_name, data, channel);\n }\n\n shouldUseTLS(): boolean {\n return this.config.useTLS;\n }\n\n signin() {\n this.user.signin();\n }\n}\n\nfunction checkAppKey(key) {\n if (key === null || key === undefined) {\n throw 'You must pass your app key when you instantiate Pusher.';\n }\n}\n\nRuntime.setup(Pusher);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\tflarum.reg._webpack_runtimes[\"flarum-realtime\"] ||= __webpack_require__;// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/app');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extend');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Application');","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\n/**\n * Singleton that tracks realtime channel state and holds registrations from\n * extensions. It decouples the channel setup timing (which happens during\n * Application.mount) from extender registration (which happens at boot, before\n * mount).\n *\n * Extensions interact with this indirectly via the Realtime JS extender.\n * Internal realtime code calls the `notify*` methods once channels are ready.\n */\nclass RealtimeState {\n constructor() {\n _defineProperty(this, \"userChannelCallbacks\", []);\n _defineProperty(this, \"publicChannelCallbacks\", []);\n _defineProperty(this, \"discussionStreamEventNames\", new Set());\n _defineProperty(this, \"userChannel\", null);\n _defineProperty(this, \"publicChannel\", null);\n }\n // ---------------------------------------------------------------------------\n // Registration (called by extensions via the Realtime extender)\n // ---------------------------------------------------------------------------\n\n /**\n * Register event names that should trigger a DiscussionPage stream reload.\n * Called by the Realtime extender on behalf of other extensions.\n */\n registerDiscussionStreamEvents(eventNames) {\n for (const name of eventNames) {\n this.discussionStreamEventNames.add(name);\n }\n }\n\n /**\n * Run `callback` once the user private channel is ready, or immediately if\n * it is already established.\n */\n onUserChannelReady(callback) {\n if (this.userChannel) {\n callback(this.userChannel);\n } else {\n this.userChannelCallbacks.push(callback);\n }\n }\n\n /**\n * Run `callback` once the public channel is ready, or immediately if it is\n * already established.\n */\n onPublicChannelReady(callback) {\n if (this.publicChannel) {\n callback(this.publicChannel);\n } else {\n this.publicChannelCallbacks.push(callback);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Getters (called by internal realtime components)\n // ---------------------------------------------------------------------------\n\n /**\n * Returns all discussion stream event names registered by extensions.\n * Used by Discussion/NewActivity to know which events to bind.\n */\n getDiscussionStreamEventNames() {\n return Array.from(this.discussionStreamEventNames);\n }\n\n // ---------------------------------------------------------------------------\n // Notification (called by Application.ts once channels are subscribed)\n // ---------------------------------------------------------------------------\n\n /**\n * Called by Application.ts once the user private channel is subscribed.\n * Flushes any pending callbacks.\n */\n notifyUserChannelReady(channel) {\n this.userChannel = channel;\n for (const cb of this.userChannelCallbacks) {\n cb(channel);\n }\n this.userChannelCallbacks = [];\n }\n\n /**\n * Called by Application.ts once the public channel is subscribed.\n * Flushes any pending callbacks.\n */\n notifyPublicChannelReady(channel) {\n this.publicChannel = channel;\n for (const cb of this.publicChannelCallbacks) {\n cb(channel);\n }\n this.publicChannelCallbacks = [];\n }\n}\nexport default new RealtimeState();","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/Component');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/NotificationType');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/models/Discussion');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Link');","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport NotificationType from 'flarum/forum/components/NotificationType';\nimport Discussion from 'flarum/common/models/Discussion';\nimport Link from 'flarum/common/components/Link';\nfunction toastDiscussion(notification) {\n const subject = notification.subject();\n if (!subject) return null;\n if (subject instanceof Discussion) return subject;\n if (typeof subject.discussion === 'function') {\n var _discussion;\n return (_discussion = subject.discussion()) != null ? _discussion : null;\n }\n return null;\n}\n\n/**\n * Renders the stack of realtime notification toasts in the top-right corner.\n * Each toast wraps the standard NotificationType component (same as the dropdown),\n * with the related discussion title shown as context above it.\n */\nexport default class NotificationToast extends Component {\n view() {\n const toasts = this.attrs.state.all();\n if (!toasts.length) return null;\n return m(\"div\", {\n className: \"NotificationToasts\",\n \"aria-live\": \"polite\",\n \"aria-label\": app.translator.trans('core.forum.notifications.title')\n }, toasts.map(entry => {\n const discussion = toastDiscussion(entry.notification);\n return m(\"div\", {\n key: entry.id,\n className: \"NotificationToast\",\n onclick: () => this.attrs.state.dismiss(entry.id)\n }, discussion && m(\"div\", {\n className: \"NotificationToast-context\"\n }, m(Link, {\n href: app.route.discussion(discussion)\n }, discussion.title())), m(NotificationType, {\n notification: entry.notification\n }));\n }));\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/components/NotificationToast', NotificationToast);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nlet nextId = 0;\n\n/**\n * Manages the queue of realtime notification toasts.\n * Each toast auto-dismisses after the configured flarum-realtime.notification-toast-dismiss-after seconds.\n */\nexport default class NotificationToastState {\n constructor() {\n _defineProperty(this, \"toasts\", []);\n }\n all() {\n return this.toasts;\n }\n push(notification) {\n var _app$data$settings, _app$data, _settings$flarumReal;\n const settings = (_app$data$settings = (_app$data = app.data) == null ? void 0 : _app$data.settings) != null ? _app$data$settings : {};\n const dismissAfterS = (_settings$flarumReal = settings['flarum-realtime.notification-toast-dismiss-after']) != null ? _settings$flarumReal : 10;\n if (dismissAfterS === 0) return;\n const id = nextId++;\n this.toasts.push({\n id,\n notification\n });\n m.redraw();\n setTimeout(() => this.dismiss(id), dismissAfterS * 1000);\n }\n dismiss(id) {\n const index = this.toasts.findIndex(t => t.id === id);\n if (index !== -1) {\n this.toasts.splice(index, 1);\n m.redraw();\n }\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/states/NotificationToastState', NotificationToastState);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/DiscussionPage');","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport DiscussionPage from 'flarum/forum/components/DiscussionPage';\nimport RealtimeState from '../../RealtimeState';\nconst CORE_POSTED_EVENT = 'Flarum\\\\Post\\\\Event\\\\Posted';\nconst CORE_RENAMED_EVENT = 'discussionRenamed';\nconst CORE_REVISED_EVENT = 'revisedEvent';\nexport default function () {\n extend(DiscussionPage.prototype, 'oninit', function () {\n this.websocketEventPosted = data => {\n var _this$discussion;\n const discussion = app.store.pushPayload(data);\n if (discussion.id() === ((_this$discussion = this.discussion) == null ? void 0 : _this$discussion.id()) && this.stream) {\n const oldCount = this.discussion.commentCount();\n app.store.find('discussions', this.discussion.id()).then(() => {\n this.stream.update().then(() => m.redraw());\n if (!document.hasFocus()) {\n app.setTitleCount(Math.max(0, this.discussion.commentCount() - oldCount));\n $(window).one('focus', () => {\n app.setTitleCount(0);\n });\n }\n });\n }\n };\n this.websocketEventStreamUpdate = data => {\n var _this$discussion2;\n const discussion = app.store.pushPayload(data);\n if (discussion.id() === ((_this$discussion2 = this.discussion) == null ? void 0 : _this$discussion2.id()) && this.stream) {\n app.store.find('discussions', this.discussion.id()).then(() => {\n this.stream.update().then(() => m.redraw());\n });\n }\n };\n });\n extend(DiscussionPage.prototype, 'oncreate', function () {\n var _app$websocket_channe, _app$websocket_channe2, _app$websocket_channe3, _app$websocket_channe4, _app$websocket_channe5, _app$websocket_channe6;\n (_app$websocket_channe = app.websocket_channels.public) == null || _app$websocket_channe.bind(CORE_POSTED_EVENT, this.websocketEventPosted.bind(this));\n (_app$websocket_channe2 = app.websocket_channels.user) == null || _app$websocket_channe2.bind(CORE_POSTED_EVENT, this.websocketEventPosted.bind(this));\n (_app$websocket_channe3 = app.websocket_channels.public) == null || _app$websocket_channe3.bind(CORE_RENAMED_EVENT, this.websocketEventStreamUpdate.bind(this));\n (_app$websocket_channe4 = app.websocket_channels.user) == null || _app$websocket_channe4.bind(CORE_RENAMED_EVENT, this.websocketEventStreamUpdate.bind(this));\n (_app$websocket_channe5 = app.websocket_channels.public) == null || _app$websocket_channe5.bind(CORE_REVISED_EVENT, this.websocketEventPosted.bind(this));\n (_app$websocket_channe6 = app.websocket_channels.user) == null || _app$websocket_channe6.bind(CORE_REVISED_EVENT, this.websocketEventPosted.bind(this));\n for (const eventName of RealtimeState.getDiscussionStreamEventNames()) {\n var _app$websocket_channe7, _app$websocket_channe8;\n (_app$websocket_channe7 = app.websocket_channels.public) == null || _app$websocket_channe7.bind(eventName, this.websocketEventStreamUpdate.bind(this));\n (_app$websocket_channe8 = app.websocket_channels.user) == null || _app$websocket_channe8.bind(eventName, this.websocketEventStreamUpdate.bind(this));\n }\n });\n extend(DiscussionPage.prototype, 'onremove', function () {\n var _app$websocket_channe9, _app$websocket_channe10, _app$websocket_channe11, _app$websocket_channe12, _app$websocket_channe13, _app$websocket_channe14;\n (_app$websocket_channe9 = app.websocket_channels.public) == null || _app$websocket_channe9.unbind(CORE_POSTED_EVENT);\n (_app$websocket_channe10 = app.websocket_channels.user) == null || _app$websocket_channe10.unbind(CORE_POSTED_EVENT);\n (_app$websocket_channe11 = app.websocket_channels.public) == null || _app$websocket_channe11.unbind(CORE_RENAMED_EVENT);\n (_app$websocket_channe12 = app.websocket_channels.user) == null || _app$websocket_channe12.unbind(CORE_RENAMED_EVENT);\n (_app$websocket_channe13 = app.websocket_channels.public) == null || _app$websocket_channe13.unbind(CORE_REVISED_EVENT);\n (_app$websocket_channe14 = app.websocket_channels.user) == null || _app$websocket_channe14.unbind(CORE_REVISED_EVENT);\n for (const eventName of RealtimeState.getDiscussionStreamEventNames()) {\n var _app$websocket_channe15, _app$websocket_channe16;\n (_app$websocket_channe15 = app.websocket_channels.public) == null || _app$websocket_channe15.unbind(eventName);\n (_app$websocket_channe16 = app.websocket_channels.user) == null || _app$websocket_channe16.unbind(eventName);\n }\n });\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/Stream');","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nexport default isObject;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nexport default freeGlobal;\n","import freeGlobal from './_freeGlobal.js';\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nexport default root;\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import root from './_root.js';\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nexport default Symbol;\n","import Symbol from './_Symbol.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nexport default getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nexport default objectToString;\n","import Symbol from './_Symbol.js';\nimport getRawTag from './_getRawTag.js';\nimport objectToString from './_objectToString.js';\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nexport default baseGetTag;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nexport default isSymbol;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nexport default isObjectLike;\n","import isObject from './isObject.js';\nimport now from './now.js';\nimport toNumber from './toNumber.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nexport default debounce;\n","import debounce from './debounce.js';\nimport isObject from './isObject.js';\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nexport default throttle;\n","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Icon');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/classList');","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nimport { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Stream from 'flarum/common/utils/Stream';\n// @ts-ignore — lodash-es does not ship its own declaration files\nimport throttle from 'lodash-es/throttle';\nimport Icon from 'flarum/common/components/Icon';\nimport classList from 'flarum/common/utils/classList';\nexport default function () {\n extend('flarum/forum/components/PostStream', 'endItems', function (items) {\n if (this.discussion.attribute('canViewWhoTypes')) {\n var _app$session;\n const typingUsers = Object.keys(this.getTypingUsers());\n const count = typingUsers.length;\n const max = 3;\n const classes = classList(['TypingUsersContainer', count > 0 && 'TypingUsersContainer-active']);\n const typingIcon = count > 0 ? 'fas fa-ellipsis-h fa-beat' : 'fas fa-pause';\n const namedUsers = typingUsers.slice(0, max).join(', ');\n let showUsers = true;\n if ((_app$session = app.session) != null && _app$session.user) {\n var _app$session$user$pre, _app$session$user$pre2;\n showUsers = (_app$session$user$pre = (_app$session$user$pre2 = app.session.user.preferences()) == null ? void 0 : _app$session$user$pre2['flarum-realtime.typing-indicator-full']) != null ? _app$session$user$pre : true;\n }\n items.add('usersTyping', m(\"div\", {\n className: classes,\n key: \"typing\"\n }, m(\"div\", {\n className: \"TypingUsers\"\n }, m(Icon, {\n name: typingIcon\n }), count > 0 ? showUsers ? app.translator.trans('flarum-realtime.forum.typing-indicator.users-are-typing', {\n users: namedUsers,\n count,\n others: Math.max(count - max, 0)\n }) : app.translator.trans('flarum-realtime.forum.typing-indicator.people-are-typing', {\n number: count\n }) : app.translator.trans('flarum-realtime.forum.typing-indicator.no-activity'))), 70);\n }\n });\n extend('flarum/forum/components/PostStream', 'oninit', function () {\n this.previousContent = Stream('');\n this.usersTyping = Stream({});\n this.typingTruncationListener = null;\n this.typingListener = null;\n this.getTypingUsers = () => {\n const invalidateWhen = Date.now() - 6000;\n const users = _objectSpread({}, this.usersTyping());\n let latestTime = null;\n for (const displayName of Object.keys(users)) {\n if (users[displayName] < invalidateWhen) {\n delete users[displayName];\n } else if (!latestTime || latestTime < users[displayName]) {\n latestTime = users[displayName];\n }\n }\n this.usersTyping(users);\n if (latestTime && this.typingTruncationListener) {\n clearTimeout(this.typingTruncationListener);\n }\n if (latestTime) {\n this.typingTruncationListener = setTimeout(() => m.redraw(), latestTime - Date.now());\n }\n return users;\n };\n this.userTyping = data => {\n const users = _objectSpread({}, this.usersTyping());\n if (!data.discloseOnline) {\n data.displayName = String(app.translator.trans('flarum-realtime.forum.typing-indicator.anonymous-user'));\n }\n users[data.displayName] = data.time;\n this.usersTyping(users);\n m.redraw();\n };\n this.actorIsTyping = () => {\n var _app$session$user, _app$websocket_channe, _app$session$user2;\n const discloseOnline = (_app$session$user = app.session.user) == null || (_app$session$user = _app$session$user.preferences()) == null ? void 0 : _app$session$user.discloseOnline;\n (_app$websocket_channe = app.websocket_channels.discussion) == null || _app$websocket_channe.trigger('client-typing', {\n displayName: discloseOnline ? (_app$session$user2 = app.session.user) == null ? void 0 : _app$session$user2.displayName() : '[anonymous]',\n discloseOnline,\n time: Date.now()\n });\n };\n this.checkTyping = () => {\n var _fields, _fields$content;\n if (!app.composer.composingReplyTo(this.discussion)) return;\n const currentContent = (_fields = app.composer.fields) == null || (_fields$content = _fields.content) == null ? void 0 : _fields$content.call(_fields);\n if (this.previousContent() !== currentContent) {\n this.actorIsTyping();\n this.previousContent(currentContent);\n }\n };\n });\n extend('flarum/forum/components/PostStream', 'view', function () {\n if (app.forum.attribute('websocket.disallow_connection')) return;\n if (this.discussion && app.composer.editor && !this.typingListener) {\n const checkFn = throttle(() => this.checkTyping(), 2000);\n this.typingListener = setInterval(checkFn, 1000);\n }\n if (this.discussion) {\n app.websocket_channels.discussion = app.websocket.subscribe('private-typing=' + m.route.param('id').match(/[0-9]+/));\n if (this.discussion.attribute('canViewWhoTypes')) {\n app.websocket_channels.discussion.bind('client-typing', data => {\n this.userTyping(data);\n });\n }\n }\n });\n extend('flarum/forum/components/PostStream', 'onremove', function () {\n if (this.typingListener) clearInterval(this.typingListener);\n if (this.typingTruncationListener) clearTimeout(this.typingTruncationListener);\n });\n}","import app from 'flarum/forum/app';\nimport NewActivity from './Discussion/NewActivity';\nimport TypingIndicator from './Discussion/TypingIndicator';\nexport default function Discussion() {\n NewActivity();\n if (!!app.data['flarum-realtime.typing-indicator']) {\n TypingIndicator();\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/Discussion', Discussion);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/models/Post');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'forum/components/IndexPage');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Button');","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nexport default class WebsocketUpdates {\n constructor() {\n _defineProperty(this, \"discussions\", {});\n _defineProperty(this, \"releaseInterval\", app.forum.attribute('flarum-realtime.release-discussion-updates-interval'));\n _defineProperty(this, \"timer\", void 0);\n _defineProperty(this, \"onTimerCallback\", null);\n _defineProperty(this, \"seconds\", this.releaseInterval);\n }\n length() {\n return Object.keys(this.discussions).length;\n }\n push(discussion) {\n this.discussions[discussion.id()] = discussion;\n }\n remove(discussion) {\n delete this.discussions[discussion.id()];\n }\n has(discussion) {\n return !!this.discussions[discussion.id()];\n }\n isEmpty() {\n return this.length() === 0;\n }\n reset() {\n this.discussions = {};\n }\n getReleaseInterval() {\n return this.releaseInterval;\n }\n\n /**\n * Releases new discussion updates to the discussion list.\n */\n release(state) {\n // Push all discussions to the UI list.\n Object.keys(this.discussions).forEach(id => {\n state.addDiscussion(this.discussions[id]);\n });\n\n // Reset new discussions array.\n this.reset();\n\n // Reset page count.\n app.setTitleCount(0);\n }\n\n /**\n * Starts the timer that will release new discussion updates to the discussion list.\n */\n startTimer() {\n if (this.autoRelease()) {\n clearInterval(this.timer);\n this.seconds = this.getReleaseInterval();\n this.timer = window.setInterval(() => {\n if (this.seconds < 0 && this.timer) return clearInterval(this.timer);\n this.seconds--;\n this.onTimerCallback && this.onTimerCallback(this.seconds);\n }, 1000);\n }\n }\n onTimer(callback) {\n this.onTimerCallback = callback;\n }\n autoRelease() {\n return this.releaseInterval > 0;\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/DiscussionList/WebsocketUpdates', WebsocketUpdates);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/extractText');","import app from 'flarum/forum/app';\nimport NewActivity from './DiscussionList/NewActivity';\nexport default function DiscussionList() {\n if (!!app.data['flarum-realtime.release-discussion-updates']) {\n NewActivity();\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/DiscussionList', DiscussionList);","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Discussion from 'flarum/common/models/Discussion';\nimport Post from 'flarum/common/models/Post';\nimport IndexPage from 'flarum/forum/components/IndexPage';\nimport Button from 'flarum/common/components/Button';\nimport WebsocketUpdates from './WebsocketUpdates';\nimport extractText from 'flarum/common/utils/extractText';\nexport default function () {\n extend(IndexPage.prototype, 'oninit', function () {\n this._realtimeWebsocketUpdates = new WebsocketUpdates();\n this._realtimeReleaseTimeout = this._realtimeWebsocketUpdates.getReleaseInterval();\n this._realtimeWebsocketEventPosted = data => {\n var _params$filter;\n const params = app.discussions.getParams();\n const activeTag = params.tags ? app.store.getBy('tags', 'slug', params.tags) : null;\n const noFilters = Object.keys((_params$filter = params.filter) != null ? _params$filter : {}).length === 0;\n if (!params.q && !params.sort && (activeTag || noFilters)) {\n var _recipientUsers, _ref, _recipientGroups, _ref2, _recipientUsers2, _ref3, _recipientGroups2, _ref4, _tags, _ref5, _tags2, _ref6, _subscription, _ref7, _tags3, _ref8, _discussions$getPages, _app$current$get, _subscription3, _ref10;\n const entity = app.store.pushPayload(data);\n let discussion = entity instanceof Discussion ? entity : null;\n if (!discussion && entity instanceof Post) {\n discussion = entity.discussion();\n }\n if (!discussion) return;\n\n // Byobu private discussions guards.\n if (app.current.data.routeName === 'byobuPrivate' && !((_recipientUsers = (_ref = discussion).recipientUsers) != null && _recipientUsers.call(_ref) && (_recipientGroups = (_ref2 = discussion).recipientGroups) != null && _recipientGroups.call(_ref2))) {\n return;\n }\n if (app.current.data.routeName === 'byobuPrivate' && ((_recipientUsers2 = (_ref3 = discussion).recipientUsers) == null || (_recipientUsers2 = _recipientUsers2.call(_ref3)) == null ? void 0 : _recipientUsers2.length) === 0 && ((_recipientGroups2 = (_ref4 = discussion).recipientGroups) == null || (_recipientGroups2 = _recipientGroups2.call(_ref4)) == null ? void 0 : _recipientGroups2.length) === 0) {\n return;\n }\n if (app.current.data.routeName === 'byobuUserPrivate') return;\n if (app.current.data.routeName === 'user.discussions') return;\n\n // Tag-based filtering (flarum/tags).\n if (activeTag && (_tags = (_ref5 = discussion).tags) != null && _tags.call(_ref5)) {\n const tagIds = discussion.tags().map(tag => tag.id());\n if (!tagIds.includes(activeTag.id())) return;\n }\n if ((_tags2 = (_ref6 = discussion).tags) != null && _tags2.call(_ref6) && discussion.tags().find(tag => {\n var _tag$isHidden, _tag$subscription;\n if (activeTag && activeTag.id() === tag.id()) return false;\n if (!activeTag && (_tag$isHidden = tag.isHidden) != null && _tag$isHidden.call(tag)) return true;\n return ((_tag$subscription = tag.subscription) == null ? void 0 : _tag$subscription.call(tag)) === 'hide';\n })) {\n return;\n }\n\n // Subscription filtering (flarum/subscriptions).\n if (((_subscription = (_ref7 = discussion).subscription) == null ? void 0 : _subscription.call(_ref7)) === 'ignore') return;\n const subscribedTag = (_tags3 = (_ref8 = discussion).tags) == null || (_tags3 = _tags3.call(_ref8)) == null ? void 0 : _tags3.find(tag => {\n var _tag$subscription2, _tag$subscription3;\n return ((_tag$subscription2 = tag.subscription) == null ? void 0 : _tag$subscription2.call(tag)) === 'lurk' || ((_tag$subscription3 = tag.subscription) == null ? void 0 : _tag$subscription3.call(tag)) === 'follow';\n });\n if (app.current.get('routeName') === 'following') {\n var _params$filter2, _subscription2, _ref9;\n if ((_params$filter2 = params.filter) != null && _params$filter2['following-tag'] && !subscribedTag || ((_subscription2 = (_ref9 = discussion).subscription) == null ? void 0 : _subscription2.call(_ref9)) !== 'follow') {\n return;\n }\n }\n const websocketUpdates = this._realtimeWebsocketUpdates;\n if (websocketUpdates.has(discussion)) return;\n if (((_discussions$getPages = app.discussions.getPages()[0]) == null || (_discussions$getPages = _discussions$getPages.items[0]) == null ? void 0 : _discussions$getPages.id()) === discussion.id()) return;\n const pushOnIndex = !app.current.get('discussion');\n const pushOnView = discussion.id() === ((_app$current$get = app.current.get('discussion')) == null ? void 0 : _app$current$get.id()) || subscribedTag || ((_subscription3 = (_ref10 = discussion).subscription) == null ? void 0 : _subscription3.call(_ref10)) === 'follow';\n if (pushOnIndex || pushOnView) {\n websocketUpdates.push(discussion);\n app.setTitleCount(websocketUpdates.length());\n m.redraw();\n }\n }\n };\n });\n extend(IndexPage.prototype, 'oncreate', function () {\n var _app$websocket_channe, _app$websocket_channe2, _app$websocket_channe3, _app$websocket_channe4;\n (_app$websocket_channe = app.websocket_channels.public) == null || _app$websocket_channe.bind('Flarum\\\\Discussion\\\\Event\\\\Started', this._realtimeWebsocketEventPosted.bind(this));\n (_app$websocket_channe2 = app.websocket_channels.public) == null || _app$websocket_channe2.bind('Flarum\\\\Post\\\\Event\\\\Posted', this._realtimeWebsocketEventPosted.bind(this));\n (_app$websocket_channe3 = app.websocket_channels.user) == null || _app$websocket_channe3.bind('Flarum\\\\Discussion\\\\Event\\\\Started', this._realtimeWebsocketEventPosted.bind(this));\n (_app$websocket_channe4 = app.websocket_channels.user) == null || _app$websocket_channe4.bind('Flarum\\\\Post\\\\Event\\\\Posted', this._realtimeWebsocketEventPosted.bind(this));\n });\n extend(IndexPage.prototype, 'onremove', function () {\n var _app$websocket_channe5, _app$websocket_channe6, _app$websocket_channe7, _app$websocket_channe8;\n (_app$websocket_channe5 = app.websocket_channels.public) == null || _app$websocket_channe5.unbind('Flarum\\\\Discussion\\\\Event\\\\Started');\n (_app$websocket_channe6 = app.websocket_channels.public) == null || _app$websocket_channe6.unbind('Flarum\\\\Post\\\\Event\\\\Posted');\n (_app$websocket_channe7 = app.websocket_channels.user) == null || _app$websocket_channe7.unbind('Flarum\\\\Discussion\\\\Event\\\\Started');\n (_app$websocket_channe8 = app.websocket_channels.user) == null || _app$websocket_channe8.unbind('Flarum\\\\Post\\\\Event\\\\Posted');\n });\n extend(IndexPage.prototype, 'contentItems', function (items) {\n const websocketUpdates = this._realtimeWebsocketUpdates;\n if (!websocketUpdates || websocketUpdates.isEmpty()) return;\n const releaseUpdates = () => {\n websocketUpdates.release(app.discussions);\n app.setTitleCount(0);\n m.redraw();\n };\n const buttonLabel = releaseTimeout => websocketUpdates.autoRelease() ? app.translator.trans('flarum-realtime.forum.push.discussion-list-new-activity-with-auto-release', {\n count: websocketUpdates.length(),\n releaseTimeout\n }) : app.translator.trans('flarum-realtime.forum.push.discussion-list-new-activity', {\n count: websocketUpdates.length()\n });\n websocketUpdates.startTimer();\n websocketUpdates.onTimer(second => {\n if (second === 0) return releaseUpdates();\n this.$('.DiscussionList-update > .Button-label').text(extractText(buttonLabel(second)));\n });\n items.add('realtimeNewActivity', Button.component({\n className: 'Button DiscussionList-update',\n 'aria-live': 'polite',\n 'aria-atomic': 'true',\n onclick: releaseUpdates\n }, buttonLabel(this._realtimeReleaseTimeout)), 95);\n });\n extend(IndexPage.prototype, 'actionItems', items => {\n items.remove('refresh');\n });\n}","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/FieldSet');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/utils/ItemList');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/components/Switch');","import app from 'flarum/forum/app';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Switch from 'flarum/common/components/Switch';\nexport default function RealtimeUserPreferencesItems(user) {\n var _preferences;\n const items = new ItemList();\n let typingIndicatorLoading = false;\n items.add('typing-indicator', [m(Switch, {\n state: (_preferences = user.preferences()) == null ? void 0 : _preferences['flarum-realtime.typing-indicator-full'],\n onchange: value => {\n typingIndicatorLoading = true;\n user.savePreferences({\n 'flarum-realtime.typing-indicator-full': value\n }).then(() => {\n typingIndicatorLoading = false;\n m.redraw();\n });\n },\n loading: typingIndicatorLoading\n }, app.translator.trans('flarum-realtime.forum.user.settings.typing-indicator-type.label')), m(\"p\", {\n className: \"helpText\"\n }, app.translator.trans('flarum-realtime.forum.user.settings.typing-indicator-type.help'))], 80);\n return items;\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/User/RealtimeUserPreferences', RealtimeUserPreferencesItems);","import app from 'flarum/forum/app';\nimport { extend } from 'flarum/common/extend';\nimport FieldSet from 'flarum/common/components/FieldSet';\nimport RealtimeUserPreferencesItems from './RealtimeUserPreferences';\nexport default function extendUserPreferences() {\n if (!!app.data['flarum-realtime.typing-indicator']) {\n extend('flarum/forum/components/SettingsPage', 'settingsItems', function (items) {\n const user = this.user;\n if (!user || !user.canViewWhoTypes()) {\n return;\n }\n items.add('realtimeItems', m(FieldSet, {\n className: \"Settings-realtime\",\n label: app.translator.trans('flarum-realtime.forum.user.settings.heading')\n }, RealtimeUserPreferencesItems(user).toArray()), 55);\n });\n }\n}\nflarum.reg.add('flarum-realtime', 'forum/extend/User/extendUserPreferences', extendUserPreferences);","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/extenders');","const __WEBPACK_NAMESPACE_OBJECT__ = flarum.reg.get('core', 'common/models/User');","import Extend from 'flarum/common/extenders';\nimport User from 'flarum/common/models/User';\nexport default [new Extend.Model(User) //\n.attribute('canViewWhoTypes')];","import app from 'flarum/forum/app';\nimport Application from './extend/Application';\nimport Discussion from './extend/Discussion';\nimport DiscussionList from './extend/DiscussionList';\nimport User from './extend/User';\nimport RealtimeExtend from './extenders/Realtime';\nimport RealtimeState from './RealtimeState';\n\n// Manually register these for other extensions to consume via ext: imports,\n// since the autoExportLoader cannot match ES class / instance default exports.\nflarum.reg.add('flarum-realtime', 'forum/extenders/Realtime', RealtimeExtend);\nflarum.reg.add('flarum-realtime', 'forum/RealtimeState', RealtimeState);\nexport { default as extend } from './extend';\napp.initializers.add('flarum-realtime', () => {\n Application();\n Discussion();\n DiscussionList();\n User();\n});","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport RealtimeState from '../RealtimeState';\n/**\n * JS extender for integrating with flarum/realtime.\n *\n * Use this in your extension's `extend.ts`, guarded by an extension check:\n *\n * ```ts\n * import { RealtimeExtend } from 'flarum/realtime/forum';\n *\n * export default [\n * ...('flarum-realtime' in flarum.extensions\n * ? [\n * new RealtimeExtend()\n * .onDiscussionStreamEvent('likesMutation'),\n * ]\n * : []),\n * ];\n * ```\n *\n * The guard is necessary because this module will not be available when\n * flarum/realtime is not installed.\n */\nexport default class Realtime {\n constructor() {\n /**\n * Events that should trigger a discussion stream update on DiscussionPage.\n */\n _defineProperty(this, \"discussionStreamEvents\", []);\n /**\n * Arbitrary channel event bindings.\n */\n _defineProperty(this, \"channelBindings\", []);\n }\n /**\n * Register a Pusher event name that should trigger a discussion stream\n * reload on the currently open DiscussionPage.\n *\n * The event is bound on both the public and user channels. When received,\n * DiscussionPage reloads the post stream so the UI reflects the change\n * (e.g. a post being liked, locked, voted on).\n *\n * @param eventName The Pusher event name, e.g. 'likesMutation'.\n */\n onDiscussionStreamEvent(eventName) {\n this.discussionStreamEvents.push({\n eventName\n });\n return this;\n }\n\n /**\n * Bind a callback to an event on the user's private channel.\n *\n * @param eventName The Pusher event name.\n * @param callback Called with the event payload when the event fires.\n */\n onUserChannelEvent(eventName, callback) {\n this.channelBindings.push({\n channel: 'user',\n eventName,\n callback\n });\n return this;\n }\n\n /**\n * Bind a callback to an event on the public channel.\n *\n * @param eventName The Pusher event name.\n * @param callback Called with the event payload when the event fires.\n */\n onPublicChannelEvent(eventName, callback) {\n this.channelBindings.push({\n channel: 'public',\n eventName,\n callback\n });\n return this;\n }\n\n /**\n * Bind a callback to an event on both the public and user channels.\n *\n * @param eventName The Pusher event name.\n * @param callback Called with the event payload when the event fires.\n */\n onBothChannelsEvent(eventName, callback) {\n this.channelBindings.push({\n channel: 'both',\n eventName,\n callback\n });\n return this;\n }\n extend(app, extension) {\n if (!this.discussionStreamEvents.length && !this.channelBindings.length) {\n return;\n }\n RealtimeState.registerDiscussionStreamEvents(this.discussionStreamEvents.map(e => e.eventName));\n for (const binding of this.channelBindings) {\n if (binding.channel === 'user' || binding.channel === 'both') {\n RealtimeState.onUserChannelReady(channel => {\n channel.bind(binding.eventName, binding.callback);\n });\n }\n if (binding.channel === 'public' || binding.channel === 'both') {\n RealtimeState.onPublicChannelReady(channel => {\n channel.bind(binding.eventName, binding.callback);\n });\n }\n }\n }\n}","import { extend } from 'flarum/common/extend';\nimport app from 'flarum/forum/app';\nimport Pusher from 'pusher-js';\nimport Application from 'flarum/common/Application';\nimport RealtimeState from '../RealtimeState';\nimport NotificationToast from '../components/NotificationToast';\nimport NotificationToastState from '../states/NotificationToastState';\nexport default function () {\n extend(Application.prototype, 'mount', function () {\n // Enable logging to console when debug is enabled.\n Pusher.logToConsole = this.forum.attribute('debug');\n const wsHost = this.forum.attribute('websocket.host');\n const secure = this.forum.attribute('websocket.secure');\n app.websocket = new Pusher(this.forum.attribute('websocket.key'), {\n channelAuthorization: {\n endpoint: this.forum.attribute('apiUrl') + '/websocket/auth',\n transport: 'ajax'\n },\n wsHost,\n wsPort: this.forum.attribute('websocket.port'),\n wssPort: this.forum.attribute('websocket.port'),\n enabledTransports: ['wss', 'ws'],\n forceTLS: secure\n });\n app.websocket_channels = {\n public: null,\n user: null\n };\n\n // Mount the notification toast container outside the main Mithril tree.\n const toastState = new NotificationToastState();\n const toastEl = document.createElement('div');\n document.body.appendChild(toastEl);\n m.mount(toastEl, {\n view: () => m(NotificationToast, {\n state: toastState\n })\n });\n if (app.session.user) {\n const userChannel = app.websocket.subscribe('private-user=' + app.session.user.id());\n app.websocket_channels.user = userChannel;\n RealtimeState.notifyUserChannelReady(userChannel);\n\n // Show a toast for each incoming realtime notification and update the badge count.\n userChannel.bind('notification', data => {\n const notification = app.store.pushPayload(data);\n if (notification) {\n var _user$unreadNotificat, _user$newNotification;\n const user = app.session.user;\n user == null || user.pushAttributes({\n unreadNotificationCount: ((_user$unreadNotificat = user.unreadNotificationCount()) != null ? _user$unreadNotificat : 0) + 1,\n newNotificationCount: ((_user$newNotification = user.newNotificationCount()) != null ? _user$newNotification : 0) + 1\n });\n toastState.push(notification);\n }\n });\n } else if (!this.forum.attribute('websocket.disallow_connection')) {\n const publicChannel = app.websocket.subscribe('public');\n app.websocket_channels.public = publicChannel;\n RealtimeState.notifyPublicChannelReady(publicChannel);\n }\n\n // iOS Safari silently drops WebSocket connections when the tab is\n // backgrounded or the device sleeps, without firing `close` — pusher-js's\n // built-in recovery never triggers, so realtime updates go missing until\n // the page is reloaded. iOS also bfcaches pages on app-switch, which\n // restores via `pageshow` (persisted=true) and does NOT fire\n // `visibilitychange` on return. We therefore hook both events.\n //\n // After reconnecting, Pusher has no server-side buffering for events that\n // fired while the socket was dead — we refresh the visible discussions\n // list once the new connection reports `'connected'` so the UI catches up\n // on missed activity. Refresh is gated on the `'connected'` event (not\n // fired immediately after `connect()`) because an immediate Mithril redraw\n // races with pusher-js's channel resubscription and can leave the client\n // receiving no further push events.\n //\n // See flarum/framework#4588.\n const RECONNECT_HIDDEN_THRESHOLD_MS = 5000;\n let hiddenSince = null;\n const forceReconnect = () => {\n if (!app.websocket) return;\n const connection = app.websocket.connection;\n const onReconnected = () => {\n var _discussions, _discussions$refresh;\n connection == null || connection.unbind('connected', onReconnected);\n (_discussions = app.discussions) == null || (_discussions$refresh = _discussions.refresh) == null || _discussions$refresh.call(_discussions);\n };\n connection == null || connection.bind('connected', onReconnected);\n app.websocket.disconnect();\n // Small gap: pusher-js's internal state machine can no-op `connect()`\n // when called synchronously during a teardown that is still in flight.\n setTimeout(() => {\n var _app$websocket;\n return (_app$websocket = app.websocket) == null ? void 0 : _app$websocket.connect();\n }, 100);\n };\n\n // Application.mount() runs once per page load, so these listeners are\n // installed once and live for the lifetime of the page — no teardown needed.\n document.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n hiddenSince = Date.now();\n return;\n }\n if (hiddenSince === null) return;\n const wasHiddenFor = Date.now() - hiddenSince;\n hiddenSince = null;\n if (wasHiddenFor > RECONNECT_HIDDEN_THRESHOLD_MS) {\n forceReconnect();\n }\n });\n window.addEventListener('pageshow', event => {\n if (event.persisted) forceReconnect();\n });\n });\n}","import extendUserPreferences from './User/extendUserPreferences';\nexport default function () {\n extendUserPreferences();\n}"],"names":["factory","window","installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","INVALID_BYTE","Coder","_paddingCharacter","encodedLength","length","this","encode","data","out","_encodeByte","left","maxDecodedLength","decodedLength","_getPaddingLength","decode","Uint8Array","paddingLength","op","haveBad","v0","v1","v2","v3","_decodeChar","charCodeAt","Error","b","result","String","fromCharCode","stdCoder","URLSafeCoder","_super","__extends","urlSafeCoder","encodeURLSafe","decodeURLSafe","INVALID_UTF16","INVALID_UTF8","arr","pos","chars","min","n1","n2","n3","push","join","default","AuthRequestType","ScriptReceiverFactory","prefix","lastId","callback","number","id","called","callbackWrapper","apply","arguments","remove","receiver","ScriptReceivers","defaults","endpoint","transport","DependencyLoader","options","receivers","loading","load","self","request","runtime","createScriptRequest","getPath","error","callbacks","successCallback","wasSuccessful","cleanup","send","getRoot","protocol","getDocument","location","useTLS","cdn_https","cdn_http","replace","version","suffix","DependenciesReceivers","Dependencies","dependency_loader","urlStore","baseUrl","urls","authenticationEndpoint","path","authorizationEndpoint","javascriptQuickStart","triggeringClientEvents","encryptedChannelSupport","fullUrl","url_store","url","urlObj","urlPrefix","BadEventName","msg","_this","setPrototypeOf","_newTarget","BadChannelName","RequestTimedOut","TransportPriorityTooLow","TransportClosed","UnsupportedFeature","UnsupportedTransport","UnsupportedStrategy","HTTPAuthError","status","xhr_auth","context","query","authOptions","authRequestType","xhr","createXHR","headerName","open","setRequestHeader","headers","headersProvider","dynamicHeaders","onreadystatechange","readyState","parsed","JSON","parse","responseText","e","toString","UserAuthentication","ChannelAuthorization","b64chars","b64tab","base64_i","charAt","cb_utob","cc","cb_encode","ccc","padlen","ord","btoa","abstract_timer","Timer","set","clear","delay","timer","isRunning","ensureAborted","timers_clearTimeout","clearTimeout","timers_clearInterval","clearInterval","OneOffTimer","setTimeout","timers_extends","PeriodicTimer","setInterval","Util","now","Date","valueOf","defer","method","args","_i","boundArguments","Array","slice","concat","util","extend","target","sources","extensions","constructor","stringify","safeJSONStringify","arrayIndexOf","array","item","nativeIndexOf","indexOf","objectApply","f","keys","_","map","filter","test","filterObject","Boolean","any","encodeParamsObject","encodeURIComponent","source","objects","paths","derez","nu","$ref","logger_Logger","Logger","globalLog","message","console","log","debug","warn","globalLogWarn","globalLogError","defaultLoggingFunction","core_pusher","logToConsole","logger","jsonp_auth","undefined","callbackName","nextAuthCallbackID","document","script","createElement","auth_callbacks","callback_name","src","head","getElementsByTagName","documentElement","insertBefore","firstChild","ScriptRequest","errorString","type","charset","addEventListener","onerror","onload","async","attachEvent","navigator","userAgent","errorScript","text","nextSibling","parentNode","removeChild","JSONPRequest","jsonp_timeline","getAgent","sender","host","createJSONPRequest","getGenericURL","baseScheme","params","hostTLS","hostNonTLS","getGenericPath","queryString","ws","getInitial","httpPath","http","sockjs","CallbackRegistry","_callbacks","add","prefixedEventName","fn","names","removeCallback","removeAllCallbacks","binding","Dispatcher","failThrough","callback_registry","global_callbacks","eventName","bind_global","unbind","unbind_global","unbind_all","emit","metadata","transport_connection_TransportConnection","TransportConnection","hooks","priority","initialize","transportConnectionInitializer","state","timeline","activityTimeout","generateUniqueID","transport_connection_extends","handlesActivityChecks","supportsPing","connect","socket","getSocket","onError","changeState","bindListeners","close","ping","onOpen","beforeOpen","onopen","buildTimelineMessage","onClose","closeEvent","code","reason","wasClean","unbindListeners","onMessage","onActivity","onclose","onmessage","onactivity","info","cid","dispatcher","Transport","isSupported","environment","createConnection","transport_connection","WSTransport","transports_transport","isInitialized","getWebSocketAPI","createWebSocket","httpConfiguration","streamingConfiguration","HTTPFactory","createStreamingSocket","pollingConfiguration","createPollingSocket","xhrConfiguration","isXHRSupported","transports","xhr_streaming","xhr_polling","SockJSTransport","file","SockJS","js_path","ignore_null_origin","ignoreNullOrigin","xdrConfiguration","isXDRSupported","XDRStreamingTransport","XDRPollingTransport","xdr_streaming","xdr_polling","transports_transports","net_info_Network","NetInfo","net_info_extends","isOnline","onLine","AssistantToTheTransportManager","manager","minPingDelay","maxPingDelay","pingDelay","connection","openTimestamp","onClosed","reportDeath","lifespan","Math","max","isAlive","Protocol","decodeMessage","messageEvent","messageData","pusherEventData","pusherEvent","event","channel","user_id","encodeMessage","processHandshake","activity_timeout","action","socket_id","getCloseAction","getCloseError","protocol_protocol","Connection","connection_extends","send_event","listeners","activity","closed","handleCloseEvent","listener","Handshake","finish","connection_connection","TimelineSender","isEmpty","TimelineTransport","Channel","pusher","subscribed","subscriptionPending","subscriptionCancelled","channel_extends","authorize","socketId","auth","trigger","disconnect","handleEvent","handleSubscriptionSucceededEvent","handleSubscriptionCountEvent","unsubscribe","subscription_count","subscriptionCount","subscribe","assign","channel_data","cancelSubscription","reinstateSubscription","PrivateChannel","private_channel_extends","config","channelAuthorizer","channelName","channels_channel","Members","reset","members","each","member","setMyID","myID","onSubscription","subscriptionData","presence","hash","count","me","addMember","memberData","user_info","removeMember","PresenceChannel","presence_channel_extends","authData","channelData","user","signinDonePromise","_a","sent","user_data","handleInternalEvent","addedMember","removedMember","private_channel","EncryptedChannel","nacl","encrypted_channel_extends","sharedSecret","base64","handleEncryptedEvent","ciphertext","nonce","cipherText","secretbox","overheadLength","nonceLength","bytes","getDataToEmit","raw","utf8","ConnectionManager","usingTLS","errorCallbacks","buildErrorCallbacks","connectionCallbacks","buildConnectionCallbacks","handshakeCallbacks","buildHandshakeCallbacks","Network","getNetwork","netinfo","retryIn","sendActivityCheck","updateStrategy","connection_manager_extends","runner","strategy","updateState","startConnecting","setUnavailableTimer","disconnectInternally","isUsingTLS","handshake","handshakeError","abortConnecting","abort","clearRetryTimer","clearUnavailableTimer","abandonConnection","getStrategy","round","retryTimer","unavailableTimer","unavailableTimeout","stopActivityCheck","activityTimer","pongTimeout","pong_timed_out","resetActivityCheck","shouldRetry","connected","Infinity","setConnection","withErrorEmitted","tls_only","refused","backoff","retry","newState","previousState","newStateDescription","previous","current","Channels","channels","createEncryptedChannel","errMsg","createPrivateChannel","createPresenceChannel","createChannel","all","values","find","createChannels","createConnectionManager","connection_manager","presence_channel","encrypted_channel","createTimelineSender","timeline_sender","createHandshake","connection_handshake","createAssistantToTheTransportManager","assistant_to_the_transport_manager","TransportManager","livesLeft","lives","getAssistant","SequentialStrategy","strategies","loop","failFast","timeout","timeoutLimit","minPriority","tryNextStrategy","tryStrategy","forceMinPriority","BestConnectedEverStrategy","runners","rs","collections_all","allRunnersFailed","callbackBuilder","abortRunner","aborted","cached_strategy_CachedStrategy","CachedStrategy","ttl","storage","getLocalStorage","serializedCache","getTransportCacheKey","flushTransportCache","fetchTransportCache","timestamp","cached","latency","sequential_strategy","startTimestamp","pop","cb","storeTransportCache","DelayedStrategy","IfStrategy","trueBranch","falseBranch","FirstConnectedStrategy","testSupportsStrategy","State","http_xdomain_request","getRequest","xdr","XDomainRequest","ontimeout","onprogress","onChunk","abortRequest","HTTPRequest","http_request_extends","start","payload","position","unloader","addUnloadListener","removeUnloadListener","chunk","advanceBuffer","isBufferTooLong","buffer","unreadData","endOfLinePosition","autoIncrement","getUniqueURL","separator","randomNumber","randomInt","TimelineLevel","http_socket","HTTPSocket","session","randomString","parts","exec","base","getLocation","CONNECTING","openStream","sendRaw","sendHeartbeat","OPEN","createSocketRequest","reconnect","closeStream","CLOSED","onEvent","onHeartbeat","hostname","urlParts","stream","getReceiveURL","onFinished","http_streaming_socket","http_polling_socket","http_xhr_request","getXHRAPI","getDefaultStrategy","baseOptions","defineTransport","definedTransports","defineTransportStrategy","wsStrategy","ws_options","wsHost","wsPort","wssPort","wsPath","wss_options","sockjs_options","httpHost","httpPort","httpsPort","timeouts","ws_manager","transport_manager","streaming_manager","ws_transport","wss_transport","sockjs_transport","xhr_streaming_transport","xdr_streaming_transport","xhr_polling_transport","xdr_polling_transport","ws_loop","wss_loop","sockjs_loop","streaming_loop","if_strategy","polling_loop","http_loop","best_connected_ever_strategy","delayed_strategy","http_fallback_loop","cached_strategy","first_connected_strategy","Transports","createSocket","createRequest","http_request","http_http","XMLHttpRequest","WebSocket","MozWebSocket","setup","PusherClass","Pusher","initializeOnDocumentBody","onDocumentBody","ready","getProtocol","getAuthorizers","ajax","jsonp","body","jsonp_request","script_request","localStorage","createXMLHttpRequest","createMicrosoftXHR","ActiveXObject","createXDR","Constructor","withCredentials","documentProtocol","removeEventListener","detachEvent","floor","crypto","getRandomValues","Uint32Array","pow","timeline_level","Timeline","events","uniqueID","level","limit","shift","ERROR","INFO","DEBUG","sendfn","bundle","lib","cluster","features","TransportStrategy","failAttempt","onInitialized","serializedTransport","strategy_builder_Transports","strategy_builder_defineTransport","transportClass","enabledTransports","disabledTransports","strategy_builder_UnsupportedStrategy","transport_strategy","deferred","getHttpHost","opts","getWebsocketHost","getWebsocketHostFromCluster","shouldUseTLS","forceTLS","getEnableStatsConfig","enableStats","disableStats","buildUserAuthenticator","userAuthentication","__assign","paramsProvider","dynamicParams","composeChannelQuery","user_authenticator","buildChannelAuthorizer","channelAuthorization","authTransport","authEndpoint","customHandler","channelAuthorizerGenerator","deprecatedAuthorizerOptions","ChannelAuthorizerProxy","authorizer","buildChannelAuth","channel_authorizer_composeChannelQuery","channel_authorizer","WatchlistFacade","bindWatchlistInternalEvent","watchlist_extends","forEach","watchlistEvent","UserFacade","signin_requested","serverToUserChannel","_signinDoneResolve","_onAuthorize","err","_cleanup","_signin","_newSigninPromiseIfNeeded","watchlist","_onSigninSuccess","user_extends","signin","userAuthenticator","_subscribeChannels","done","resolve","reject","promise","Promise","res","rej","flat_promise","setDone","then","pusher_Pusher","app_key","checkAppKey","statsHost","timelineParams","global_emitter","sessionID","timeline_timeline","getClientFeatures","timelineSender","subscribeAll","internal","instances","isReady","allChannels","timelineSenderTimer","event_name","channel_name","Runtime","__webpack_exports__","__webpack_module_cache__","flarum","reg","_webpack_runtimes","cachedModule","__webpack_modules__","a","definition","g","globalThis","Function","obj","prop","_typeof","iterator","_defineProperty","toPrimitive","TypeError","toPropertyKey","configurable","writable","Set","registerDiscussionStreamEvents","eventNames","discussionStreamEventNames","onUserChannelReady","userChannel","userChannelCallbacks","onPublicChannelReady","publicChannel","publicChannelCallbacks","getDiscussionStreamEventNames","from","notifyUserChannelReady","notifyPublicChannelReady","NotificationToast","view","toasts","attrs","className","trans","entry","discussion","notification","subject","_discussion","toastDiscussion","onclick","dismiss","href","title","nextId","NotificationToastState","_app$data$settings","_app$data","_settings$flarumReal","dismissAfterS","settings","redraw","index","findIndex","splice","CORE_POSTED_EVENT","CORE_RENAMED_EVENT","CORE_REVISED_EVENT","global","freeSelf","freeGlobal","root","reWhitespace","reTrimStart","string","trimmedEndIndex","objectProto","nativeObjectToString","symToStringTag","isOwn","tag","unmasked","getRawTag","objectToString","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","isObjectLike","baseGetTag","isSymbol","isObject","other","baseTrim","isBinary","nativeMax","nativeMin","func","wait","leading","trailing","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","maxing","invokeFunc","time","thisArg","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","toNumber","cancel","flush","debounce","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptor","_objectSpread","getOwnPropertyDescriptors","defineProperties","Discussion","websocketEventPosted","_this$discussion","pushPayload","oldCount","commentCount","update","hasFocus","$","one","websocketEventStreamUpdate","_this$discussion2","_app$websocket_channe","_app$websocket_channe2","_app$websocket_channe3","_app$websocket_channe4","_app$websocket_channe5","_app$websocket_channe6","public","_app$websocket_channe7","_app$websocket_channe8","_app$websocket_channe9","_app$websocket_channe10","_app$websocket_channe11","_app$websocket_channe12","_app$websocket_channe13","_app$websocket_channe14","_app$websocket_channe15","_app$websocket_channe16","items","attribute","_app$session","typingUsers","getTypingUsers","classes","typingIcon","namedUsers","showUsers","_app$session$user$pre","_app$session$user$pre2","preferences","users","others","previousContent","usersTyping","typingTruncationListener","typingListener","invalidateWhen","latestTime","displayName","userTyping","discloseOnline","actorIsTyping","_app$session$user","_app$session$user2","checkTyping","_fields","_fields$content","composingReplyTo","currentContent","fields","content","editor","checkFn","route","param","match","WebsocketUpdates","releaseInterval","discussions","has","getReleaseInterval","release","addDiscussion","startTimer","autoRelease","seconds","onTimerCallback","onTimer","DiscussionList","_realtimeWebsocketUpdates","_realtimeReleaseTimeout","_realtimeWebsocketEventPosted","_params$filter","getParams","activeTag","tags","getBy","noFilters","q","sort","_recipientUsers","_ref","_recipientGroups","_ref2","_recipientUsers2","_ref3","_recipientGroups2","_ref4","_tags","_ref5","_tags2","_ref6","_subscription","_ref7","_tags3","_ref8","_discussions$getPages","_app$current$get","_subscription3","_ref10","entity","routeName","recipientUsers","recipientGroups","includes","_tag$isHidden","_tag$subscription","isHidden","subscription","subscribedTag","_tag$subscription2","_tag$subscription3","_params$filter2","_subscription2","_ref9","websocketUpdates","getPages","pushOnIndex","pushOnView","releaseUpdates","buttonLabel","releaseTimeout","second","RealtimeUserPreferencesItems","_preferences","typingIndicatorLoading","onchange","savePreferences","extendUserPreferences","canViewWhoTypes","label","toArray","onDiscussionStreamEvent","discussionStreamEvents","onUserChannelEvent","channelBindings","onPublicChannelEvent","onBothChannelsEvent","app","extension","forum","secure","toastState","toastEl","appendChild","mount","_user$unreadNotificat","_user$newNotification","pushAttributes","unreadNotificationCount","newNotificationCount","hiddenSince","forceReconnect","onReconnected","_discussions","_discussions$refresh","refresh","_app$websocket","visibilityState","wasHiddenFor","persisted"],"ignoreList":[],"sourceRoot":""} \ No newline at end of file diff --git a/extensions/realtime/js/src/forum/extend/Application.ts b/extensions/realtime/js/src/forum/extend/Application.ts index 41996db5d6..92a94ed6b9 100644 --- a/extensions/realtime/js/src/forum/extend/Application.ts +++ b/extensions/realtime/js/src/forum/extend/Application.ts @@ -61,5 +61,60 @@ export default function () { app.websocket_channels.public = publicChannel; RealtimeState.notifyPublicChannelReady(publicChannel); } + + // iOS Safari silently drops WebSocket connections when the tab is + // backgrounded or the device sleeps, without firing `close` — pusher-js's + // built-in recovery never triggers, so realtime updates go missing until + // the page is reloaded. iOS also bfcaches pages on app-switch, which + // restores via `pageshow` (persisted=true) and does NOT fire + // `visibilitychange` on return. We therefore hook both events. + // + // After reconnecting, Pusher has no server-side buffering for events that + // fired while the socket was dead — we refresh the visible discussions + // list once the new connection reports `'connected'` so the UI catches up + // on missed activity. Refresh is gated on the `'connected'` event (not + // fired immediately after `connect()`) because an immediate Mithril redraw + // races with pusher-js's channel resubscription and can leave the client + // receiving no further push events. + // + // See flarum/framework#4588. + const RECONNECT_HIDDEN_THRESHOLD_MS = 5_000; + let hiddenSince: number | null = null; + + const forceReconnect = (): void => { + if (!app.websocket) return; + + const connection = (app.websocket as any).connection; + + const onReconnected = (): void => { + connection?.unbind('connected', onReconnected); + (app as any).discussions?.refresh?.(); + }; + connection?.bind('connected', onReconnected); + + app.websocket.disconnect(); + // Small gap: pusher-js's internal state machine can no-op `connect()` + // when called synchronously during a teardown that is still in flight. + setTimeout(() => app.websocket?.connect(), 100); + }; + + // Application.mount() runs once per page load, so these listeners are + // installed once and live for the lifetime of the page — no teardown needed. + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'hidden') { + hiddenSince = Date.now(); + return; + } + if (hiddenSince === null) return; + const wasHiddenFor = Date.now() - hiddenSince; + hiddenSince = null; + if (wasHiddenFor > RECONNECT_HIDDEN_THRESHOLD_MS) { + forceReconnect(); + } + }); + + window.addEventListener('pageshow', (event) => { + if (event.persisted) forceReconnect(); + }); }); }