{"version":3,"sources":["webpack://Pusher/webpack/universalModuleDefinition","webpack://Pusher/webpack/bootstrap","webpack://Pusher/./node_modules/@stablelib/base64/base64.ts","webpack://Pusher/./node_modules/@stablelib/utf8/utf8.ts","webpack://Pusher/./src/core/pusher.js","webpack://Pusher/./src/core/base64.ts","webpack://Pusher/./src/core/utils/timers/abstract_timer.ts","webpack://Pusher/./src/core/utils/timers/index.ts","webpack://Pusher/./src/core/util.ts","webpack://Pusher/./src/core/utils/collections.ts","webpack://Pusher/./src/core/defaults.ts","webpack://Pusher/./src/core/transports/url_schemes.ts","webpack://Pusher/./src/core/events/callback_registry.ts","webpack://Pusher/./src/core/events/dispatcher.ts","webpack://Pusher/./src/core/logger.ts","webpack://Pusher/./src/core/transports/transport_connection.ts","webpack://Pusher/./src/core/transports/transport.ts","webpack://Pusher/./src/runtimes/isomorphic/transports/transports.ts","webpack://Pusher/./src/core/transports/assistant_to_the_transport_manager.ts","webpack://Pusher/./src/core/connection/protocol/protocol.ts","webpack://Pusher/./src/core/connection/connection.ts","webpack://Pusher/./src/core/connection/handshake/index.ts","webpack://Pusher/./src/core/auth/pusher_authorizer.ts","webpack://Pusher/./src/core/timeline/timeline_sender.ts","webpack://Pusher/./src/core/errors.ts","webpack://Pusher/./src/core/utils/url_store.ts","webpack://Pusher/./src/core/channels/channel.ts","webpack://Pusher/./src/core/channels/private_channel.ts","webpack://Pusher/./src/core/channels/members.ts","webpack://Pusher/./src/core/channels/presence_channel.ts","webpack://Pusher/./src/core/channels/encrypted_channel.ts","webpack://Pusher/./src/core/connection/connection_manager.ts","webpack://Pusher/./src/core/channels/channels.ts","webpack://Pusher/./src/core/utils/factory.ts","webpack://Pusher/./src/core/transports/transport_manager.ts","webpack://Pusher/./src/core/strategies/sequential_strategy.ts","webpack://Pusher/./src/core/strategies/best_connected_ever_strategy.ts","webpack://Pusher/./src/core/strategies/cached_strategy.ts","webpack://Pusher/./src/core/strategies/delayed_strategy.ts","webpack://Pusher/./src/core/strategies/if_strategy.ts","webpack://Pusher/./src/core/strategies/first_connected_strategy.ts","webpack://Pusher/./src/runtimes/isomorphic/default_strategy.ts","webpack://Pusher/./src/core/http/state.ts","webpack://Pusher/./src/core/http/http_request.ts","webpack://Pusher/./src/core/http/http_socket.ts","webpack://Pusher/./src/core/timeline/level.ts","webpack://Pusher/./src/core/http/http_streaming_socket.ts","webpack://Pusher/./src/core/http/http_polling_socket.ts","webpack://Pusher/./src/runtimes/isomorphic/http/http_xhr_request.ts","webpack://Pusher/./src/runtimes/isomorphic/runtime.ts","webpack://Pusher/./src/runtimes/isomorphic/transports/transport_connection_initializer.ts","webpack://Pusher/./src/runtimes/isomorphic/http/http.ts","webpack://Pusher/./src/runtimes/worker/net_info.ts","webpack://Pusher/./src/runtimes/worker/auth/fetch_auth.ts","webpack://Pusher/./src/runtimes/worker/runtime.ts","webpack://Pusher/./src/runtimes/worker/timeline/fetch_timeline.ts","webpack://Pusher/./src/core/timeline/timeline.ts","webpack://Pusher/./src/core/strategies/transport_strategy.ts","webpack://Pusher/./src/core/strategies/strategy_builder.ts","webpack://Pusher/./src/core/config.ts","webpack://Pusher/./src/core/pusher.ts"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","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","_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","Coder","stdCoder","URLSafeCoder","urlSafeCoder","INVALID_UTF8","arr","pos","chars","min","n1","n2","n3","push","join","default","b64chars","b64tab","charAt","cb_utob","cc","utob","u","replace","cb_encode","ccc","padlen","ord","btoa","set","clear","delay","callback","timer","isRunning","ensureAborted","clearTimeout","clearInterval","setTimeout","setInterval","now","Date","valueOf","defer","OneOffTimer","method","boundArguments","Array","slice","arguments","apply","concat","extend","target","sources","extensions","constructor","stringify","safeJSONStringify","arrayIndexOf","array","item","nativeIndexOf","indexOf","objectApply","f","keys","_","context","map","filter","test","filterObject","Boolean","any","encodeParamsObject","encodeURIComponent","toString","buildQueryString","params","undefined","source","JSON","e","objects","paths","derez","path","nu","$ref","VERSION","PROTOCOL","wsPort","wssPort","wsPath","httpHost","httpPort","httpsPort","httpPath","stats_host","authEndpoint","authTransport","activityTimeout","pongTimeout","unavailableTimeout","cluster","cdn_http","cdn_https","dependency_suffix","getGenericURL","baseScheme","useTLS","hostTLS","hostNonTLS","getGenericPath","queryString","ws","getInitial","http","_callbacks","prefix","add","prefixedEventName","fn","remove","names","removeCallback","removeAllCallbacks","binding","failThrough","callbacks","global_callbacks","eventName","bind_global","unbind","unbind_global","unbind_all","emit","metadata","args","globalLog","message","console","log","debug","warn","globalLogWarn","error","globalLogError","defaultLoggingFunction","logToConsole","hooks","priority","options","initialize","transportConnectionInitializer","state","timeline","id","generateUniqueID","handlesActivityChecks","supportsPing","connect","socket","url","urls","getSocket","onError","changeState","bindListeners","transport","close","send","ping","onOpen","beforeOpen","getPath","onopen","type","buildTimelineMessage","onClose","closeEvent","code","reason","wasClean","unbindListeners","onMessage","onActivity","onerror","onclose","onmessage","onactivity","info","cid","isSupported","environment","createConnection","WSTransport","isInitialized","getWebSocketAPI","createWebSocket","httpConfiguration","streamingConfiguration","HTTPFactory","createStreamingSocket","pollingConfiguration","createPollingSocket","xhrConfiguration","isXHRSupported","xhr_streaming","xhr_polling","manager","minPingDelay","maxPingDelay","pingDelay","connection","openTimestamp","onClosed","reportDeath","lifespan","Math","max","isAlive","Protocol","decodeMessage","messageEvent","messageData","parse","pusherEventData","pusherEvent","event","channel","user_id","encodeMessage","processHandshake","activity_timeout","action","socket_id","getCloseAction","getCloseError","send_event","listeners","activity","closed","handleCloseEvent","listener","finish","getAuthorizers","authOptions","auth","composeQuery","socketId","query","authorize","PusherAuthorizer","authorizers","isEmpty","TimelineTransport","getAgent","msg","setPrototypeOf","status","urlStore","baseUrl","authenticationEndpoint","javascriptQuickStart","triggeringClientEvents","encryptedChannelSupport","fullUrl","urlObj","urlPrefix","pusher","subscribed","subscriptionPending","subscriptionCancelled","trigger","suffix","disconnect","handleEvent","handleSubscriptionSucceededEvent","unsubscribe","subscribe","assign","HTTPAuthError","channel_data","cancelSubscription","reinstateSubscription","createAuthorizer","config","reset","members","each","member","setMyID","myID","onSubscription","subscriptionData","presence","hash","count","me","addMember","memberData","user_info","removeMember","authData","channelData","handleInternalEvent","addedMember","removedMember","nacl","sharedSecret","handleEncryptedEvent","ciphertext","nonce","cipherText","secretbox","overheadLength","nonceLength","bytes","open","getDataToEmit","raw","usingTLS","errorCallbacks","buildErrorCallbacks","connectionCallbacks","buildConnectionCallbacks","handshakeCallbacks","buildHandshakeCallbacks","Network","getNetwork","netinfo","retryIn","sendActivityCheck","updateStrategy","runner","strategy","updateState","startConnecting","setUnavailableTimer","disconnectInternally","isUsingTLS","handshake","handshakeError","abortConnecting","abort","clearRetryTimer","clearUnavailableTimer","abandonConnection","getStrategy","round","retryTimer","unavailableTimer","stopActivityCheck","activityTimer","pong_timed_out","resetActivityCheck","shouldRetry","connected","Infinity","setConnection","withErrorEmitted","tls_only","refused","backoff","retry","newState","previousState","newStateDescription","previous","current","channels","createEncryptedChannel","errMsg","createPrivateChannel","createPresenceChannel","createChannel","all","values","find","createChannels","createConnectionManager","createTimelineSender","authorizer","createHandshake","createAssistantToTheTransportManager","livesLeft","lives","getAssistant","strategies","loop","failFast","timeout","timeoutLimit","minPriority","tryNextStrategy","tryStrategy","forceMinPriority","callbackBuilder","runners","rs","abortRunner","allRunnersFailed","aborted","transports","ttl","storage","getLocalStorage","serializedCache","getTransportCacheKey","flushTransportCache","fetchTransportCache","timestamp","cached","latency","startTimestamp","pop","cb","storeTransportCache","number","trueBranch","falseBranch","testSupportsStrategy","State","baseOptions","defineTransport","definedTransports","defineTransportStrategy","wsStrategy","ws_options","wsHost","wss_options","http_options","timeouts","ws_manager","streaming_manager","ws_transport","wss_transport","xhr_streaming_transport","xhr_polling_transport","ws_loop","wss_loop","streaming_loop","polling_loop","http_loop","start","payload","position","xhr","getRequest","unloader","addUnloadListener","setRequestHeader","removeUnloadListener","abortRequest","onChunk","chunk","advanceBuffer","isBufferTooLong","buffer","unreadData","endOfLinePosition","autoIncrement","getUniqueURL","separator","randomNumber","floor","random","TimelineLevel","session","randomString","location","parts","exec","base","getLocation","readyState","CONNECTING","openStream","sendRaw","sendHeartbeat","OPEN","createSocketRequest","reconnect","closeStream","CLOSED","onEvent","onHeartbeat","hostname","urlParts","stream","getReceiveURL","onFinished","getXHRAPI","onreadystatechange","onprogress","responseText","getDefaultStrategy","Transports","createSocket","createXHR","createRequest","setup","PusherClass","ready","getClientFeatures","getProtocol","isOnline","headers","Headers","headerName","body","request","Request","credentials","fetch","then","response","text","parsedData","err","sender","host","json","ajax","WebSocket","XMLHttpRequest","events","sent","uniqueID","level","limit","shift","ERROR","INFO","DEBUG","sendfn","bundle","lib","version","features","failAttempt","onInitialized","serializedTransport","transportClass","enabledTransports","disabledTransports","ignoreNullOrigin","deferred","getHttpHost","opts","getWebsocketHost","getWebsocketHostFromCluster","shouldUseTLS","forceTLS","getEnableStatsConfig","enableStats","disableStats","app_key","checkAppKey","statsHost","timelineParams","global_emitter","sessionID","Pusher","timelineSender","subscribeAll","internal","instances","isReady","allChannels","timelineSenderTimer","PeriodicTimer","event_name","channelName","channel_name","Runtime","ScriptReceivers","DependenciesReceivers","auth_callbacks"],"mappings":"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","file":"pusher.worker.min.js","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","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","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 { 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\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\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 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 { 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 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 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 Logger from '../logger';\nimport Channel from '../channels/channel';\nimport Factory from '../utils/factory';\nimport Runtime from 'runtime';\nimport { AuthTransports } from './auth_transports';\nimport {\n AuthOptions,\n AuthorizerOptions,\n Authorizer,\n AuthorizerCallback\n} from './options';\n\nexport default class PusherAuthorizer implements Authorizer {\n static authorizers: AuthTransports;\n\n channel: Channel;\n type: string;\n options: AuthorizerOptions;\n authOptions: AuthOptions;\n\n constructor(channel: Channel, options: AuthorizerOptions) {\n this.channel = channel;\n\n let { authTransport } = options;\n\n if (typeof Runtime.getAuthorizers()[authTransport] === 'undefined') {\n throw `'${authTransport}' is not a recognized auth transport`;\n }\n\n this.type = authTransport;\n this.options = options;\n this.authOptions = options.auth || {};\n }\n\n composeQuery(socketId: string): string {\n var query =\n 'socket_id=' +\n encodeURIComponent(socketId) +\n '&channel_name=' +\n encodeURIComponent(this.channel.name);\n\n for (var i in this.authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(i) +\n '=' +\n encodeURIComponent(this.authOptions.params[i]);\n }\n\n return query;\n }\n\n authorize(socketId: string, callback: AuthorizerCallback): void {\n PusherAuthorizer.authorizers =\n PusherAuthorizer.authorizers || Runtime.getAuthorizers();\n\n PusherAuthorizer.authorizers[this.type].call(\n this,\n Runtime,\n socketId,\n callback\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","/** 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}\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","/**\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/authenticating_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","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 { AuthData, AuthorizerCallback } 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\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: AuthorizerCallback) {\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.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 /** 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: AuthData) => {\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 { AuthorizerCallback } 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: AuthorizerCallback) {\n var authorizer = Factory.createAuthorizer(this, this.pusher.config);\n return authorizer.authorize(socketId, callback);\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 { AuthData } 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 /** Authenticates 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, (error, authData) => {\n if (!error) {\n authData = authData as AuthData;\n if (authData.channel_data === undefined) {\n let suffix = UrlStore.buildLogSuffix('authenticationEndpoint');\n Logger.error(\n `Invalid auth response for channel '${this.name}',` +\n `expected 'channel_data' field. ${suffix}`\n );\n callback('Invalid auth response');\n return;\n }\n var channelData = JSON.parse(authData.channel_data);\n this.members.setMyID(channelData.user_id);\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: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 { AuthData, AuthorizerCallback } 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: AuthorizerCallback) {\n super.authorize(socketId, (error: Error | null, authData: AuthData) => {\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 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 {\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';\nimport { AuthorizerOptions, Authorizer } from '../auth/options';\nimport PusherAuthorizer from '../auth/pusher_authorizer';\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 createAuthorizer(channel: Channel, options: AuthorizerOptions): Authorizer {\n if (options.authorizer) {\n return options.authorizer(channel, options);\n }\n\n return new PusherAuthorizer(channel, 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 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';\nimport StrategyOptions from 'core/strategies/strategy_options';\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 = Collections.extend({}, ws_options, {\n useTLS: true\n });\n var http_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.httpHost + ':' + config.httpPort,\n hostTLS: config.httpHost + ':' + config.httpsPort,\n httpPath: config.httpPath\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 xhr_streaming_transport = defineTransportStrategy(\n 'xhr_streaming',\n 'xhr_streaming',\n 1,\n http_options,\n streaming_manager\n );\n var xhr_polling_transport = defineTransportStrategy(\n 'xhr_polling',\n 'xhr_polling',\n 1,\n http_options\n );\n\n var ws_loop = new SequentialStrategy([ws_transport], timeouts);\n var wss_loop = new SequentialStrategy([wss_transport], timeouts);\n var streaming_loop = new SequentialStrategy(\n [xhr_streaming_transport],\n timeouts\n );\n var polling_loop = new SequentialStrategy([xhr_polling_transport], timeouts);\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 wsStrategy;\n if (baseOptions.useTLS) {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(http_loop, { delay: 2000 })\n ]);\n } else {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(wss_loop, { delay: 2000 }),\n new DelayedStrategy(http_loop, { delay: 5000 })\n ]);\n }\n\n return new CachedStrategy(\n new FirstConnectedStrategy(\n new IfStrategy(testSupportsStrategy(ws_transport), wsStrategy, http_loop)\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 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 Math.floor(Math.random() * max);\n}\n\nfunction randomString(length: number): string {\n var result = [];\n for (var i = 0; i < length; i++) {\n result.push(randomNumber(32).toString(32));\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 * as Collections from 'core/utils/collections';\nimport Transports from 'isomorphic/transports/transports';\nimport TimelineSender from 'core/timeline/timeline_sender';\nimport Ajax from 'core/http/ajax';\nimport getDefaultStrategy from './default_strategy';\nimport TransportsTable from 'core/transports/transports_table';\nimport transportConnectionInitializer from './transports/transport_connection_initializer';\nimport HTTPFactory from './http/http';\n\nvar Isomorphic: any = {\n getDefaultStrategy,\n Transports: Transports,\n transportConnectionInitializer,\n HTTPFactory,\n\n setup(PusherClass): void {\n PusherClass.ready();\n },\n\n getLocalStorage(): any {\n return undefined;\n },\n\n getClientFeatures(): any[] {\n return Collections.keys(\n Collections.filterObject({ ws: Transports.ws }, function(t) {\n return t.isSupported({});\n })\n );\n },\n\n getProtocol(): string {\n return 'http:';\n },\n\n isXHRSupported(): boolean {\n return true;\n },\n\n createSocketRequest(method: string, url: string) {\n if (this.isXHRSupported()) {\n return this.HTTPFactory.createXHR(method, url);\n } else {\n throw 'Cross-origin HTTP requests are not supported';\n }\n },\n\n createXHR(): Ajax {\n var Constructor = this.getXHRAPI();\n return new Constructor();\n },\n\n createWebSocket(url: string): any {\n var Constructor = this.getWebSocketAPI();\n return new Constructor(url);\n },\n\n addUnloadListener(listener: any) {},\n removeUnloadListener(listener: any) {}\n};\n\nexport default Isomorphic;\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 {\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 { default as EventsDispatcher } from 'core/events/dispatcher';\nimport Reachability from 'core/reachability';\n\nexport class NetInfo extends EventsDispatcher implements Reachability {\n isOnline(): boolean {\n return true;\n }\n}\n\nexport var Network = new NetInfo();\n","import AbstractRuntime from 'runtimes/interface';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport { AuthorizerCallback, AuthData } from 'core/auth/options';\nimport { HTTPAuthError } from 'core/errors';\n\nvar fetchAuth: AuthTransport = function(\n context: AbstractRuntime,\n socketId: string,\n callback: AuthorizerCallback\n) {\n var headers = new Headers();\n headers.set('Content-Type', 'application/x-www-form-urlencoded');\n\n for (var headerName in this.authOptions.headers) {\n headers.set(headerName, this.authOptions.headers[headerName]);\n }\n\n var body = this.composeQuery(socketId);\n var request = new Request(this.options.authEndpoint, {\n headers,\n body,\n credentials: 'same-origin',\n method: 'POST'\n });\n\n return fetch(request)\n .then(response => {\n let { status } = response;\n if (status === 200) {\n // manually parse the json so we can provide a more helpful error in\n // failure case\n return response.text();\n }\n throw new HTTPAuthError(\n 200,\n `Could not get auth info from your auth endpoint, status: ${status}`\n );\n })\n .then(data => {\n let parsedData: AuthData;\n try {\n parsedData = JSON.parse(data);\n } catch (e) {\n throw new HTTPAuthError(\n 200,\n 'JSON returned from auth endpoint was invalid, yet status code was 200. Data was: ' +\n data\n );\n }\n callback(null, parsedData);\n })\n .catch(err => {\n callback(err, { auth: '' });\n });\n};\n\nexport default fetchAuth;\n","import Isomorphic from 'isomorphic/runtime';\nimport Runtime from '../interface';\nimport { Network } from './net_info';\nimport fetchAuth from './auth/fetch_auth';\nimport { AuthTransports } from 'core/auth/auth_transports';\nimport fetchTimeline from './timeline/fetch_timeline';\n\n// Very verbose but until unavoidable until\n// TypeScript 2.1, when spread attributes will be\n// supported\nconst {\n getDefaultStrategy,\n Transports,\n setup,\n getProtocol,\n isXHRSupported,\n getLocalStorage,\n createXHR,\n createWebSocket,\n addUnloadListener,\n removeUnloadListener,\n transportConnectionInitializer,\n createSocketRequest,\n HTTPFactory\n} = Isomorphic;\n\nconst Worker: Runtime = {\n getDefaultStrategy,\n Transports,\n setup,\n getProtocol,\n isXHRSupported,\n getLocalStorage,\n createXHR,\n createWebSocket,\n addUnloadListener,\n removeUnloadListener,\n transportConnectionInitializer,\n createSocketRequest,\n HTTPFactory,\n\n TimelineTransport: fetchTimeline,\n\n getAuthorizers(): AuthTransports {\n return { ajax: fetchAuth };\n },\n\n getWebSocketAPI() {\n return WebSocket;\n },\n\n getXHRAPI() {\n return XMLHttpRequest;\n },\n\n getNetwork() {\n return Network;\n }\n};\n\nexport default Worker;\n","import Logger from 'core/logger';\nimport TimelineSender from 'core/timeline/timeline_sender';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from 'runtime';\nimport TimelineTransport from 'core/timeline/timeline_transport';\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 query = Collections.buildQueryString(data);\n url += '/' + 2 + '?' + query;\n\n fetch(url)\n .then(response => {\n if (response.status !== 200) {\n throw `received ${response.status} from stats.pusher.com`;\n }\n return response.json();\n })\n .then(({ host }) => {\n if (host) {\n sender.host = host;\n }\n })\n .catch(err => {\n Logger.debug('TimelineSender Error: ', err);\n });\n };\n};\n\nvar fetchTimeline = {\n name: 'xhr',\n getAgent\n};\n\nexport default fetchTimeline;\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 { AuthOptions, AuthorizerGenerator } from './auth/options';\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 authEndpoint: string;\n authTransport: AuthTransport;\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\n // these are all optional parameters or overrrides. The customer can set these\n // but it's not strictly necessary\n forceTLS?: boolean;\n auth?: AuthOptions;\n authorizer?: AuthorizerGenerator;\n cluster?: string;\n disabledTransports?: Transport[];\n enabledTransports?: Transport[];\n ignoreNullOrigin?: boolean;\n nacl?: nacl;\n timelineParams?: any;\n}\n\nexport function getConfig(opts: Options): Config {\n let config: Config = {\n activityTimeout: opts.activityTimeout || Defaults.activityTimeout,\n authEndpoint: opts.authEndpoint || Defaults.authEndpoint,\n authTransport: opts.authTransport || Defaults.authTransport,\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\n if ('auth' in opts) config.auth = opts.auth;\n if ('authorizer' in opts) config.authorizer = opts.authorizer;\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","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';\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\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);\n\n this.channels = Factory.createChannels();\n this.global_emitter = new EventsDispatcher();\n this.sessionID = Math.floor(Math.random() * 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 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\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"],"sourceRoot":""}