@cendarsoss/pusher-js 8.4.11 → 8.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"pusher.mjs","sources":["../../src/runtimes/web/dom/script_receiver_factory.ts","../../src/core/defaults.ts","../../src/runtimes/web/dom/dependency_loader.ts","../../src/runtimes/web/dom/dependencies.ts","../../src/core/utils/url_store.ts","../../src/core/auth/options.ts","../../src/core/errors.ts","../../src/runtimes/isomorphic/auth/xhr_auth.ts","../../src/core/base64.ts","../../src/core/utils/timers/abstract_timer.ts","../../src/core/utils/timers/index.ts","../../src/core/util.ts","../../src/core/utils/collections.ts","../../src/core/logger.ts","../../src/runtimes/web/auth/jsonp_auth.ts","../../src/runtimes/web/dom/script_request.ts","../../src/runtimes/web/dom/jsonp_request.ts","../../src/runtimes/web/timeline/jsonp_timeline.ts","../../src/core/transports/url_schemes.ts","../../src/core/events/callback_registry.ts","../../src/core/events/dispatcher.ts","../../src/core/transports/transport_connection.ts","../../src/core/transports/transport.ts","../../src/runtimes/isomorphic/transports/transports.ts","../../src/runtimes/web/transports/transports.ts","../../src/runtimes/web/net_info.ts","../../src/core/transports/assistant_to_the_transport_manager.ts","../../src/core/connection/protocol/protocol.ts","../../src/core/connection/connection.ts","../../src/core/connection/handshake/index.ts","../../src/core/timeline/timeline_sender.ts","../../src/core/channels/channel.ts","../../src/core/channels/private_channel.ts","../../src/core/channels/members.ts","../../src/core/channels/presence_channel.ts","../../node_modules/@stablelib/utf8/lib/utf8.js","../../node_modules/@stablelib/base64/lib/base64.js","../../src/core/channels/encrypted_channel.ts","../../src/core/connection/connection_manager.ts","../../src/core/channels/channels.ts","../../src/core/utils/factory.ts","../../src/core/transports/transport_manager.ts","../../src/core/strategies/sequential_strategy.ts","../../src/core/strategies/best_connected_ever_strategy.ts","../../src/core/strategies/websocket_prioritized_cached_strategy.ts","../../src/core/strategies/delayed_strategy.ts","../../src/core/strategies/if_strategy.ts","../../src/core/strategies/first_connected_strategy.ts","../../src/runtimes/web/default_strategy.ts","../../src/runtimes/web/transports/transport_connection_initializer.ts","../../src/runtimes/web/http/http_xdomain_request.ts","../../src/core/http/http_request.ts","../../src/core/http/state.ts","../../src/core/http/http_socket.ts","../../src/core/http/http_streaming_socket.ts","../../src/core/http/http_polling_socket.ts","../../src/runtimes/isomorphic/http/http_xhr_request.ts","../../src/runtimes/isomorphic/http/http.ts","../../src/runtimes/web/http/http.ts","../../src/runtimes/web/runtime.ts","../../src/core/timeline/level.ts","../../src/core/timeline/timeline.ts","../../src/core/strategies/transport_strategy.ts","../../src/core/strategies/strategy_builder.ts","../../src/core/options.ts","../../src/core/auth/user_authenticator.ts","../../src/core/auth/channel_authorizer.ts","../../src/core/auth/deprecated_channel_authorizer.ts","../../src/core/config.ts","../../src/core/watchlist.ts","../../src/core/utils/flat_promise.ts","../../src/core/user.ts","../../src/core/delta/channel_state.ts","../../node_modules/fossil-delta/fossil-delta.js","../../node_modules/@ably/vcdiff-decoder/lib/errors.js","../../node_modules/@ably/vcdiff-decoder/lib/typed_array_util.js","../../node_modules/@ably/vcdiff-decoder/lib/deserialize/integer.js","../../node_modules/@ably/vcdiff-decoder/lib/instructions.js","../../node_modules/@ably/vcdiff-decoder/lib/tokenize_instructions.js","../../node_modules/@ably/vcdiff-decoder/lib/deserialize/delta.js","../../node_modules/@ably/vcdiff-decoder/lib/address_caches/near.js","../../node_modules/@ably/vcdiff-decoder/lib/address_caches/same.js","../../node_modules/@ably/vcdiff-decoder/lib/vcdiff.js","../../node_modules/@ably/vcdiff-decoder/lib/vcdiff_decoder.js","../../src/core/delta/decoders.ts","../../src/core/delta/manager.ts","../../src/core/pusher.ts"],"sourcesContent":["import ScriptReceiver from './script_receiver';\n\n/** Builds receivers for JSONP and Script requests.\n *\n * Each receiver is an object with following fields:\n * - number - unique (for the factory instance), numerical id of the receiver\n * - id - a string ID that can be used in DOM attributes\n * - name - name of the function triggering the receiver\n * - callback - callback function\n *\n * Receivers are triggered only once, on the first callback call.\n *\n * Receivers can be called by their name or by accessing factory object\n * by the number key.\n *\n * @param {String} prefix the prefix used in ids\n * @param {String} name the name of the object\n */\nexport class ScriptReceiverFactory {\n lastId: number;\n prefix: string;\n name: string;\n\n constructor(prefix: string, name: string) {\n this.lastId = 0;\n this.prefix = prefix;\n this.name = name;\n }\n\n create(callback: Function): ScriptReceiver {\n this.lastId++;\n\n var number = this.lastId;\n var id = this.prefix + number;\n var name = this.name + '[' + number + ']';\n\n var called = false;\n var callbackWrapper = function () {\n if (!called) {\n callback.apply(null, arguments);\n called = true;\n }\n };\n\n this[number] = callbackWrapper;\n return { number: number, id: id, name: name, callback: callbackWrapper };\n }\n\n remove(receiver: ScriptReceiver) {\n delete this[receiver.number];\n }\n}\n\nexport var ScriptReceivers = new ScriptReceiverFactory(\n '_pusher_script_',\n 'Pusher.ScriptReceivers',\n);\n","import {\n ChannelAuthorizationOptions,\n UserAuthenticationOptions,\n} from './auth/options';\nimport { AuthTransport } from './config';\n\nexport interface DefaultConfig {\n VERSION: string;\n PROTOCOL: number;\n wsPort: number;\n wssPort: number;\n wsPath: string;\n httpHost: string;\n httpPort: number;\n httpsPort: number;\n httpPath: string;\n stats_host: string;\n authEndpoint: string;\n authTransport: AuthTransport;\n activityTimeout: number;\n pongTimeout: number;\n unavailableTimeout: number;\n userAuthentication: UserAuthenticationOptions;\n channelAuthorization: ChannelAuthorizationOptions;\n\n cdn_http?: string;\n cdn_https?: string;\n dependency_suffix?: string;\n}\n\nvar Defaults: DefaultConfig = {\n VERSION: VERSION,\n PROTOCOL: 7,\n\n wsPort: 80,\n wssPort: 443,\n wsPath: '',\n // DEPRECATED: SockJS fallback parameters\n httpHost: 'sockjs.pusher.com',\n httpPort: 80,\n httpsPort: 443,\n httpPath: '/pusher',\n // DEPRECATED: Stats\n stats_host: 'stats.pusher.com',\n // DEPRECATED: Other settings\n authEndpoint: '/pusher/auth',\n authTransport: 'ajax',\n activityTimeout: 120000,\n pongTimeout: 30000,\n unavailableTimeout: 10000,\n userAuthentication: {\n endpoint: '/pusher/user-auth',\n transport: 'ajax',\n },\n channelAuthorization: {\n endpoint: '/pusher/auth',\n transport: 'ajax',\n },\n\n // CDN configuration\n cdn_http: CDN_HTTP,\n cdn_https: CDN_HTTPS,\n dependency_suffix: DEPENDENCY_SUFFIX,\n};\n\nexport default Defaults;\n","import {\n ScriptReceivers,\n ScriptReceiverFactory,\n} from './script_receiver_factory';\nimport Runtime from 'runtime';\nimport ScriptRequest from './script_request';\n\n/** Handles loading dependency files.\n *\n * Dependency loaders don't remember whether a resource has been loaded or\n * not. It is caller's responsibility to make sure the resource is not loaded\n * twice. This is because it's impossible to detect resource loading status\n * without knowing its content.\n *\n * Options:\n * - cdn_http - url to HTTP CND\n * - cdn_https - url to HTTPS CDN\n * - version - version of pusher-js\n * - suffix - suffix appended to all names of dependency files\n *\n * @param {Object} options\n */\nexport default class DependencyLoader {\n options: any;\n receivers: ScriptReceiverFactory;\n loading: any;\n\n constructor(options: any) {\n this.options = options;\n this.receivers = options.receivers || ScriptReceivers;\n this.loading = {};\n }\n\n /** Loads the dependency from CDN.\n *\n * @param {String} name\n * @param {Function} callback\n */\n load(name: string, options: any, callback: Function) {\n var self = this;\n\n if (self.loading[name] && self.loading[name].length > 0) {\n self.loading[name].push(callback);\n } else {\n self.loading[name] = [callback];\n\n var request = Runtime.createScriptRequest(self.getPath(name, options));\n var receiver = self.receivers.create(function (error) {\n self.receivers.remove(receiver);\n\n if (self.loading[name]) {\n var callbacks = self.loading[name];\n delete self.loading[name];\n\n var successCallback = function (wasSuccessful) {\n if (!wasSuccessful) {\n request.cleanup();\n }\n };\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](error, successCallback);\n }\n }\n });\n request.send(receiver);\n }\n }\n\n /** Returns a root URL for pusher-js CDN.\n *\n * @returns {String}\n */\n getRoot(options: any): string {\n var cdn;\n var protocol = Runtime.getDocument().location.protocol;\n if ((options && options.useTLS) || protocol === 'https:') {\n cdn = this.options.cdn_https;\n } else {\n cdn = this.options.cdn_http;\n }\n // make sure there are no double slashes\n return cdn.replace(/\\/*$/, '') + '/' + this.options.version;\n }\n\n /** Returns a full path to a dependency file.\n *\n * @param {String} name\n * @returns {String}\n */\n getPath(name: string, options: any): string {\n return this.getRoot(options) + '/' + name + this.options.suffix + '.js';\n }\n}\n","import { ScriptReceiverFactory } from './script_receiver_factory';\nimport Defaults from 'core/defaults';\nimport DependencyLoader from './dependency_loader';\n\nexport var DependenciesReceivers = new ScriptReceiverFactory(\n '_pusher_dependencies',\n 'Pusher.DependenciesReceivers',\n);\n\nexport var Dependencies = new DependencyLoader({\n cdn_http: Defaults.cdn_http,\n cdn_https: Defaults.cdn_https,\n version: Defaults.VERSION,\n suffix: Defaults.dependency_suffix,\n receivers: DependenciesReceivers,\n});\n","/**\n * A place to store help URLs for error messages etc\n */\n\nconst urlStore = {\n baseUrl: 'https://pusher.com',\n urls: {\n authenticationEndpoint: {\n path: '/docs/channels/server_api/authenticating_users',\n },\n authorizationEndpoint: {\n path: '/docs/channels/server_api/authorizing-users/',\n },\n javascriptQuickStart: {\n path: '/docs/javascript_quick_start',\n },\n triggeringClientEvents: {\n path: '/docs/client_api_guide/client_events#trigger-events',\n },\n encryptedChannelSupport: {\n fullUrl:\n 'https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support',\n },\n },\n};\n\n/** Builds a consistent string with links to pusher documentation\n *\n * @param {string} key - relevant key in the url_store.urls object\n * @return {string} suffix string to append to log message\n */\nconst buildLogSuffix = function (key: string): string {\n const urlPrefix = 'See:';\n const urlObj = urlStore.urls[key];\n if (!urlObj) return '';\n\n let url;\n if (urlObj.fullUrl) {\n url = urlObj.fullUrl;\n } else if (urlObj.path) {\n url = urlStore.baseUrl + urlObj.path;\n }\n\n if (!url) return '';\n return `${urlPrefix} ${url}`;\n};\n\nexport default { buildLogSuffix };\n","export enum AuthRequestType {\n UserAuthentication = 'user-authentication',\n ChannelAuthorization = 'channel-authorization',\n}\n\nexport interface ChannelAuthorizationData {\n auth: string;\n channel_data?: string;\n shared_secret?: string;\n}\n\nexport type ChannelAuthorizationCallback = (\n error: Error | null,\n authData: ChannelAuthorizationData | null,\n) => void;\n\nexport interface ChannelAuthorizationRequestParams {\n socketId: string;\n channelName: string;\n}\n\nexport interface ChannelAuthorizationHandler {\n (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback,\n ): void;\n}\n\nexport interface UserAuthenticationData {\n auth: string;\n user_data: string;\n}\n\nexport type UserAuthenticationCallback = (\n error: Error | null,\n authData: UserAuthenticationData | null,\n) => void;\n\nexport interface UserAuthenticationRequestParams {\n socketId: string;\n}\n\nexport interface UserAuthenticationHandler {\n (\n params: UserAuthenticationRequestParams,\n callback: UserAuthenticationCallback,\n ): void;\n}\n\nexport type AuthTransportCallback =\n | ChannelAuthorizationCallback\n | UserAuthenticationCallback;\n\nexport interface AuthOptionsT<AuthHandler> {\n transport: 'ajax' | 'jsonp';\n endpoint: string;\n params?: any;\n headers?: any;\n paramsProvider?: () => any;\n headersProvider?: () => any;\n customHandler?: AuthHandler;\n}\n\nexport declare type UserAuthenticationOptions =\n AuthOptionsT<UserAuthenticationHandler>;\nexport declare type ChannelAuthorizationOptions =\n AuthOptionsT<ChannelAuthorizationHandler>;\n\nexport interface InternalAuthOptions {\n transport: 'ajax' | 'jsonp';\n endpoint: string;\n params?: any;\n headers?: any;\n paramsProvider?: () => any;\n headersProvider?: () => any;\n}\n","/** Error classes used throughout the library. */\n// https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\nexport class BadEventName extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class BadChannelName extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RequestTimedOut extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class TransportPriorityTooLow extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class TransportClosed extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedFeature extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedTransport extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedStrategy extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class HTTPAuthError extends Error {\n status: number;\n constructor(status: number, msg?: string) {\n super(msg);\n this.status = status;\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import TimelineSender from 'core/timeline/timeline_sender';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from 'runtime';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport AbstractRuntime from 'runtimes/interface';\nimport UrlStore from 'core/utils/url_store';\nimport {\n AuthRequestType,\n AuthTransportCallback,\n InternalAuthOptions,\n} from 'core/auth/options';\nimport { HTTPAuthError } from 'core/errors';\n\nconst ajax: AuthTransport = function (\n context: AbstractRuntime,\n query: string,\n authOptions: InternalAuthOptions,\n authRequestType: AuthRequestType,\n callback: AuthTransportCallback,\n) {\n const xhr = Runtime.createXHR();\n xhr.open('POST', authOptions.endpoint, true);\n\n // add request headers\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n for (var headerName in authOptions.headers) {\n xhr.setRequestHeader(headerName, authOptions.headers[headerName]);\n }\n if (authOptions.headersProvider != null) {\n let dynamicHeaders = authOptions.headersProvider();\n for (var headerName in dynamicHeaders) {\n xhr.setRequestHeader(headerName, dynamicHeaders[headerName]);\n }\n }\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n let data;\n let parsed = false;\n\n try {\n data = JSON.parse(xhr.responseText);\n parsed = true;\n } catch (e) {\n callback(\n new HTTPAuthError(\n 200,\n `JSON returned from ${authRequestType.toString()} endpoint was invalid, yet status code was 200. Data was: ${\n xhr.responseText\n }`,\n ),\n null,\n );\n }\n\n if (parsed) {\n // prevents double execution.\n callback(null, data);\n }\n } else {\n let suffix = '';\n switch (authRequestType) {\n case AuthRequestType.UserAuthentication:\n suffix = UrlStore.buildLogSuffix('authenticationEndpoint');\n break;\n case AuthRequestType.ChannelAuthorization:\n suffix = `Clients must be authorized to join private or presence channels. ${UrlStore.buildLogSuffix(\n 'authorizationEndpoint',\n )}`;\n break;\n }\n callback(\n new HTTPAuthError(\n xhr.status,\n `Unable to retrieve auth string from ${authRequestType.toString()} endpoint - ` +\n `received status: ${xhr.status} from ${authOptions.endpoint}. ${suffix}`,\n ),\n null,\n );\n }\n }\n };\n\n xhr.send(query);\n return xhr;\n};\n\nexport default ajax;\n","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<T>(target: any, ...sources: any[]): T {\n for (var i = 0; i < sources.length; i++) {\n var extensions = sources[i];\n for (var property in extensions) {\n if (\n extensions[property] &&\n extensions[property].constructor &&\n extensions[property].constructor === Object\n ) {\n target[property] = extend(target[property] || {}, extensions[property]);\n } else {\n target[property] = extensions[property];\n }\n }\n }\n return target;\n}\n\nexport function stringify(): string {\n var m = ['Pusher'];\n for (var i = 0; i < arguments.length; i++) {\n if (typeof arguments[i] === 'string') {\n m.push(arguments[i]);\n } else {\n m.push(safeJSONStringify(arguments[i]));\n }\n }\n return m.join(' : ');\n}\n\nexport function arrayIndexOf(array: any[], item: any): number {\n // MSIE doesn't have array.indexOf\n var nativeIndexOf = Array.prototype.indexOf;\n if (array === null) {\n return -1;\n }\n if (nativeIndexOf && array.indexOf === nativeIndexOf) {\n return array.indexOf(item);\n }\n for (var i = 0, l = array.length; i < l; i++) {\n if (array[i] === item) {\n return i;\n }\n }\n return -1;\n}\n\n/** Applies a function f to all properties of an object.\n *\n * Function f gets 3 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function objectApply(object: any, f: Function) {\n for (var key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n f(object[key], key, object);\n }\n }\n}\n\n/** Return a list of objects own proerty keys\n *\n * @param {Object} object\n * @returns {Array}\n */\nexport function keys(object: any): string[] {\n var keys = [];\n objectApply(object, function (_, key) {\n keys.push(key);\n });\n return keys;\n}\n\n/** Return a list of object's own property values\n *\n * @param {Object} object\n * @returns {Array}\n */\nexport function values(object: any): any[] {\n var values = [];\n objectApply(object, function (value) {\n values.push(value);\n });\n return values;\n}\n\n/** Applies a function f to all elements of an array.\n *\n * Function f gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function apply(array: any[], f: Function, context?: any) {\n for (var i = 0; i < array.length; i++) {\n f.call(context || global, array[i], i, array);\n }\n}\n\n/** Maps all elements of the array and returns the result.\n *\n * Function f gets 4 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n * - reference to the destination array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function map(array: any[], f: Function): any[] {\n var result = [];\n for (var i = 0; i < array.length; i++) {\n result.push(f(array[i], i, array, result));\n }\n return result;\n}\n\n/** Maps all elements of the object and returns the result.\n *\n * Function f gets 4 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the source object\n * - reference to the destination object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function mapObject(object: any, f: Function): any {\n var result = {};\n objectApply(object, function (value, key) {\n result[key] = f(value);\n });\n return result;\n}\n\n/** Filters elements of the array using a test function.\n *\n * Function test gets 4 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n * - reference to the destination array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function filter(array: any[], test: Function): any[] {\n test =\n test ||\n function (value) {\n return !!value;\n };\n\n var result = [];\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array, result)) {\n result.push(array[i]);\n }\n }\n return result;\n}\n\n/** Filters properties of the object using a test function.\n *\n * Function test gets 4 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the source object\n * - reference to the destination object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function filterObject(object: Object, test: Function) {\n var result = {};\n objectApply(object, function (value, key) {\n if ((test && test(value, key, object, result)) || Boolean(value)) {\n result[key] = value;\n }\n });\n return result;\n}\n\n/** Flattens an object into a two-dimensional array.\n *\n * @param {Object} object\n * @return {Array} resulting array of [key, value] pairs\n */\nexport function flatten(object: Object): any[] {\n var result = [];\n objectApply(object, function (value, key) {\n result.push([key, value]);\n });\n return result;\n}\n\n/** Checks whether any element of the array passes the test.\n *\n * Function test gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function any(array: any[], test: Function): boolean {\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array)) {\n return true;\n }\n }\n return false;\n}\n\n/** Checks whether all elements of the array pass the test.\n *\n * Function test gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function all(array: any[], test: Function): boolean {\n for (var i = 0; i < array.length; i++) {\n if (!test(array[i], i, array)) {\n return false;\n }\n }\n return true;\n}\n\nexport function encodeParamsObject(data): string {\n return mapObject(data, function (value) {\n if (typeof value === 'object') {\n value = safeJSONStringify(value);\n }\n return encodeURIComponent(base64encode(value.toString()));\n });\n}\n\nexport function buildQueryString(data: any): string {\n var params = filterObject(data, function (value) {\n return value !== undefined;\n });\n\n var query = map(\n flatten(encodeParamsObject(params)),\n Util.method('join', '='),\n ).join('&');\n\n return query;\n}\n\n/**\n * See https://github.com/douglascrockford/JSON-js/blob/master/cycle.js\n *\n * Remove circular references from an object. Required for JSON.stringify in\n * React Native, which tends to blow up a lot.\n *\n * @param {any} object\n * @return {any} Decycled object\n */\nexport function decycleObject(object: any): any {\n var objects = [],\n paths = [];\n\n return (function derez(value, path) {\n var i, name, nu;\n\n switch (typeof value) {\n case 'object':\n if (!value) {\n return null;\n }\n for (i = 0; i < objects.length; i += 1) {\n if (objects[i] === value) {\n return { $ref: paths[i] };\n }\n }\n\n objects.push(value);\n paths.push(path);\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n nu = [];\n for (i = 0; i < value.length; i += 1) {\n nu[i] = derez(value[i], path + '[' + i + ']');\n }\n } else {\n nu = {};\n for (name in value) {\n if (Object.prototype.hasOwnProperty.call(value, name)) {\n nu[name] = derez(\n value[name],\n path + '[' + JSON.stringify(name) + ']',\n );\n }\n }\n }\n return nu;\n case 'number':\n case 'string':\n case 'boolean':\n return value;\n }\n })(object, '$');\n}\n\n/**\n * Provides a cross-browser and cross-platform way to safely stringify objects\n * into JSON. This is particularly necessary for ReactNative, where circular JSON\n * structures throw an exception.\n *\n * @param {any} source The object to stringify\n * @return {string} The serialized output.\n */\nexport function safeJSONStringify(source: any): string {\n try {\n return JSON.stringify(source);\n } catch (e) {\n return JSON.stringify(decycleObject(source));\n }\n}\n","import { stringify } from './utils/collections';\n\n// Logger configuration - can be set by Pusher class\nexport interface LoggerConfig {\n log?: (message: string) => void;\n logToConsole?: boolean;\n}\n\nlet config: LoggerConfig = {\n logToConsole: false,\n};\n\nexport function setLoggerConfig(newConfig: LoggerConfig) {\n config = { ...config, ...newConfig };\n}\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 (config.log) {\n config.log(message);\n } else if (config.logToConsole) {\n const log = defaultLoggingFunction.bind(this);\n log(message);\n }\n }\n}\n\nexport default new Logger();\n","import Browser from '../browser';\nimport Logger from 'core/logger';\nimport JSONPRequest from '../dom/jsonp_request';\nimport { ScriptReceivers } from '../dom/script_receiver_factory';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport {\n AuthRequestType,\n AuthTransportCallback,\n InternalAuthOptions,\n} from 'core/auth/options';\n\nvar jsonp: AuthTransport = function (\n context: Browser,\n query: string,\n authOptions: InternalAuthOptions,\n authRequestType: AuthRequestType,\n callback: AuthTransportCallback,\n) {\n if (\n authOptions.headers !== undefined ||\n authOptions.headersProvider != null\n ) {\n Logger.warn(\n `To send headers with the ${authRequestType.toString()} request, you must use AJAX, rather than JSONP.`,\n );\n }\n\n var callbackName = context.nextAuthCallbackID.toString();\n context.nextAuthCallbackID++;\n\n var document = context.getDocument();\n var script = document.createElement('script');\n // Hacked wrapper.\n context.auth_callbacks[callbackName] = function (data) {\n callback(null, data);\n };\n\n var callback_name = \"Pusher.auth_callbacks['\" + callbackName + \"']\";\n script.src =\n authOptions.endpoint +\n '?callback=' +\n encodeURIComponent(callback_name) +\n '&' +\n query;\n\n var head =\n document.getElementsByTagName('head')[0] || document.documentElement;\n head.insertBefore(script, head.firstChild);\n};\n\nexport default jsonp;\n","import ScriptReceiver from './script_receiver';\n\n/** Sends a generic HTTP GET request using a script tag.\n *\n * By constructing URL in a specific way, it can be used for loading\n * JavaScript resources or JSONP requests. It can notify about errors, but\n * only in certain environments. Please take care of monitoring the state of\n * the request yourself.\n *\n * @param {String} src\n */\nexport default class ScriptRequest {\n src: string;\n script: any;\n errorScript: any;\n\n constructor(src: string) {\n this.src = src;\n }\n\n send(receiver: ScriptReceiver) {\n var self = this;\n var errorString = 'Error loading ' + self.src;\n\n self.script = document.createElement('script');\n self.script.id = receiver.id;\n self.script.src = self.src;\n self.script.type = 'text/javascript';\n self.script.charset = 'UTF-8';\n\n if (self.script.addEventListener) {\n self.script.onerror = function () {\n receiver.callback(errorString);\n };\n self.script.onload = function () {\n receiver.callback(null);\n };\n } else {\n self.script.onreadystatechange = function () {\n if (\n self.script.readyState === 'loaded' ||\n self.script.readyState === 'complete'\n ) {\n receiver.callback(null);\n }\n };\n }\n\n // Opera<11.6 hack for missing onerror callback\n if (\n self.script.async === undefined &&\n (<any>document).attachEvent &&\n /opera/i.test(navigator.userAgent)\n ) {\n self.errorScript = document.createElement('script');\n self.errorScript.id = receiver.id + '_error';\n self.errorScript.text = receiver.name + \"('\" + errorString + \"');\";\n self.script.async = self.errorScript.async = false;\n } else {\n self.script.async = true;\n }\n\n var head = document.getElementsByTagName('head')[0];\n head.insertBefore(self.script, head.firstChild);\n if (self.errorScript) {\n head.insertBefore(self.errorScript, self.script.nextSibling);\n }\n }\n\n /** Cleans up the DOM remains of the script request. */\n cleanup() {\n if (this.script) {\n this.script.onload = this.script.onerror = null;\n this.script.onreadystatechange = null;\n }\n if (this.script && this.script.parentNode) {\n this.script.parentNode.removeChild(this.script);\n }\n if (this.errorScript && this.errorScript.parentNode) {\n this.errorScript.parentNode.removeChild(this.errorScript);\n }\n this.script = null;\n this.errorScript = null;\n }\n}\n","import ScriptReceiver from './script_receiver';\nimport ScriptRequest from './script_request';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from '../runtime';\n\n/** Sends data via JSONP.\n *\n * Data is a key-value map. Its values are JSON-encoded and then passed\n * through base64. Finally, keys and encoded values are appended to the query\n * string.\n *\n * The class itself does not guarantee raising errors on failures, as it's not\n * possible to support such feature on all browsers. Instead, JSONP endpoint\n * should call back in a way that's easy to distinguish from browser calls,\n * for example by passing a second argument to the receiver.\n *\n * @param {String} url\n * @param {Object} data key-value map of data to be submitted\n */\nexport default class JSONPRequest {\n url: string;\n data: any;\n request: ScriptRequest;\n\n constructor(url: string, data: any) {\n this.url = url;\n this.data = data;\n }\n\n /** Sends the actual JSONP request.\n *\n * @param {ScriptReceiver} receiver\n */\n send(receiver: ScriptReceiver) {\n if (this.request) {\n return;\n }\n\n var query = Collections.buildQueryString(this.data);\n var url = this.url + '/' + receiver.number + '?' + query;\n this.request = Runtime.createScriptRequest(url);\n this.request.send(receiver);\n }\n\n /** Cleans up the DOM remains of the JSONP request. */\n cleanup() {\n if (this.request) {\n this.request.cleanup();\n }\n }\n}\n","import TimelineSender from 'core/timeline/timeline_sender';\nimport TimelineTransport from 'core/timeline/timeline_transport';\nimport Browser from 'runtime';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport { ScriptReceivers } from '../dom/script_receiver_factory';\n\nvar getAgent = function (sender: TimelineSender, useTLS: boolean) {\n return function (data: any, callback: Function) {\n var scheme = 'http' + (useTLS ? 's' : '') + '://';\n var url =\n scheme + (sender.host || sender.options.host) + sender.options.path;\n var request = Browser.createJSONPRequest(url, data);\n\n var receiver = Browser.ScriptReceivers.create(function (error, result) {\n ScriptReceivers.remove(receiver);\n request.cleanup();\n\n if (result && result.host) {\n sender.host = result.host;\n }\n if (callback) {\n callback(error, result);\n }\n });\n request.send(receiver);\n };\n};\n\nvar jsonp = {\n name: 'jsonp',\n getAgent,\n};\n\nexport default jsonp;\n","import Defaults from '../defaults';\nimport { default as URLScheme, URLSchemeParams } from './url_scheme';\n\nfunction getGenericURL(\n baseScheme: string,\n params: URLSchemeParams,\n path: string,\n): string {\n var scheme = baseScheme + (params.useTLS ? 's' : '');\n var host = params.useTLS ? params.hostTLS : params.hostNonTLS;\n return scheme + '://' + host + path;\n}\n\nfunction getGenericPath(key: string, queryString?: string): string {\n var path = '/app/' + key;\n var query =\n '?protocol=' +\n Defaults.PROTOCOL +\n '&client=js' +\n '&version=' +\n Defaults.VERSION +\n (queryString ? '&' + queryString : '');\n return path + query;\n}\n\nexport var ws: URLScheme = {\n getInitial: function (key: string, params: URLSchemeParams): string {\n var path = (params.httpPath || '') + getGenericPath(key, 'flash=false');\n return getGenericURL('ws', params, path);\n },\n};\n\nexport var http: URLScheme = {\n getInitial: function (key: string, params: URLSchemeParams): string {\n var path = (params.httpPath || '/pusher') + getGenericPath(key);\n return getGenericURL('http', params, path);\n },\n};\n\nexport var sockjs: URLScheme = {\n getInitial: function (key: string, params: URLSchemeParams): string {\n return getGenericURL('http', params, params.httpPath || '/pusher');\n },\n getPath: function (key: string, params: URLSchemeParams): string {\n return getGenericPath(key);\n },\n};\n","import Callback from './callback';\nimport * as Collections from '../utils/collections';\nimport CallbackTable from './callback_table';\n\nexport default class CallbackRegistry {\n _callbacks: CallbackTable;\n\n constructor() {\n this._callbacks = {};\n }\n\n get(name: string): Callback[] {\n return this._callbacks[prefix(name)];\n }\n\n add(name: string, callback: Function, context: any) {\n var prefixedEventName = prefix(name);\n this._callbacks[prefixedEventName] =\n this._callbacks[prefixedEventName] || [];\n this._callbacks[prefixedEventName].push({\n fn: callback,\n context: context,\n });\n }\n\n remove(name?: string, callback?: Function, context?: any) {\n if (!name && !callback && !context) {\n this._callbacks = {};\n return;\n }\n\n var names = name ? [prefix(name)] : Collections.keys(this._callbacks);\n\n if (callback || context) {\n this.removeCallback(names, callback, context);\n } else {\n this.removeAllCallbacks(names);\n }\n }\n\n private removeCallback(names: string[], callback: Function, context: any) {\n Collections.apply(\n names,\n function (name) {\n this._callbacks[name] = Collections.filter(\n this._callbacks[name] || [],\n function (binding) {\n return (\n (callback && callback !== binding.fn) ||\n (context && context !== binding.context)\n );\n },\n );\n if (this._callbacks[name].length === 0) {\n delete this._callbacks[name];\n }\n },\n this,\n );\n }\n\n private removeAllCallbacks(names: string[]) {\n Collections.apply(\n names,\n function (name) {\n delete this._callbacks[name];\n },\n this,\n );\n }\n}\n\nfunction prefix(name: string): string {\n return '_' + name;\n}\n","import * as Collections from '../utils/collections';\nimport Callback from './callback';\nimport Metadata from '../channels/metadata';\nimport CallbackRegistry from './callback_registry';\n\n/** Manages callback bindings and event emitting.\n *\n * @param Function failThrough called when no listeners are bound to an event\n */\nexport default class Dispatcher {\n callbacks: CallbackRegistry;\n global_callbacks: Function[];\n failThrough: Function;\n\n constructor(failThrough?: Function) {\n this.callbacks = new CallbackRegistry();\n this.global_callbacks = [];\n this.failThrough = failThrough;\n }\n\n bind(eventName: string, callback: Function, context?: any) {\n this.callbacks.add(eventName, callback, context);\n return this;\n }\n\n bind_global(callback: Function) {\n this.global_callbacks.push(callback);\n return this;\n }\n\n unbind(eventName?: string, callback?: Function, context?: any) {\n this.callbacks.remove(eventName, callback, context);\n return this;\n }\n\n unbind_global(callback?: Function) {\n if (!callback) {\n this.global_callbacks = [];\n return this;\n }\n\n this.global_callbacks = Collections.filter(\n this.global_callbacks || [],\n (c) => c !== callback,\n );\n\n return this;\n }\n\n unbind_all() {\n this.unbind();\n this.unbind_global();\n return this;\n }\n\n emit(eventName: string, data?: any, metadata?: Metadata): Dispatcher {\n for (var i = 0; i < this.global_callbacks.length; i++) {\n this.global_callbacks[i](eventName, data);\n }\n\n var callbacks = this.callbacks.get(eventName);\n var args = [];\n\n if (metadata) {\n // if there's a metadata argument, we need to call the callback with both\n // data and metadata regardless of whether data is undefined\n args.push(data, metadata);\n } else if (data) {\n // metadata is undefined, so we only need to call the callback with data\n // if data exists\n args.push(data);\n }\n\n if (callbacks && callbacks.length > 0) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].fn.apply(callbacks[i].context || global, args);\n }\n } else if (this.failThrough) {\n this.failThrough(eventName, data);\n }\n\n return this;\n }\n}\n","import Util from '../util';\nimport * as Collections from '../utils/collections';\nimport { default as EventsDispatcher } from '../events/dispatcher';\nimport Logger from '../logger';\nimport TransportHooks from './transport_hooks';\nimport Socket from '../socket';\nimport Runtime from 'runtime';\nimport Timeline from '../timeline/timeline';\nimport TransportConnectionOptions from './transport_connection_options';\n\n/** Provides universal API for transport connections.\n *\n * Transport connection is a low-level object that wraps a connection method\n * and exposes a simple evented interface for the connection state and\n * messaging. It does not implement Pusher-specific WebSocket protocol.\n *\n * Additionally, it fetches resources needed for transport to work and exposes\n * an interface for querying transport features.\n *\n * States:\n * - new - initial state after constructing the object\n * - initializing - during initialization phase, usually fetching resources\n * - intialized - ready to establish a connection\n * - connection - when connection is being established\n * - open - when connection ready to be used\n * - closed - after connection was closed be either side\n *\n * Emits:\n * - error - after the connection raised an error\n *\n * Options:\n * - useTLS - whether connection should be over TLS\n * - hostTLS - host to connect to when connection is over TLS\n * - hostNonTLS - host to connect to when connection is over TLS\n *\n * @param {String} key application key\n * @param {Object} options\n */\nexport default class TransportConnection extends EventsDispatcher {\n hooks: TransportHooks;\n name: string;\n priority: number;\n key: string;\n options: TransportConnectionOptions;\n state: string;\n timeline: Timeline;\n activityTimeout: number;\n id: number;\n socket: Socket;\n beforeOpen: Function;\n initialize: Function;\n\n constructor(\n hooks: TransportHooks,\n name: string,\n priority: number,\n key: string,\n options: TransportConnectionOptions,\n ) {\n super();\n this.initialize = Runtime.transportConnectionInitializer;\n this.hooks = hooks;\n this.name = name;\n this.priority = priority;\n this.key = key;\n this.options = options;\n\n this.state = 'new';\n this.timeline = options.timeline;\n this.activityTimeout = options.activityTimeout;\n this.id = this.timeline.generateUniqueID();\n }\n\n /** Checks whether the transport handles activity checks by itself.\n *\n * @return {Boolean}\n */\n handlesActivityChecks(): boolean {\n return Boolean(this.hooks.handlesActivityChecks);\n }\n\n /** Checks whether the transport supports the ping/pong API.\n *\n * @return {Boolean}\n */\n supportsPing(): boolean {\n return Boolean(this.hooks.supportsPing);\n }\n\n /** Tries to establish a connection.\n *\n * @returns {Boolean} false if transport is in invalid state\n */\n connect(): boolean {\n if (this.socket || this.state !== 'initialized') {\n return false;\n }\n\n var url = this.hooks.urls.getInitial(this.key, this.options);\n try {\n this.socket = this.hooks.getSocket(url, this.options);\n } catch (e) {\n Util.defer(() => {\n this.onError(e);\n this.changeState('closed');\n });\n return false;\n }\n\n this.bindListeners();\n\n Logger.debug('Connecting', { transport: this.name, url });\n this.changeState('connecting');\n return true;\n }\n\n /** Closes the connection.\n *\n * @return {Boolean} true if there was a connection to close\n */\n close(): boolean {\n if (this.socket) {\n this.socket.close();\n return true;\n } else {\n return false;\n }\n }\n\n /** Sends data over the open connection.\n *\n * @param {String} data\n * @return {Boolean} true only when in the \"open\" state\n */\n send(data: any): boolean {\n if (this.state === 'open') {\n // Workaround for MobileSafari bug (see https://gist.github.com/2052006)\n Util.defer(() => {\n if (this.socket) {\n this.socket.send(data);\n }\n });\n return true;\n } else {\n return false;\n }\n }\n\n /** Sends a ping if the connection is open and transport supports it. */\n ping() {\n if (this.state === 'open' && this.supportsPing()) {\n this.socket.ping();\n }\n }\n\n private onOpen() {\n if (this.hooks.beforeOpen) {\n this.hooks.beforeOpen(\n this.socket,\n this.hooks.urls.getPath(this.key, this.options),\n );\n }\n this.changeState('open');\n this.socket.onopen = undefined;\n }\n\n private onError(error) {\n this.emit('error', { type: 'WebSocketError', error: error });\n this.timeline.error(this.buildTimelineMessage({ error: error.toString() }));\n }\n\n private onClose(closeEvent?: any) {\n if (closeEvent) {\n this.changeState('closed', {\n code: closeEvent.code,\n reason: closeEvent.reason,\n wasClean: closeEvent.wasClean,\n });\n } else {\n this.changeState('closed');\n }\n this.unbindListeners();\n this.socket = undefined;\n }\n\n private onMessage(message) {\n this.emit('message', message);\n }\n\n private onActivity() {\n this.emit('activity');\n }\n\n private bindListeners() {\n this.socket.onopen = () => {\n this.onOpen();\n };\n this.socket.onerror = (error) => {\n this.onError(error);\n };\n this.socket.onclose = (closeEvent) => {\n this.onClose(closeEvent);\n };\n this.socket.onmessage = (message) => {\n this.onMessage(message);\n };\n\n if (this.supportsPing()) {\n this.socket.onactivity = () => {\n this.onActivity();\n };\n }\n }\n\n private unbindListeners() {\n if (this.socket) {\n this.socket.onopen = undefined;\n this.socket.onerror = undefined;\n this.socket.onclose = undefined;\n this.socket.onmessage = undefined;\n if (this.supportsPing()) {\n this.socket.onactivity = undefined;\n }\n }\n }\n\n private changeState(state: string, params?: any) {\n this.state = state;\n this.timeline.info(\n this.buildTimelineMessage({\n state: state,\n params: params,\n }),\n );\n this.emit(state, params);\n }\n\n buildTimelineMessage(message): any {\n return Collections.extend({ cid: this.id }, message);\n }\n}\n","import Factory from '../utils/factory';\nimport TransportHooks from './transport_hooks';\nimport TransportConnection from './transport_connection';\nimport TransportConnectionOptions from './transport_connection_options';\n\n/** Provides interface for transport connection instantiation.\n *\n * Takes transport-specific hooks as the only argument, which allow checking\n * for transport support and creating its connections.\n *\n * Supported hooks: * - file - the name of the file to be fetched during initialization\n * - urls - URL scheme to be used by transport\n * - handlesActivityCheck - true when the transport handles activity checks\n * - supportsPing - true when the transport has a ping/activity API\n * - isSupported - tells whether the transport is supported in the environment\n * - getSocket - creates a WebSocket-compatible transport socket\n *\n * See transports.js for specific implementations.\n *\n * @param {Object} hooks object containing all needed transport hooks\n */\nexport default class Transport {\n hooks: TransportHooks;\n\n constructor(hooks: TransportHooks) {\n this.hooks = hooks;\n }\n\n /** Returns whether the transport is supported in the environment.\n *\n * @param {Object} envronment te environment details (encryption, settings)\n * @returns {Boolean} true when the transport is supported\n */\n isSupported(environment: any): boolean {\n return this.hooks.isSupported(environment);\n }\n\n /** Creates a transport connection.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {String} key the application key\n * @param {Object} options\n * @returns {TransportConnection}\n */\n createConnection(\n name: string,\n priority: number,\n key: string,\n options: any,\n ): TransportConnection {\n return new TransportConnection(this.hooks, name, priority, key, options);\n }\n}\n","import * as URLSchemes from 'core/transports/url_schemes';\nimport URLScheme from 'core/transports/url_scheme';\nimport Transport from 'core/transports/transport';\nimport Util from 'core/util';\nimport * as Collections from 'core/utils/collections';\nimport TransportHooks from 'core/transports/transport_hooks';\nimport TransportsTable from 'core/transports/transports_table';\nimport Runtime from 'runtime';\n\n/** WebSocket transport.\n *\n * Uses native WebSocket implementation, including MozWebSocket supported by\n * earlier Firefox versions.\n */\nvar WSTransport = new Transport(<TransportHooks>{\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 <TransportHooks>(\n Collections.extend({}, streamingConfiguration, xhrConfiguration)\n ),\n);\n\n/** HTTP long-polling transport using CORS-enabled XMLHttpRequest. */\nvar XHRPollingTransport = new Transport(\n <TransportHooks>(\n Collections.extend({}, pollingConfiguration, xhrConfiguration)\n ),\n);\n\nvar Transports: TransportsTable = {\n ws: WSTransport,\n xhr_streaming: XHRStreamingTransport,\n xhr_polling: XHRPollingTransport,\n};\n\nexport default Transports;\n","import {\n default as Transports,\n streamingConfiguration,\n pollingConfiguration,\n} from 'isomorphic/transports/transports';\nimport Transport from 'core/transports/transport';\nimport TransportHooks from 'core/transports/transport_hooks';\nimport * as URLSchemes from 'core/transports/url_schemes';\nimport Runtime from 'runtime';\nimport { Dependencies } from '../dom/dependencies';\nimport * as Collections from 'core/utils/collections';\n\nvar SockJSTransport = new Transport(<TransportHooks>{\n file: 'sockjs',\n urls: URLSchemes.sockjs,\n handlesActivityChecks: true,\n supportsPing: false,\n\n isSupported: function () {\n return true;\n },\n isInitialized: function () {\n return window.SockJS !== undefined;\n },\n getSocket: function (url, options) {\n return new window.SockJS(url, null, {\n js_path: Dependencies.getPath('sockjs', {\n useTLS: options.useTLS,\n }),\n ignore_null_origin: options.ignoreNullOrigin,\n });\n },\n beforeOpen: function (socket, path) {\n socket.send(\n JSON.stringify({\n path: path,\n }),\n );\n },\n});\n\nvar xdrConfiguration = {\n isSupported: function (environment): boolean {\n var yes = Runtime.isXDRSupported(environment.useTLS);\n return yes;\n },\n};\n\n/** HTTP streaming transport using XDomainRequest (IE 8,9). */\nvar XDRStreamingTransport = new Transport(\n <TransportHooks>(\n Collections.extend({}, streamingConfiguration, xdrConfiguration)\n ),\n);\n\n/** HTTP long-polling transport using XDomainRequest (IE 8,9). */\nvar XDRPollingTransport = new Transport(\n <TransportHooks>(\n Collections.extend({}, pollingConfiguration, xdrConfiguration)\n ),\n);\n\nTransports.xdr_streaming = XDRStreamingTransport;\nTransports.xdr_polling = XDRPollingTransport;\nTransports.sockjs = SockJSTransport;\n\nexport default Transports;\n","import Reachability from 'core/reachability';\nimport { default as EventsDispatcher } from 'core/events/dispatcher';\n\n/** Really basic interface providing network availability info.\n *\n * Emits:\n * - online - when browser goes online\n * - offline - when browser goes offline\n */\nexport class NetInfo extends EventsDispatcher implements Reachability {\n constructor() {\n super();\n var self = this;\n // This is okay, as IE doesn't support this stuff anyway.\n if (window.addEventListener !== undefined) {\n window.addEventListener(\n 'online',\n function () {\n self.emit('online');\n },\n false,\n );\n window.addEventListener(\n 'offline',\n function () {\n self.emit('offline');\n },\n false,\n );\n }\n }\n\n /** Returns whether browser is online or not\n *\n * Offline means definitely offline (no connection to router).\n * Inverse does NOT mean definitely online (only currently supported in Safari\n * and even there only means the device has a connection to the router).\n *\n * @return {Boolean}\n */\n isOnline(): boolean {\n if (window.navigator.onLine === undefined) {\n return true;\n } else {\n return window.navigator.onLine;\n }\n }\n}\n\nexport var Network = new NetInfo();\n","import Util from '../util';\nimport * as Collections from '../utils/collections';\nimport TransportManager from './transport_manager';\nimport TransportConnection from './transport_connection';\nimport Transport from './transport';\nimport PingDelayOptions from './ping_delay_options';\n\n/** Creates transport connections monitored by a transport manager.\n *\n * When a transport is closed, it might mean the environment does not support\n * it. It's possible that messages get stuck in an intermediate buffer or\n * proxies terminate inactive connections. To combat these problems,\n * assistants monitor the connection lifetime, report unclean exits and\n * adjust ping timeouts to keep the connection active. The decision to disable\n * a transport is the manager's responsibility.\n *\n * @param {TransportManager} manager\n * @param {TransportConnection} transport\n * @param {Object} options\n */\nexport default class AssistantToTheTransportManager {\n manager: TransportManager;\n transport: Transport;\n minPingDelay: number;\n maxPingDelay: number;\n pingDelay: number;\n\n constructor(\n manager: TransportManager,\n transport: Transport,\n options: PingDelayOptions,\n ) {\n this.manager = manager;\n this.transport = transport;\n this.minPingDelay = options.minPingDelay;\n this.maxPingDelay = options.maxPingDelay;\n this.pingDelay = undefined;\n }\n\n /** Creates a transport connection.\n *\n * This function has the same API as Transport#createConnection.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {String} key the application key\n * @param {Object} options\n * @returns {TransportConnection}\n */\n createConnection(\n name: string,\n priority: number,\n key: string,\n options: Object,\n ): TransportConnection {\n options = Collections.extend({}, options, {\n activityTimeout: this.pingDelay,\n });\n var connection = this.transport.createConnection(\n name,\n priority,\n key,\n options,\n );\n\n var openTimestamp = null;\n\n var onOpen = function () {\n connection.unbind('open', onOpen);\n connection.bind('closed', onClosed);\n openTimestamp = Util.now();\n };\n var onClosed = (closeEvent) => {\n connection.unbind('closed', onClosed);\n\n if (closeEvent.code === 1002 || closeEvent.code === 1003) {\n // we don't want to use transports not obeying the protocol\n this.manager.reportDeath();\n } else if (!closeEvent.wasClean && openTimestamp) {\n // report deaths only for short-living transport\n var lifespan = Util.now() - openTimestamp;\n if (lifespan < 2 * this.maxPingDelay) {\n this.manager.reportDeath();\n this.pingDelay = Math.max(lifespan / 2, this.minPingDelay);\n }\n }\n };\n\n connection.bind('open', onOpen);\n return connection;\n }\n\n /** Returns whether the transport is supported in the environment.\n *\n * This function has the same API as Transport#isSupported. Might return false\n * when the manager decides to kill the transport.\n *\n * @param {Object} environment the environment details (encryption, settings)\n * @returns {Boolean} true when the transport is supported\n */\n isSupported(environment: string): boolean {\n return this.manager.isAlive() && this.transport.isSupported(environment);\n }\n}\n","import Action from './action';\nimport { PusherEvent } from './message-types';\n/**\n * Provides functions for handling Pusher protocol-specific messages.\n */\n\nconst Protocol = {\n /**\n * Decodes a message in a Pusher format.\n *\n * The MessageEvent we receive from the transport should contain a pusher event\n * (https://pusher.com/docs/pusher_protocol#events) serialized as JSON in the\n * data field\n *\n * The pusher event may contain a data field too, and it may also be\n * serialised as JSON\n *\n * Throws errors when messages are not parse'able.\n *\n * @param {MessageEvent} messageEvent\n * @return {PusherEvent}\n */\n decodeMessage: function (messageEvent: MessageEvent): PusherEvent {\n try {\n var messageData = JSON.parse(messageEvent.data);\n var pusherEventData = messageData.data;\n if (typeof pusherEventData === 'string') {\n try {\n pusherEventData = JSON.parse(messageData.data);\n } catch (e) {}\n }\n var pusherEvent: PusherEvent = {\n event: messageData.event,\n channel: messageData.channel,\n data: pusherEventData,\n rawMessage: messageEvent.data, // Preserve raw message for delta compression\n };\n if (messageData.user_id) {\n pusherEvent.user_id = messageData.user_id;\n }\n // Copy sequence and conflation_key for delta compression\n // Server sends these as __delta_seq and __conflation_key\n const sequence = messageData.__delta_seq ?? messageData.sequence;\n const conflationKey =\n messageData.__conflation_key ?? messageData.conflation_key;\n if (typeof sequence === 'number') {\n (pusherEvent as any).sequence = sequence;\n }\n if (conflationKey !== undefined) {\n (pusherEvent as any).conflation_key = conflationKey;\n }\n return pusherEvent;\n } catch (e) {\n throw { type: 'MessageParseError', error: e, data: messageEvent.data };\n }\n },\n\n /**\n * Encodes a message to be sent.\n *\n * @param {PusherEvent} event\n * @return {String}\n */\n encodeMessage: function (event: PusherEvent): string {\n return JSON.stringify(event);\n },\n\n /**\n * Processes a handshake message and returns appropriate actions.\n *\n * Returns an object with an 'action' and other action-specific properties.\n *\n * There are three outcomes when calling this function. First is a successful\n * connection attempt, when pusher:connection_established is received, which\n * results in a 'connected' action with an 'id' property. When passed a\n * pusher:error event, it returns a result with action appropriate to the\n * close code and an error. Otherwise, it raises an exception.\n *\n * @param {String} message\n * @result Object\n */\n processHandshake: function (messageEvent: MessageEvent): Action {\n var message = Protocol.decodeMessage(messageEvent);\n\n if (message.event === 'pusher:connection_established') {\n if (!message.data.activity_timeout) {\n throw 'No activity timeout specified in handshake';\n }\n return {\n action: 'connected',\n id: message.data.socket_id,\n activityTimeout: message.data.activity_timeout * 1000,\n };\n } else if (message.event === 'pusher:error') {\n // From protocol 6 close codes are sent only once, so this only\n // happens when connection does not support close codes\n return {\n action: this.getCloseAction(message.data),\n error: this.getCloseError(message.data),\n };\n } else {\n throw 'Invalid handshake';\n }\n },\n\n /**\n * Dispatches the close event and returns an appropriate action name.\n *\n * See:\n * 1. https://developer.mozilla.org/en-US/docs/WebSockets/WebSockets_reference/CloseEvent\n * 2. http://pusher.com/docs/pusher_protocol\n *\n * @param {CloseEvent} closeEvent\n * @return {String} close action name\n */\n getCloseAction: function (closeEvent): string {\n if (closeEvent.code < 4000) {\n // ignore 1000 CLOSE_NORMAL, 1001 CLOSE_GOING_AWAY,\n // 1005 CLOSE_NO_STATUS, 1006 CLOSE_ABNORMAL\n // ignore 1007...3999\n // handle 1002 CLOSE_PROTOCOL_ERROR, 1003 CLOSE_UNSUPPORTED,\n // 1004 CLOSE_TOO_LARGE\n if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {\n return 'backoff';\n } else {\n return null;\n }\n } else if (closeEvent.code === 4000) {\n return 'tls_only';\n } else if (closeEvent.code < 4100) {\n return 'refused';\n } else if (closeEvent.code < 4200) {\n return 'backoff';\n } else if (closeEvent.code < 4300) {\n return 'retry';\n } else {\n // unknown error\n return 'refused';\n }\n },\n\n /**\n * Returns an error or null basing on the close event.\n *\n * Null is returned when connection was closed cleanly. Otherwise, an object\n * with error details is returned.\n *\n * @param {CloseEvent} closeEvent\n * @return {Object} error object\n */\n getCloseError: function (closeEvent): any {\n if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {\n return {\n type: 'PusherError',\n data: {\n code: closeEvent.code,\n message: closeEvent.reason || closeEvent.message,\n },\n };\n } else {\n return null;\n }\n },\n};\n\nexport default Protocol;\n","import * as Collections from '../utils/collections';\nimport { default as EventsDispatcher } from '../events/dispatcher';\nimport Protocol from './protocol/protocol';\nimport { PusherEvent } from './protocol/message-types';\nimport Logger from '../logger';\nimport TransportConnection from '../transports/transport_connection';\nimport Socket from '../socket';\n/**\n * Provides Pusher protocol interface for transports.\n *\n * Emits following events:\n * - message - on received messages\n * - ping - on ping requests\n * - pong - on pong responses\n * - error - when the transport emits an error\n * - closed - after closing the transport\n *\n * It also emits more events when connection closes with a code.\n * See Protocol.getCloseAction to get more details.\n *\n * @param {Number} id\n * @param {AbstractTransport} transport\n */\nexport default class Connection extends EventsDispatcher implements Socket {\n id: string;\n transport: TransportConnection;\n activityTimeout: number;\n\n constructor(id: string, transport: TransportConnection) {\n super();\n this.id = id;\n this.transport = transport;\n this.activityTimeout = transport.activityTimeout;\n this.bindListeners();\n }\n\n /** Returns whether used transport handles activity checks by itself\n *\n * @returns {Boolean} true if activity checks are handled by the transport\n */\n handlesActivityChecks() {\n return this.transport.handlesActivityChecks();\n }\n\n /** Sends raw data.\n *\n * @param {String} data\n */\n send(data: any): boolean {\n return this.transport.send(data);\n }\n\n /** Sends an event.\n *\n * @param {String} name\n * @param {String} data\n * @param {String} [channel]\n * @returns {Boolean} whether message was sent or not\n */\n send_event(name: string, data: any, channel?: string): boolean {\n var event: PusherEvent = { event: name, data: data };\n if (channel) {\n event.channel = channel;\n }\n Logger.debug('Event sent', event);\n return this.send(Protocol.encodeMessage(event));\n }\n\n /** Sends a ping message to the server.\n *\n * Basing on the underlying transport, it might send either transport's\n * protocol-specific ping or pusher:ping event.\n */\n ping() {\n if (this.transport.supportsPing()) {\n this.transport.ping();\n } else {\n this.send_event('pusher:ping', {});\n }\n }\n\n /** Closes the connection. */\n close() {\n this.transport.close();\n }\n\n private bindListeners() {\n var listeners = {\n message: (messageEvent: MessageEvent) => {\n var pusherEvent;\n try {\n pusherEvent = Protocol.decodeMessage(messageEvent);\n } catch (e) {\n this.emit('error', {\n type: 'MessageParseError',\n error: e,\n data: messageEvent.data,\n });\n }\n\n if (pusherEvent !== undefined) {\n Logger.debug('Event recd', pusherEvent);\n\n switch (pusherEvent.event) {\n case 'pusher:error':\n this.emit('error', {\n type: 'PusherError',\n data: pusherEvent.data,\n });\n break;\n case 'pusher:ping':\n this.emit('ping');\n break;\n case 'pusher:pong':\n this.emit('pong');\n break;\n }\n this.emit('message', pusherEvent);\n }\n },\n activity: () => {\n this.emit('activity');\n },\n error: (error) => {\n this.emit('error', error);\n },\n closed: (closeEvent) => {\n unbindListeners();\n\n if (closeEvent && closeEvent.code) {\n this.handleCloseEvent(closeEvent);\n }\n\n this.transport = null;\n this.emit('closed');\n },\n };\n\n var unbindListeners = () => {\n Collections.objectApply(listeners, (listener, event) => {\n this.transport.unbind(event, listener);\n });\n };\n\n Collections.objectApply(listeners, (listener, event) => {\n this.transport.bind(event, listener);\n });\n }\n\n private handleCloseEvent(closeEvent: any) {\n var action = Protocol.getCloseAction(closeEvent);\n var error = Protocol.getCloseError(closeEvent);\n if (error) {\n this.emit('error', error);\n }\n if (action) {\n this.emit(action, { action: action, error: error });\n }\n }\n}\n","import Util from '../../util';\nimport * as Collections from '../../utils/collections';\nimport Protocol from '../protocol/protocol';\nimport Connection from '../connection';\nimport TransportConnection from '../../transports/transport_connection';\nimport HandshakePayload from './handshake_payload';\n\n/**\n * Handles Pusher protocol handshakes for transports.\n *\n * Calls back with a result object after handshake is completed. Results\n * always have two fields:\n * - action - string describing action to be taken after the handshake\n * - transport - the transport object passed to the constructor\n *\n * Different actions can set different additional properties on the result.\n * In the case of 'connected' action, there will be a 'connection' property\n * containing a Connection object for the transport. Other actions should\n * carry an 'error' property.\n *\n * @param {AbstractTransport} transport\n * @param {Function} callback\n */\nexport default class Handshake {\n transport: TransportConnection;\n callback: (HandshakePayload) => void;\n onMessage: Function;\n onClosed: Function;\n\n constructor(\n transport: TransportConnection,\n callback: (HandshakePayload) => void,\n ) {\n this.transport = transport;\n this.callback = callback;\n this.bindListeners();\n }\n\n close() {\n this.unbindListeners();\n this.transport.close();\n }\n\n private bindListeners() {\n this.onMessage = (m) => {\n this.unbindListeners();\n\n var result;\n try {\n result = Protocol.processHandshake(m);\n } catch (e) {\n this.finish('error', { error: e });\n this.transport.close();\n return;\n }\n\n if (result.action === 'connected') {\n this.finish('connected', {\n connection: new Connection(result.id, this.transport),\n activityTimeout: result.activityTimeout,\n });\n } else {\n this.finish(result.action, { error: result.error });\n this.transport.close();\n }\n };\n\n this.onClosed = (closeEvent) => {\n this.unbindListeners();\n\n var action = Protocol.getCloseAction(closeEvent) || 'backoff';\n var error = Protocol.getCloseError(closeEvent);\n this.finish(action, { error: error });\n };\n\n this.transport.bind('message', this.onMessage);\n this.transport.bind('closed', this.onClosed);\n }\n\n private unbindListeners() {\n this.transport.unbind('message', this.onMessage);\n this.transport.unbind('closed', this.onClosed);\n }\n\n private finish(action: string, params: any) {\n this.callback(\n Collections.extend({ transport: this.transport, action: action }, params),\n );\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport base64encode from '../base64';\nimport Timeline from './timeline';\nimport Runtime from 'runtime';\n\nexport interface TimelineSenderOptions {\n host?: string;\n port?: number;\n path?: string;\n}\n\nexport default class TimelineSender {\n timeline: Timeline;\n options: TimelineSenderOptions;\n host: string;\n\n constructor(timeline: Timeline, options: TimelineSenderOptions) {\n this.timeline = timeline;\n this.options = options || {};\n }\n\n send(useTLS: boolean, callback?: Function) {\n if (this.timeline.isEmpty()) {\n return;\n }\n\n this.timeline.send(\n Runtime.TimelineTransport.getAgent(this, useTLS),\n callback,\n );\n }\n}\n","import { default as EventsDispatcher } from '../events/dispatcher';\nimport * as Errors from '../errors';\nimport Logger from '../logger';\nimport Pusher from '../pusher';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport Metadata from './metadata';\nimport UrlStore from '../utils/url_store';\nimport {\n ChannelAuthorizationData,\n ChannelAuthorizationCallback,\n} from '../auth/options';\nimport { HTTPAuthError } from '../errors';\nimport { FilterNode } from './filter';\n\n/** Provides base public channel interface with an event emitter.\n *\n * Emits:\n * - pusher:subscription_succeeded - after subscribing successfully\n * - other non-internal events\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class Channel extends EventsDispatcher {\n name: string;\n pusher: Pusher;\n subscribed: boolean;\n subscriptionPending: boolean;\n subscriptionCancelled: boolean;\n subscriptionCount: null;\n tagsFilter: FilterNode | null;\n\n constructor(name: string, pusher: Pusher) {\n super(function (event, data) {\n Logger.debug('No callbacks on ' + name + ' for ' + event);\n });\n\n this.name = name;\n this.pusher = pusher;\n this.subscribed = false;\n this.subscriptionPending = false;\n this.subscriptionCancelled = false;\n this.tagsFilter = null;\n }\n\n /** Skips authorization, since public channels don't require it.\n *\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n return callback(null, { auth: '' });\n }\n\n /** Triggers an event */\n trigger(event: string, data: any) {\n if (event.indexOf('client-') !== 0) {\n throw new Errors.BadEventName(\n \"Event '\" + event + \"' does not start with 'client-'\",\n );\n }\n if (!this.subscribed) {\n var suffix = UrlStore.buildLogSuffix('triggeringClientEvents');\n Logger.warn(\n `Client event triggered before channel 'subscription_succeeded' event . ${suffix}`,\n );\n }\n return this.pusher.send_event(event, data, this.name);\n }\n\n /** Signals disconnection to the channel. For internal use only. */\n disconnect() {\n this.subscribed = false;\n this.subscriptionPending = false;\n }\n\n /** Handles a PusherEvent. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n if (eventName === 'pusher_internal:subscription_succeeded') {\n this.handleSubscriptionSucceededEvent(event);\n } else if (eventName === 'pusher_internal:subscription_count') {\n this.handleSubscriptionCountEvent(event);\n } else if (eventName.indexOf('pusher_internal:') !== 0) {\n var metadata: Metadata = {};\n this.emit(eventName, data, metadata);\n }\n }\n\n handleSubscriptionSucceededEvent(event: PusherEvent) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n } else {\n this.emit('pusher:subscription_succeeded', event.data);\n }\n }\n\n handleSubscriptionCountEvent(event: PusherEvent) {\n if (event.data.subscription_count) {\n this.subscriptionCount = event.data.subscription_count;\n }\n\n this.emit('pusher:subscription_count', event.data);\n }\n\n /** Sends a subscription request. For internal use only. */\n subscribe() {\n if (this.subscribed) {\n return;\n }\n this.subscriptionPending = true;\n this.subscriptionCancelled = false;\n this.authorize(\n this.pusher.connection.socket_id,\n (error: Error | null, data: ChannelAuthorizationData) => {\n if (error) {\n this.subscriptionPending = false;\n // Why not bind to 'pusher:subscription_error' a level up, and log there?\n // Binding to this event would cause the warning about no callbacks being\n // bound (see constructor) to be suppressed, that's not what we want.\n Logger.error(error.toString());\n this.emit(\n 'pusher:subscription_error',\n Object.assign(\n {},\n {\n type: 'AuthError',\n error: error.message,\n },\n error instanceof HTTPAuthError ? { status: error.status } : {},\n ),\n );\n } else {\n const subscribeData: any = {\n auth: data.auth,\n channel_data: data.channel_data,\n channel: this.name,\n };\n\n // Add tags filter if present\n if (this.tagsFilter) {\n subscribeData.tags_filter = this.tagsFilter;\n }\n\n this.pusher.send_event('pusher:subscribe', subscribeData);\n }\n },\n );\n }\n\n /** Sends an unsubscription request. For internal use only. */\n unsubscribe() {\n this.subscribed = false;\n this.pusher.send_event('pusher:unsubscribe', {\n channel: this.name,\n });\n }\n\n /** Cancels an in progress subscription. For internal use only. */\n cancelSubscription() {\n this.subscriptionCancelled = true;\n }\n\n /** Reinstates an in progress subscripiton. For internal use only. */\n reinstateSubscription() {\n this.subscriptionCancelled = false;\n }\n}\n","import Factory from '../utils/factory';\nimport Channel from './channel';\nimport { ChannelAuthorizationCallback } from '../auth/options';\n\n/** Extends public channels to provide private channel interface.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class PrivateChannel extends Channel {\n /** Authorizes the connection to use the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n return this.pusher.config.channelAuthorizer(\n {\n channelName: this.name,\n socketId: socketId,\n },\n callback,\n );\n }\n}\n","import * as Collections from '../utils/collections';\n\n/** Represents a collection of members of a presence channel. */\nexport default class Members {\n members: any;\n count: number;\n myID: any;\n me: any;\n\n constructor() {\n this.reset();\n }\n\n /** Returns member's info for given id.\n *\n * Resulting object containts two fields - id and info.\n *\n * @param {Number} id\n * @return {Object} member's info or null\n */\n get(id: string): any {\n if (Object.prototype.hasOwnProperty.call(this.members, id)) {\n return {\n id: id,\n info: this.members[id],\n };\n } else {\n return null;\n }\n }\n\n /** Calls back for each member in unspecified order.\n *\n * @param {Function} callback\n */\n each(callback: Function) {\n Collections.objectApply(this.members, (member, id) => {\n callback(this.get(id));\n });\n }\n\n /** Updates the id for connected member. For internal use only. */\n setMyID(id: string) {\n this.myID = id;\n }\n\n /** Handles subscription data. For internal use only. */\n onSubscription(subscriptionData: any) {\n this.members = subscriptionData.presence.hash;\n this.count = subscriptionData.presence.count;\n this.me = this.get(this.myID);\n }\n\n /** Adds a new member to the collection. For internal use only. */\n addMember(memberData: any) {\n if (this.get(memberData.user_id) === null) {\n this.count++;\n }\n this.members[memberData.user_id] = memberData.user_info;\n return this.get(memberData.user_id);\n }\n\n /** Adds a member from the collection. For internal use only. */\n removeMember(memberData: any) {\n var member = this.get(memberData.user_id);\n if (member) {\n delete this.members[memberData.user_id];\n this.count--;\n }\n return member;\n }\n\n /** Resets the collection to the initial state. For internal use only. */\n reset() {\n this.members = {};\n this.count = 0;\n this.myID = null;\n this.me = null;\n }\n}\n","import PrivateChannel from './private_channel';\nimport Logger from '../logger';\nimport Members from './members';\nimport Pusher from '../pusher';\nimport UrlStore from 'core/utils/url_store';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport Metadata from './metadata';\nimport { ChannelAuthorizationData } from '../auth/options';\n\nexport default class PresenceChannel extends PrivateChannel {\n members: Members;\n\n /** Adds presence channel functionality to private channels.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\n constructor(name: string, pusher: Pusher) {\n super(name, pusher);\n this.members = new Members();\n }\n\n /** Authorizes the connection as a member of the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: Function) {\n super.authorize(socketId, async (error, authData) => {\n if (!error) {\n authData = authData as ChannelAuthorizationData;\n if (authData.channel_data != null) {\n var channelData = JSON.parse(authData.channel_data);\n this.members.setMyID(channelData.user_id);\n } else {\n await this.pusher.user.signinDonePromise;\n if (this.pusher.user.user_data != null) {\n // If the user is signed in, get the id of the authenticated user\n // and allow the presence authorization to continue.\n this.members.setMyID(this.pusher.user.user_data.id);\n } else {\n let suffix = UrlStore.buildLogSuffix('authorizationEndpoint');\n Logger.error(\n `Invalid auth response for channel '${this.name}', ` +\n `expected 'channel_data' field. ${suffix}, ` +\n `or the user should be signed in.`,\n );\n callback('Invalid auth response');\n return;\n }\n }\n }\n callback(error, authData);\n });\n }\n\n /** Handles presence and subscription events. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n if (eventName.indexOf('pusher_internal:') === 0) {\n this.handleInternalEvent(event);\n } else {\n var data = event.data;\n var metadata: Metadata = {};\n if (event.user_id) {\n metadata.user_id = event.user_id;\n }\n this.emit(eventName, data, metadata);\n }\n }\n handleInternalEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n switch (eventName) {\n case 'pusher_internal:subscription_succeeded':\n this.handleSubscriptionSucceededEvent(event);\n break;\n case 'pusher_internal:subscription_count':\n this.handleSubscriptionCountEvent(event);\n break;\n case 'pusher_internal:member_added':\n var addedMember = this.members.addMember(data);\n this.emit('pusher:member_added', addedMember);\n break;\n case 'pusher_internal:member_removed':\n var removedMember = this.members.removeMember(data);\n if (removedMember) {\n this.emit('pusher:member_removed', removedMember);\n }\n break;\n }\n }\n\n handleSubscriptionSucceededEvent(event: PusherEvent) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n } else {\n this.members.onSubscription(event.data);\n this.emit('pusher:subscription_succeeded', this.members);\n }\n }\n\n /** Resets the channel state, including members map. For internal use only. */\n disconnect() {\n this.members.reset();\n super.disconnect();\n }\n}\n","\"use strict\";\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package utf8 implements UTF-8 encoding and decoding.\n */\nvar INVALID_UTF16 = \"utf8: invalid string\";\nvar INVALID_UTF8 = \"utf8: invalid source encoding\";\n/**\n * Encodes the given string into UTF-8 byte array.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nfunction encode(s) {\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 var arr = new Uint8Array(encodedLength(s));\n var pos = 0;\n for (var i = 0; i < s.length; i++) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n arr[pos++] = c;\n }\n else if (c < 0x800) {\n arr[pos++] = 0xc0 | c >> 6;\n arr[pos++] = 0x80 | c & 0x3f;\n }\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 }\n else {\n i++; // get one more character\n c = (c & 0x3ff) << 10;\n c |= s.charCodeAt(i) & 0x3ff;\n c += 0x10000;\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}\nexports.encode = encode;\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 */\nfunction encodedLength(s) {\n var result = 0;\n for (var i = 0; i < s.length; i++) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n result += 1;\n }\n else if (c < 0x800) {\n result += 2;\n }\n else if (c < 0xd800) {\n result += 3;\n }\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 }\n else {\n throw new Error(INVALID_UTF16);\n }\n }\n return result;\n}\nexports.encodedLength = encodedLength;\n/**\n * Decodes the given byte array from UTF-8 into a string.\n * Throws if encoding is invalid.\n */\nfunction decode(arr) {\n var chars = [];\n for (var i = 0; i < arr.length; i++) {\n var b = arr[i];\n if (b & 0x80) {\n var min = void 0;\n if (b < 0xe0) {\n // Need 1 more byte.\n if (i >= arr.length) {\n throw new Error(INVALID_UTF8);\n }\n var 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 }\n else if (b < 0xf0) {\n // Need 2 more bytes.\n if (i >= arr.length - 1) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n var 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 }\n else if (b < 0xf8) {\n // Need 3 more bytes.\n if (i >= arr.length - 2) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n var n2 = arr[++i];\n var 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 }\n else {\n throw new Error(INVALID_UTF8);\n }\n if (b < min || (b >= 0xd800 && b <= 0xdfff)) {\n throw new Error(INVALID_UTF8);\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 chars.push(String.fromCharCode(b));\n }\n return chars.join(\"\");\n}\nexports.decode = decode;\n//# sourceMappingURL=utf8.js.map","\"use strict\";\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package base64 implements Base64 encoding and decoding.\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.\nvar INVALID_BYTE = 256;\n/**\n * Implements standard Base64 encoding.\n *\n * Operates in constant time.\n */\nvar Coder = /** @class */ (function () {\n // TODO(dchest): methods to encode chunk-by-chunk.\n function Coder(_paddingCharacter) {\n if (_paddingCharacter === void 0) { _paddingCharacter = \"=\"; }\n this._paddingCharacter = _paddingCharacter;\n }\n Coder.prototype.encodedLength = function (length) {\n if (!this._paddingCharacter) {\n return (length * 8 + 5) / 6 | 0;\n }\n return (length + 2) / 3 * 4 | 0;\n };\n Coder.prototype.encode = function (data) {\n var out = \"\";\n var i = 0;\n for (; i < data.length - 2; i += 3) {\n var 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 var left = data.length - i;\n if (left > 0) {\n var 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 }\n else {\n out += this._paddingCharacter || \"\";\n }\n out += this._paddingCharacter || \"\";\n }\n return out;\n };\n Coder.prototype.maxDecodedLength = function (length) {\n if (!this._paddingCharacter) {\n return (length * 6 + 7) / 8 | 0;\n }\n return length / 4 * 3 | 0;\n };\n Coder.prototype.decodedLength = function (s) {\n return this.maxDecodedLength(s.length - this._getPaddingLength(s));\n };\n Coder.prototype.decode = function (s) {\n if (s.length === 0) {\n return new Uint8Array(0);\n }\n var paddingLength = this._getPaddingLength(s);\n var length = s.length - paddingLength;\n var out = new Uint8Array(this.maxDecodedLength(length));\n var op = 0;\n var i = 0;\n var haveBad = 0;\n var 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 // 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 // Encode 6 bits in b into a new character.\n Coder.prototype._encodeByte = function (b) {\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 var 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 return String.fromCharCode(result);\n };\n // Decode a character code into a byte.\n // Must return 256 if character is out of alphabet range.\n Coder.prototype._decodeChar = function (c) {\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 var result = INVALID_BYTE; // start with invalid character\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 return result;\n };\n Coder.prototype._getPaddingLength = function (s) {\n var paddingLength = 0;\n if (this._paddingCharacter) {\n for (var 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 return Coder;\n}());\nexports.Coder = Coder;\nvar stdCoder = new Coder();\nfunction encode(data) {\n return stdCoder.encode(data);\n}\nexports.encode = encode;\nfunction decode(s) {\n return stdCoder.decode(s);\n}\nexports.decode = decode;\n/**\n * Implements URL-safe Base64 encoding.\n * (Same as Base64, but '+' is replaced with '-', and '/' with '_').\n *\n * Operates in constant time.\n */\nvar URLSafeCoder = /** @class */ (function (_super) {\n __extends(URLSafeCoder, _super);\n function URLSafeCoder() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\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 URLSafeCoder.prototype._encodeByte = function (b) {\n var 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 return String.fromCharCode(result);\n };\n URLSafeCoder.prototype._decodeChar = function (c) {\n var result = INVALID_BYTE;\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 return result;\n };\n return URLSafeCoder;\n}(Coder));\nexports.URLSafeCoder = URLSafeCoder;\nvar urlSafeCoder = new URLSafeCoder();\nfunction encodeURLSafe(data) {\n return urlSafeCoder.encode(data);\n}\nexports.encodeURLSafe = encodeURLSafe;\nfunction decodeURLSafe(s) {\n return urlSafeCoder.decode(s);\n}\nexports.decodeURLSafe = decodeURLSafe;\nexports.encodedLength = function (length) {\n return stdCoder.encodedLength(length);\n};\nexports.maxDecodedLength = function (length) {\n return stdCoder.maxDecodedLength(length);\n};\nexports.decodedLength = function (s) {\n return stdCoder.decodedLength(s);\n};\n//# sourceMappingURL=base64.js.map","import PrivateChannel from './private_channel';\nimport * as Errors from '../errors';\nimport Logger from '../logger';\nimport Pusher from '../pusher';\nimport { decode as encodeUTF8 } from '@stablelib/utf8';\nimport { decode as decodeBase64 } from '@stablelib/base64';\nimport Dispatcher from '../events/dispatcher';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport {\n ChannelAuthorizationData,\n ChannelAuthorizationCallback,\n} from '../auth/options';\nimport * as nacl from 'tweetnacl';\n\n/** Extends private channels to provide encrypted channel interface.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class EncryptedChannel extends PrivateChannel {\n key: Uint8Array = null;\n nacl: nacl;\n\n constructor(name: string, pusher: Pusher, nacl: nacl) {\n super(name, pusher);\n this.nacl = nacl;\n }\n\n /** Authorizes the connection to use the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n super.authorize(\n socketId,\n (error: Error | null, authData: ChannelAuthorizationData) => {\n if (error) {\n callback(error, authData);\n return;\n }\n let sharedSecret = authData['shared_secret'];\n if (!sharedSecret) {\n callback(\n new Error(\n `No shared_secret key in auth payload for encrypted channel: ${this.name}`,\n ),\n null,\n );\n return;\n }\n this.key = decodeBase64(sharedSecret);\n delete authData['shared_secret'];\n callback(null, authData);\n },\n );\n }\n\n trigger(event: string, data: any): boolean {\n throw new Errors.UnsupportedFeature(\n 'Client events are not currently supported for encrypted channels',\n );\n }\n\n /** Handles an event. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n if (\n eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0\n ) {\n super.handleEvent(event);\n return;\n }\n this.handleEncryptedEvent(eventName, data);\n }\n\n private handleEncryptedEvent(event: string, data: any): void {\n if (!this.key) {\n Logger.debug(\n 'Received encrypted event before key has been retrieved from the authEndpoint',\n );\n return;\n }\n if (!data.ciphertext || !data.nonce) {\n Logger.error(\n 'Unexpected format for encrypted event, expected object with `ciphertext` and `nonce` fields, got: ' +\n data,\n );\n return;\n }\n let cipherText = decodeBase64(data.ciphertext);\n if (cipherText.length < this.nacl.secretbox.overheadLength) {\n Logger.error(\n `Expected encrypted event ciphertext length to be ${this.nacl.secretbox.overheadLength}, got: ${cipherText.length}`,\n );\n return;\n }\n let nonce = decodeBase64(data.nonce);\n if (nonce.length < this.nacl.secretbox.nonceLength) {\n Logger.error(\n `Expected encrypted event nonce length to be ${this.nacl.secretbox.nonceLength}, got: ${nonce.length}`,\n );\n return;\n }\n\n let bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n Logger.debug(\n 'Failed to decrypt an event, probably because it was encrypted with a different key. Fetching a new key from the authEndpoint...',\n );\n // Try a single time to retrieve a new auth key and decrypt the event with it\n // If this fails, a new key will be requested when a new message is received\n this.authorize(this.pusher.connection.socket_id, (error, authData) => {\n if (error) {\n Logger.error(\n `Failed to make a request to the authEndpoint: ${authData}. Unable to fetch new key, so dropping encrypted event`,\n );\n return;\n }\n bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n Logger.error(\n `Failed to decrypt event with new key. Dropping encrypted event`,\n );\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n return;\n });\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n }\n\n // Try and parse the decrypted bytes as JSON. If we can't parse it, just\n // return the utf-8 string\n getDataToEmit(bytes: Uint8Array): string {\n let raw = encodeUTF8(bytes);\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n }\n}\n","import { default as EventsDispatcher } from '../events/dispatcher';\nimport { OneOffTimer as Timer } from '../utils/timers';\nimport { Config } from '../config';\nimport Logger from '../logger';\nimport HandshakePayload from './handshake/handshake_payload';\nimport Connection from './connection';\nimport Strategy from '../strategies/strategy';\nimport StrategyRunner from '../strategies/strategy_runner';\nimport * as Collections from '../utils/collections';\nimport Timeline from '../timeline/timeline';\nimport ConnectionManagerOptions from './connection_manager_options';\nimport Runtime from 'runtime';\n\nimport {\n ErrorCallbacks,\n HandshakeCallbacks,\n ConnectionCallbacks,\n} from './callbacks';\nimport Action from './protocol/action';\n\n/** Manages connection to Pusher.\n *\n * Uses a strategy (currently only default), timers and network availability\n * info to establish a connection and export its state. In case of failures,\n * manages reconnection attempts.\n *\n * Exports state changes as following events:\n * - \"state_change\", { previous: p, current: state }\n * - state\n *\n * States:\n * - initialized - initial state, never transitioned to\n * - connecting - connection is being established\n * - connected - connection has been fully established\n * - disconnected - on requested disconnection\n * - unavailable - after connection timeout or when there's no network\n * - failed - when the connection strategy is not supported\n *\n * Options:\n * - unavailableTimeout - time to transition to unavailable state\n * - activityTimeout - time after which ping message should be sent\n * - pongTimeout - time for Pusher to respond with pong before reconnecting\n *\n * @param {String} key application key\n * @param {Object} options\n */\nexport default class ConnectionManager extends EventsDispatcher {\n key: string;\n options: ConnectionManagerOptions;\n state: string;\n connection: Connection;\n usingTLS: boolean;\n timeline: Timeline;\n socket_id: string;\n unavailableTimer: Timer;\n activityTimer: Timer;\n retryTimer: Timer;\n activityTimeout: number;\n strategy: Strategy;\n runner: StrategyRunner;\n errorCallbacks: ErrorCallbacks;\n handshakeCallbacks: HandshakeCallbacks;\n connectionCallbacks: ConnectionCallbacks;\n\n constructor(key: string, options: ConnectionManagerOptions) {\n super();\n this.state = 'initialized';\n this.connection = null;\n\n this.key = key;\n this.options = options;\n this.timeline = this.options.timeline;\n this.usingTLS = this.options.useTLS;\n\n this.errorCallbacks = this.buildErrorCallbacks();\n this.connectionCallbacks = this.buildConnectionCallbacks(\n this.errorCallbacks,\n );\n this.handshakeCallbacks = this.buildHandshakeCallbacks(this.errorCallbacks);\n\n var Network = Runtime.getNetwork();\n\n Network.bind('online', () => {\n this.timeline.info({ netinfo: 'online' });\n if (this.state === 'connecting' || this.state === 'unavailable') {\n this.retryIn(0);\n }\n });\n Network.bind('offline', () => {\n this.timeline.info({ netinfo: 'offline' });\n if (this.connection) {\n this.sendActivityCheck();\n }\n });\n\n this.updateStrategy();\n }\n\n /** Establishes a connection to Pusher.\n *\n * Does nothing when connection is already established. See top-level doc\n * to find events emitted on connection attempts.\n */\n connect() {\n if (this.connection || this.runner) {\n return;\n }\n if (!this.strategy.isSupported()) {\n this.updateState('failed');\n return;\n }\n this.updateState('connecting');\n this.startConnecting();\n this.setUnavailableTimer();\n }\n\n /** Sends raw data.\n *\n * @param {String} data\n */\n send(data) {\n if (this.connection) {\n return this.connection.send(data);\n } else {\n return false;\n }\n }\n\n /** Sends an event.\n *\n * @param {String} name\n * @param {String} data\n * @param {String} [channel]\n * @returns {Boolean} whether message was sent or not\n */\n send_event(name: string, data: any, channel?: string) {\n if (this.connection) {\n return this.connection.send_event(name, data, channel);\n } else {\n return false;\n }\n }\n\n /** Closes the connection. */\n disconnect() {\n this.disconnectInternally();\n this.updateState('disconnected');\n }\n\n isUsingTLS() {\n return this.usingTLS;\n }\n\n private startConnecting() {\n var callback = (error, handshake) => {\n if (error) {\n this.runner = this.strategy.connect(0, callback);\n } else {\n if (handshake.action === 'error') {\n this.emit('error', {\n type: 'HandshakeError',\n error: handshake.error,\n });\n this.timeline.error({ handshakeError: handshake.error });\n } else {\n this.abortConnecting(); // we don't support switching connections yet\n this.handshakeCallbacks[handshake.action](handshake);\n }\n }\n };\n this.runner = this.strategy.connect(0, callback);\n }\n\n private abortConnecting() {\n if (this.runner) {\n this.runner.abort();\n this.runner = null;\n }\n }\n\n private disconnectInternally() {\n this.abortConnecting();\n this.clearRetryTimer();\n this.clearUnavailableTimer();\n if (this.connection) {\n var connection = this.abandonConnection();\n connection.close();\n }\n }\n\n private updateStrategy() {\n this.strategy = this.options.getStrategy({\n key: this.key,\n timeline: this.timeline,\n useTLS: this.usingTLS,\n });\n }\n\n private retryIn(delay) {\n this.timeline.info({ action: 'retry', delay: delay });\n if (delay > 0) {\n this.emit('connecting_in', Math.round(delay / 1000));\n }\n this.retryTimer = new Timer(delay || 0, () => {\n this.disconnectInternally();\n this.connect();\n });\n }\n\n private clearRetryTimer() {\n if (this.retryTimer) {\n this.retryTimer.ensureAborted();\n this.retryTimer = null;\n }\n }\n\n private setUnavailableTimer() {\n this.unavailableTimer = new Timer(this.options.unavailableTimeout, () => {\n this.updateState('unavailable');\n });\n }\n\n private clearUnavailableTimer() {\n if (this.unavailableTimer) {\n this.unavailableTimer.ensureAborted();\n }\n }\n\n private sendActivityCheck() {\n this.stopActivityCheck();\n this.connection.ping();\n // wait for pong response\n this.activityTimer = new Timer(this.options.pongTimeout, () => {\n this.timeline.error({ pong_timed_out: this.options.pongTimeout });\n this.retryIn(0);\n });\n }\n\n private resetActivityCheck() {\n this.stopActivityCheck();\n // send ping after inactivity\n if (this.connection && !this.connection.handlesActivityChecks()) {\n this.activityTimer = new Timer(this.activityTimeout, () => {\n this.sendActivityCheck();\n });\n }\n }\n\n private stopActivityCheck() {\n if (this.activityTimer) {\n this.activityTimer.ensureAborted();\n }\n }\n\n private buildConnectionCallbacks(\n errorCallbacks: ErrorCallbacks,\n ): ConnectionCallbacks {\n return Collections.extend<ConnectionCallbacks>({}, 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<HandshakeCallbacks>({}, errorCallbacks, {\n connected: (handshake: HandshakePayload) => {\n this.activityTimeout = Math.min(\n this.options.activityTimeout,\n handshake.activityTimeout,\n handshake.connection.activityTimeout || Infinity,\n );\n this.clearUnavailableTimer();\n this.setConnection(handshake.connection);\n this.socket_id = this.connection.id;\n this.updateState('connected', { socket_id: this.socket_id });\n },\n });\n }\n\n private buildErrorCallbacks(): ErrorCallbacks {\n let withErrorEmitted = (callback) => {\n return (result: Action | HandshakePayload) => {\n if (result.error) {\n this.emit('error', { type: 'WebSocketError', error: result.error });\n }\n callback(result);\n };\n };\n\n return {\n tls_only: withErrorEmitted(() => {\n this.usingTLS = true;\n this.updateStrategy();\n this.retryIn(0);\n }),\n refused: withErrorEmitted(() => {\n this.disconnect();\n }),\n backoff: withErrorEmitted(() => {\n this.retryIn(1000);\n }),\n retry: withErrorEmitted(() => {\n this.retryIn(0);\n }),\n };\n }\n\n private setConnection(connection) {\n this.connection = connection;\n for (var event in this.connectionCallbacks) {\n this.connection.bind(event, this.connectionCallbacks[event]);\n }\n this.resetActivityCheck();\n }\n\n private abandonConnection() {\n if (!this.connection) {\n return;\n }\n this.stopActivityCheck();\n for (var event in this.connectionCallbacks) {\n this.connection.unbind(event, this.connectionCallbacks[event]);\n }\n var connection = this.connection;\n this.connection = null;\n return connection;\n }\n\n private updateState(newState: string, data?: any) {\n var previousState = this.state;\n this.state = newState;\n if (previousState !== newState) {\n var newStateDescription = newState;\n if (newStateDescription === 'connected') {\n newStateDescription += ' with new socket ID ' + data.socket_id;\n }\n Logger.debug(\n 'State changed',\n previousState + ' -> ' + newStateDescription,\n );\n this.timeline.info({ state: newState, params: data });\n this.emit('state_change', { previous: previousState, current: newState });\n this.emit(newState, data);\n }\n }\n\n private shouldRetry(): boolean {\n return this.state === 'connecting' || this.state === 'connected';\n }\n}\n","import Channel from './channel';\nimport * as Collections from '../utils/collections';\nimport ChannelTable from './channel_table';\nimport Factory from '../utils/factory';\nimport Pusher from '../pusher';\nimport Logger from '../logger';\nimport * as Errors from '../errors';\nimport urlStore from '../utils/url_store';\n\n/** Handles a channel map. */\nexport default class Channels {\n channels: ChannelTable;\n\n constructor() {\n this.channels = {};\n }\n\n /** Creates or retrieves an existing channel by its name.\n *\n * @param {String} name\n * @param {Pusher} pusher\n * @return {Channel}\n */\n add(name: string, pusher: Pusher) {\n if (!this.channels[name]) {\n this.channels[name] = createChannel(name, pusher);\n }\n return this.channels[name];\n }\n\n /** Returns a list of all channels\n *\n * @return {Array}\n */\n all(): Channel[] {\n return Collections.values(this.channels);\n }\n\n /** Finds a channel by its name.\n *\n * @param {String} name\n * @return {Channel} channel or null if it doesn't exist\n */\n find(name: string) {\n return this.channels[name];\n }\n\n /** Removes a channel from the map.\n *\n * @param {String} name\n */\n remove(name: string) {\n var channel = this.channels[name];\n delete this.channels[name];\n return channel;\n }\n\n /** Proxies disconnection signal to all channels. */\n disconnect() {\n Collections.objectApply(this.channels, function (channel) {\n channel.disconnect();\n });\n }\n}\n\nfunction createChannel(name: string, pusher: Pusher): Channel {\n if (name.indexOf('private-encrypted-') === 0) {\n if (pusher.config.nacl) {\n return Factory.createEncryptedChannel(name, pusher, pusher.config.nacl);\n }\n let errMsg =\n 'Tried to subscribe to a private-encrypted- channel but no nacl implementation available';\n let suffix = urlStore.buildLogSuffix('encryptedChannelSupport');\n throw new Errors.UnsupportedFeature(`${errMsg}. ${suffix}`);\n } else if (name.indexOf('private-') === 0) {\n return Factory.createPrivateChannel(name, pusher);\n } else if (name.indexOf('presence-') === 0) {\n return Factory.createPresenceChannel(name, pusher);\n } else if (name.indexOf('#') === 0) {\n throw new Errors.BadChannelName(\n 'Cannot create a channel with name \"' + name + '\".',\n );\n } else {\n return Factory.createChannel(name, pusher);\n }\n}\n","import AssistantToTheTransportManager from '../transports/assistant_to_the_transport_manager';\nimport PingDelayOptions from '../transports/ping_delay_options';\nimport Transport from '../transports/transport';\nimport TransportManager from '../transports/transport_manager';\nimport Handshake from '../connection/handshake';\nimport TransportConnection from '../transports/transport_connection';\nimport SocketHooks from '../http/socket_hooks';\nimport HTTPSocket from '../http/http_socket';\n\nimport Timeline from '../timeline/timeline';\nimport {\n default as TimelineSender,\n TimelineSenderOptions,\n} from '../timeline/timeline_sender';\nimport PresenceChannel from '../channels/presence_channel';\nimport PrivateChannel from '../channels/private_channel';\nimport EncryptedChannel from '../channels/encrypted_channel';\nimport Channel from '../channels/channel';\nimport ConnectionManager from '../connection/connection_manager';\nimport ConnectionManagerOptions from '../connection/connection_manager_options';\nimport Ajax from '../http/ajax';\nimport Channels from '../channels/channels';\nimport Pusher from '../pusher';\nimport { Config } from '../config';\nimport * as nacl from 'tweetnacl';\n\nvar Factory = {\n createChannels(): Channels {\n return new Channels();\n },\n\n createConnectionManager(\n key: string,\n options: ConnectionManagerOptions,\n ): ConnectionManager {\n return new ConnectionManager(key, options);\n },\n\n createChannel(name: string, pusher: Pusher): Channel {\n return new Channel(name, pusher);\n },\n\n createPrivateChannel(name: string, pusher: Pusher): PrivateChannel {\n return new PrivateChannel(name, pusher);\n },\n\n createPresenceChannel(name: string, pusher: Pusher): PresenceChannel {\n return new PresenceChannel(name, pusher);\n },\n\n createEncryptedChannel(\n name: string,\n pusher: Pusher,\n nacl: nacl,\n ): EncryptedChannel {\n return new EncryptedChannel(name, pusher, nacl);\n },\n\n createTimelineSender(timeline: Timeline, options: TimelineSenderOptions) {\n return new TimelineSender(timeline, options);\n },\n\n createHandshake(\n transport: TransportConnection,\n callback: (HandshakePayload) => void,\n ): Handshake {\n return new Handshake(transport, callback);\n },\n\n createAssistantToTheTransportManager(\n manager: TransportManager,\n transport: Transport,\n options: PingDelayOptions,\n ): AssistantToTheTransportManager {\n return new AssistantToTheTransportManager(manager, transport, options);\n },\n};\n\nexport default Factory;\n","import AssistantToTheTransportManager from './assistant_to_the_transport_manager';\nimport Transport from './transport';\nimport PingDelayOptions from './ping_delay_options';\nimport Factory from '../utils/factory';\n\nexport interface TransportManagerOptions extends PingDelayOptions {\n lives?: number;\n}\n\n/** Keeps track of the number of lives left for a transport.\n *\n * In the beginning of a session, transports may be assigned a number of\n * lives. When an AssistantToTheTransportManager instance reports a transport\n * connection closed uncleanly, the transport loses a life. When the number\n * of lives drops to zero, the transport gets disabled by its manager.\n *\n * @param {Object} options\n */\nexport default class TransportManager {\n options: TransportManagerOptions;\n livesLeft: number;\n\n constructor(options: TransportManagerOptions) {\n this.options = options || {};\n this.livesLeft = this.options.lives || Infinity;\n }\n\n /** Creates a assistant for the transport.\n *\n * @param {Transport} transport\n * @returns {AssistantToTheTransportManager}\n */\n getAssistant(transport: Transport): AssistantToTheTransportManager {\n return Factory.createAssistantToTheTransportManager(this, transport, {\n minPingDelay: this.options.minPingDelay,\n maxPingDelay: this.options.maxPingDelay,\n });\n }\n\n /** Returns whether the transport has any lives left.\n *\n * @returns {Boolean}\n */\n isAlive(): boolean {\n return this.livesLeft > 0;\n }\n\n /** Takes one life from the transport. */\n reportDeath() {\n this.livesLeft -= 1;\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport { OneOffTimer as Timer } from '../utils/timers';\nimport Strategy from './strategy';\nimport StrategyOptions from './strategy_options';\n\n/** Loops through strategies with optional timeouts.\n *\n * Options:\n * - loop - whether it should loop through the substrategy list\n * - timeout - initial timeout for a single substrategy\n * - timeoutLimit - maximum timeout\n *\n * @param {Strategy[]} strategies\n * @param {Object} options\n */\nexport default class SequentialStrategy implements Strategy {\n strategies: Strategy[];\n loop: boolean;\n failFast: boolean;\n timeout: number;\n timeoutLimit: number;\n\n constructor(strategies: Strategy[], options: StrategyOptions) {\n this.strategies = strategies;\n this.loop = Boolean(options.loop);\n this.failFast = Boolean(options.failFast);\n this.timeout = options.timeout;\n this.timeoutLimit = options.timeoutLimit;\n }\n\n isSupported(): boolean {\n return Collections.any(this.strategies, Util.method('isSupported'));\n }\n\n connect(minPriority: number, callback: Function) {\n var strategies = this.strategies;\n var current = 0;\n var timeout = this.timeout;\n var runner = null;\n\n var tryNextStrategy = (error, handshake) => {\n if (handshake) {\n callback(null, handshake);\n } else {\n current = current + 1;\n if (this.loop) {\n current = current % strategies.length;\n }\n\n if (current < strategies.length) {\n if (timeout) {\n timeout = timeout * 2;\n if (this.timeoutLimit) {\n timeout = Math.min(timeout, this.timeoutLimit);\n }\n }\n runner = this.tryStrategy(\n strategies[current],\n minPriority,\n { timeout, failFast: this.failFast },\n tryNextStrategy,\n );\n } else {\n callback(true);\n }\n }\n };\n\n runner = this.tryStrategy(\n strategies[current],\n minPriority,\n { timeout: timeout, failFast: this.failFast },\n tryNextStrategy,\n );\n\n return {\n abort: function () {\n runner.abort();\n },\n forceMinPriority: function (p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n },\n };\n }\n\n private tryStrategy(\n strategy: Strategy,\n minPriority: number,\n options: StrategyOptions,\n callback: Function,\n ) {\n var timer = null;\n var runner = null;\n\n if (options.timeout > 0) {\n timer = new Timer(options.timeout, function () {\n runner.abort();\n callback(true);\n });\n }\n\n runner = strategy.connect(minPriority, function (error, handshake) {\n if (error && timer && timer.isRunning() && !options.failFast) {\n // advance to the next strategy after the timeout\n return;\n }\n if (timer) {\n timer.ensureAborted();\n }\n callback(error, handshake);\n });\n\n return {\n abort: function () {\n if (timer) {\n timer.ensureAborted();\n }\n runner.abort();\n },\n forceMinPriority: function (p) {\n runner.forceMinPriority(p);\n },\n };\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport Strategy from './strategy';\n\n/** Launches all substrategies and emits prioritized connected transports.\n *\n * @param {Array} strategies\n */\nexport default class BestConnectedEverStrategy implements Strategy {\n strategies: Strategy[];\n\n constructor(strategies: Strategy[]) {\n this.strategies = strategies;\n }\n\n isSupported(): boolean {\n return Collections.any(this.strategies, Util.method('isSupported'));\n }\n\n connect(minPriority: number, callback: Function) {\n return connect(this.strategies, minPriority, function (i, runners) {\n return function (error, handshake) {\n runners[i].error = error;\n if (error) {\n if (allRunnersFailed(runners)) {\n callback(true);\n }\n return;\n }\n Collections.apply(runners, function (runner) {\n runner.forceMinPriority(handshake.transport.priority);\n });\n callback(null, handshake);\n };\n });\n }\n}\n\n/** Connects to all strategies in parallel.\n *\n * Callback builder should be a function that takes two arguments: index\n * and a list of runners. It should return another function that will be\n * passed to the substrategy with given index. Runners can be aborted using\n * abortRunner(s) functions from this class.\n *\n * @param {Array} strategies\n * @param {Function} callbackBuilder\n * @return {Object} strategy runner\n */\nfunction connect(\n strategies: Strategy[],\n minPriority: number,\n callbackBuilder: Function,\n) {\n var runners = Collections.map(strategies, function (strategy, i, _, rs) {\n return strategy.connect(minPriority, callbackBuilder(i, rs));\n });\n return {\n abort: function () {\n Collections.apply(runners, abortRunner);\n },\n forceMinPriority: function (p) {\n Collections.apply(runners, function (runner) {\n runner.forceMinPriority(p);\n });\n },\n };\n}\n\nfunction allRunnersFailed(runners): boolean {\n return Collections.all(runners, function (runner) {\n return Boolean(runner.error);\n });\n}\n\nfunction abortRunner(runner) {\n if (!runner.error && !runner.aborted) {\n runner.abort();\n runner.aborted = true;\n }\n}\n","import Util from '../util';\nimport Runtime from 'runtime';\nimport Strategy from './strategy';\nimport SequentialStrategy from './sequential_strategy';\nimport StrategyOptions from './strategy_options';\nimport TransportStrategy from './transport_strategy';\nimport Timeline from '../timeline/timeline';\nimport * as Collections from '../utils/collections';\n\nexport interface TransportStrategyDictionary {\n [key: string]: TransportStrategy;\n}\n\n/** Caches the last successful transport and, after the first few attempts,\n * uses the cached transport for subsequent attempts.\n *\n * @param {Strategy} strategy\n * @param {Object} transports\n * @param {Object} options\n */\nexport default class WebSocketPrioritizedCachedStrategy 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 var cacheSkipCount = info && info.cacheSkipCount ? info.cacheSkipCount : 0;\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 if (['ws', 'wss'].includes(info.transport) || cacheSkipCount > 3) {\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 } else {\n cacheSkipCount++;\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 cacheSkipCount,\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 cacheSkipCount: 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 cacheSkipCount: cacheSkipCount,\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(\n minPriority,\n function (error, handshake) {\n if (handshake) {\n runner.abort();\n }\n callback(error, handshake);\n },\n );\n return runner;\n }\n}\n","import * as Collections from 'core/utils/collections';\nimport TransportManager from 'core/transports/transport_manager';\nimport Strategy from 'core/strategies/strategy';\nimport StrategyOptions from 'core/strategies/strategy_options';\nimport SequentialStrategy from 'core/strategies/sequential_strategy';\nimport BestConnectedEverStrategy from 'core/strategies/best_connected_ever_strategy';\nimport WebSocketPrioritizedCachedStrategy, {\n TransportStrategyDictionary,\n} from 'core/strategies/websocket_prioritized_cached_strategy';\nimport DelayedStrategy from 'core/strategies/delayed_strategy';\nimport IfStrategy from 'core/strategies/if_strategy';\nimport FirstConnectedStrategy from 'core/strategies/first_connected_strategy';\nimport { Config } from 'core/config';\n\nfunction testSupportsStrategy(strategy: Strategy) {\n return function () {\n return strategy.isSupported();\n };\n}\n\nvar getDefaultStrategy = function (\n config: Config,\n baseOptions: StrategyOptions,\n defineTransport: Function,\n): Strategy {\n var definedTransports = <TransportStrategyDictionary>{};\n\n function defineTransportStrategy(\n name: string,\n type: string,\n priority: number,\n options: StrategyOptions,\n manager?: TransportManager,\n ) {\n var transport = defineTransport(\n config,\n name,\n type,\n priority,\n options,\n manager,\n );\n\n definedTransports[name] = transport;\n\n return transport;\n }\n\n var ws_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.wsHost + ':' + config.wsPort,\n hostTLS: config.wsHost + ':' + config.wssPort,\n httpPath: config.wsPath,\n });\n var wss_options: StrategyOptions = Object.assign({}, ws_options, {\n useTLS: true,\n });\n var sockjs_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.httpHost + ':' + config.httpPort,\n hostTLS: config.httpHost + ':' + config.httpsPort,\n httpPath: config.httpPath,\n });\n\n var timeouts = {\n loop: true,\n timeout: 15000,\n timeoutLimit: 60000,\n };\n\n var ws_manager = new TransportManager({\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout,\n });\n var streaming_manager = new TransportManager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout,\n });\n\n var ws_transport = defineTransportStrategy(\n 'ws',\n 'ws',\n 3,\n ws_options,\n ws_manager,\n );\n var wss_transport = defineTransportStrategy(\n 'wss',\n 'ws',\n 3,\n wss_options,\n ws_manager,\n );\n var sockjs_transport = defineTransportStrategy(\n 'sockjs',\n 'sockjs',\n 1,\n sockjs_options,\n );\n var xhr_streaming_transport = defineTransportStrategy(\n 'xhr_streaming',\n 'xhr_streaming',\n 1,\n sockjs_options,\n streaming_manager,\n );\n var xdr_streaming_transport = defineTransportStrategy(\n 'xdr_streaming',\n 'xdr_streaming',\n 1,\n sockjs_options,\n streaming_manager,\n );\n var xhr_polling_transport = defineTransportStrategy(\n 'xhr_polling',\n 'xhr_polling',\n 1,\n sockjs_options,\n );\n var xdr_polling_transport = defineTransportStrategy(\n 'xdr_polling',\n 'xdr_polling',\n 1,\n sockjs_options,\n );\n\n var ws_loop = new SequentialStrategy([ws_transport], timeouts);\n var wss_loop = new SequentialStrategy([wss_transport], timeouts);\n var sockjs_loop = new SequentialStrategy([sockjs_transport], timeouts);\n var streaming_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(xhr_streaming_transport),\n xhr_streaming_transport,\n xdr_streaming_transport,\n ),\n ],\n timeouts,\n );\n var polling_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(xhr_polling_transport),\n xhr_polling_transport,\n xdr_polling_transport,\n ),\n ],\n timeouts,\n );\n\n var http_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(streaming_loop),\n new BestConnectedEverStrategy([\n streaming_loop,\n new DelayedStrategy(polling_loop, { delay: 4000 }),\n ]),\n polling_loop,\n ),\n ],\n timeouts,\n );\n\n var http_fallback_loop = new IfStrategy(\n testSupportsStrategy(http_loop),\n http_loop,\n sockjs_loop,\n );\n\n var wsStrategy;\n if (baseOptions.useTLS) {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(http_fallback_loop, { delay: 2000 }),\n ]);\n } else {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(wss_loop, { delay: 2000 }),\n new DelayedStrategy(http_fallback_loop, { delay: 5000 }),\n ]);\n }\n\n return new WebSocketPrioritizedCachedStrategy(\n new FirstConnectedStrategy(\n new IfStrategy(\n testSupportsStrategy(ws_transport),\n wsStrategy,\n http_fallback_loop,\n ),\n ),\n definedTransports,\n {\n ttl: 1800000,\n timeline: baseOptions.timeline,\n useTLS: baseOptions.useTLS,\n },\n );\n};\n\nexport default getDefaultStrategy;\n","import { Dependencies } from '../dom/dependencies';\n\n/** Initializes the transport.\n *\n * Fetches resources if needed and then transitions to initialized.\n */\nexport default function () {\n var self = this;\n\n self.timeline.info(\n self.buildTimelineMessage({\n transport: self.name + (self.options.useTLS ? 's' : ''),\n }),\n );\n\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n } else if (self.hooks.file) {\n self.changeState('initializing');\n Dependencies.load(\n self.hooks.file,\n { useTLS: self.options.useTLS },\n function (error, callback) {\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n callback(true);\n } else {\n if (error) {\n self.onError(error);\n }\n self.onClose();\n callback(false);\n }\n },\n );\n } else {\n self.onClose();\n }\n}\n","import HTTPRequest from 'core/http/http_request';\nimport RequestHooks from 'core/http/request_hooks';\nimport Ajax from 'core/http/ajax';\nimport * as Errors from 'core/errors';\n\nvar hooks: RequestHooks = {\n getRequest: function (socket: HTTPRequest): Ajax {\n var xdr = new (<any>window).XDomainRequest();\n xdr.ontimeout = function () {\n socket.emit('error', new Errors.RequestTimedOut());\n socket.close();\n };\n xdr.onerror = function (e) {\n socket.emit('error', e);\n socket.close();\n };\n xdr.onprogress = function () {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n };\n xdr.onload = function () {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n socket.emit('finished', 200);\n socket.close();\n };\n return xdr;\n },\n abortRequest: function (xdr: Ajax) {\n xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null;\n xdr.abort();\n },\n};\n\nexport default hooks;\n","import Runtime from 'runtime';\nimport RequestHooks from './request_hooks';\nimport Ajax from './ajax';\nimport { default as EventsDispatcher } from '../events/dispatcher';\n\nconst MAX_BUFFER_LENGTH = 256 * 1024;\n\nexport default class HTTPRequest extends EventsDispatcher {\n hooks: RequestHooks;\n method: string;\n url: string;\n position: number;\n xhr: Ajax;\n unloader: Function;\n\n constructor(hooks: RequestHooks, method: string, url: string) {\n super();\n this.hooks = hooks;\n this.method = method;\n this.url = url;\n }\n\n start(payload?: any) {\n this.position = 0;\n this.xhr = this.hooks.getRequest(this);\n\n this.unloader = () => {\n this.close();\n };\n Runtime.addUnloadListener(this.unloader);\n\n this.xhr.open(this.method, this.url, true);\n\n if (this.xhr.setRequestHeader) {\n this.xhr.setRequestHeader('Content-Type', 'application/json'); // ReactNative doesn't set this header by default.\n }\n this.xhr.send(payload);\n }\n\n close() {\n if (this.unloader) {\n Runtime.removeUnloadListener(this.unloader);\n this.unloader = null;\n }\n if (this.xhr) {\n this.hooks.abortRequest(this.xhr);\n this.xhr = null;\n }\n }\n\n onChunk(status: number, data: any) {\n while (true) {\n var chunk = this.advanceBuffer(data);\n if (chunk) {\n this.emit('chunk', { status: status, data: chunk });\n } else {\n break;\n }\n }\n if (this.isBufferTooLong(data)) {\n this.emit('buffer_too_long');\n }\n }\n\n private advanceBuffer(buffer: any[]): any {\n var unreadData = buffer.slice(this.position);\n var endOfLinePosition = unreadData.indexOf('\\n');\n\n if (endOfLinePosition !== -1) {\n this.position += endOfLinePosition + 1;\n return unreadData.slice(0, endOfLinePosition);\n } else {\n // chunk is not finished yet, don't move the buffer pointer\n return null;\n }\n }\n\n private isBufferTooLong(buffer: any): boolean {\n return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH;\n }\n}\n","enum State {\n CONNECTING = 0,\n OPEN = 1,\n CLOSED = 3,\n}\n\nexport default State;\n","import URLLocation from './url_location';\nimport State from './state';\nimport Socket from '../socket';\nimport SocketHooks from './socket_hooks';\nimport Util from '../util';\nimport Ajax from './ajax';\nimport HTTPRequest from './http_request';\nimport Runtime from 'runtime';\n\nvar autoIncrement = 1;\n\nclass HTTPSocket implements Socket {\n hooks: SocketHooks;\n session: string;\n location: URLLocation;\n readyState: State;\n stream: HTTPRequest;\n\n onopen: () => void;\n onerror: (error: any) => void;\n onclose: (closeEvent: any) => void;\n onmessage: (message: any) => void;\n onactivity: () => void;\n\n constructor(hooks: SocketHooks, url: string) {\n this.hooks = hooks;\n this.session = randomNumber(1000) + '/' + randomString(8);\n this.location = getLocation(url);\n this.readyState = State.CONNECTING;\n this.openStream();\n }\n\n send(payload: any) {\n return this.sendRaw(JSON.stringify([payload]));\n }\n\n ping() {\n this.hooks.sendHeartbeat(this);\n }\n\n close(code: any, reason: any) {\n this.onClose(code, reason, true);\n }\n\n /** For internal use only */\n sendRaw(payload: any): boolean {\n if (this.readyState === State.OPEN) {\n try {\n Runtime.createSocketRequest(\n 'POST',\n getUniqueURL(getSendURL(this.location, this.session)),\n ).start(payload);\n return true;\n } catch (e) {\n return false;\n }\n } else {\n return false;\n }\n }\n\n /** For internal use only */\n reconnect() {\n this.closeStream();\n this.openStream();\n }\n\n /** For internal use only */\n onClose(code, reason, wasClean) {\n this.closeStream();\n this.readyState = State.CLOSED;\n if (this.onclose) {\n this.onclose({\n code: code,\n reason: reason,\n wasClean: wasClean,\n });\n }\n }\n\n private onChunk(chunk) {\n if (chunk.status !== 200) {\n return;\n }\n if (this.readyState === State.OPEN) {\n this.onActivity();\n }\n\n var payload;\n var type = chunk.data.slice(0, 1);\n switch (type) {\n case 'o':\n payload = JSON.parse(chunk.data.slice(1) || '{}');\n this.onOpen(payload);\n break;\n case 'a':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n for (var i = 0; i < payload.length; i++) {\n this.onEvent(payload[i]);\n }\n break;\n case 'm':\n payload = JSON.parse(chunk.data.slice(1) || 'null');\n this.onEvent(payload);\n break;\n case 'h':\n this.hooks.onHeartbeat(this);\n break;\n case 'c':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n this.onClose(payload[0], payload[1], true);\n break;\n }\n }\n\n private onOpen(options) {\n if (this.readyState === State.CONNECTING) {\n if (options && options.hostname) {\n this.location.base = replaceHost(this.location.base, options.hostname);\n }\n this.readyState = State.OPEN;\n\n if (this.onopen) {\n this.onopen();\n }\n } else {\n this.onClose(1006, 'Server lost session', true);\n }\n }\n\n private onEvent(event) {\n if (this.readyState === State.OPEN && this.onmessage) {\n this.onmessage({ data: event });\n }\n }\n\n private onActivity() {\n if (this.onactivity) {\n this.onactivity();\n }\n }\n\n private onError(error) {\n if (this.onerror) {\n this.onerror(error);\n }\n }\n\n private openStream() {\n this.stream = Runtime.createSocketRequest(\n 'POST',\n getUniqueURL(this.hooks.getReceiveURL(this.location, this.session)),\n );\n\n this.stream.bind('chunk', (chunk) => {\n this.onChunk(chunk);\n });\n this.stream.bind('finished', (status) => {\n this.hooks.onFinished(this, status);\n });\n this.stream.bind('buffer_too_long', () => {\n this.reconnect();\n });\n\n try {\n this.stream.start();\n } catch (error) {\n Util.defer(() => {\n this.onError(error);\n this.onClose(1006, 'Could not start streaming', false);\n });\n }\n }\n\n private closeStream() {\n if (this.stream) {\n this.stream.unbind_all();\n this.stream.close();\n this.stream = null;\n }\n }\n}\n\nfunction getLocation(url): URLLocation {\n var parts = /([^\\?]*)\\/*(\\??.*)/.exec(url);\n return {\n base: parts[1],\n queryString: parts[2],\n };\n}\n\nfunction getSendURL(url: URLLocation, session: string): string {\n return url.base + '/' + session + '/xhr_send';\n}\n\nfunction getUniqueURL(url: string): string {\n var separator = url.indexOf('?') === -1 ? '?' : '&';\n return url + separator + 't=' + +new Date() + '&n=' + autoIncrement++;\n}\n\nfunction replaceHost(url: string, hostname: string): string {\n var urlParts = /(https?:\\/\\/)([^\\/:]+)((\\/|:)?.*)/.exec(url);\n return urlParts[1] + hostname + urlParts[3];\n}\n\nfunction randomNumber(max: number): number {\n return Runtime.randomInt(max);\n}\n\nfunction randomString(length: number): string {\n var result = [];\n\n for (var i = 0; i < length; i++) {\n result.push(randomNumber(32).toString(32));\n }\n\n return result.join('');\n}\n\nexport default HTTPSocket;\n","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 HTTPRequest from 'core/http/http_request';\nimport HTTPSocket from 'core/http/http_socket';\nimport SocketHooks from 'core/http/socket_hooks';\nimport RequestHooks from 'core/http/request_hooks';\nimport streamingHooks from 'core/http/http_streaming_socket';\nimport pollingHooks from 'core/http/http_polling_socket';\nimport xhrHooks from './http_xhr_request';\nimport HTTPFactory from 'core/http/http_factory';\n\nvar HTTP: HTTPFactory = {\n createStreamingSocket(url: string): HTTPSocket {\n return this.createSocket(streamingHooks, url);\n },\n\n createPollingSocket(url: string): HTTPSocket {\n return this.createSocket(pollingHooks, url);\n },\n\n createSocket(hooks: SocketHooks, url: string): HTTPSocket {\n return new HTTPSocket(hooks, url);\n },\n\n createXHR(method: string, url: string): HTTPRequest {\n return this.createRequest(xhrHooks, method, url);\n },\n\n createRequest(hooks: RequestHooks, method: string, url: string): HTTPRequest {\n return new HTTPRequest(hooks, method, url);\n },\n};\n\nexport default HTTP;\n","import xdrHooks from './http_xdomain_request';\nimport HTTP from 'isomorphic/http/http';\n\nHTTP.createXDR = function (method, url) {\n return this.createRequest(xdrHooks, method, url);\n};\n\nexport default HTTP;\n","import Browser from './browser';\nimport { Dependencies, DependenciesReceivers } from './dom/dependencies';\nimport { AuthTransport, AuthTransports } from 'core/auth/auth_transports';\nimport xhrAuth from 'isomorphic/auth/xhr_auth';\nimport jsonpAuth from './auth/jsonp_auth';\nimport TimelineTransport from 'core/timeline/timeline_transport';\nimport TimelineSender from 'core/timeline/timeline_sender';\nimport ScriptRequest from './dom/script_request';\nimport JSONPRequest from './dom/jsonp_request';\nimport * as Collections from 'core/utils/collections';\nimport { ScriptReceivers } from './dom/script_receiver_factory';\nimport jsonpTimeline from './timeline/jsonp_timeline';\nimport Transports from './transports/transports';\nimport Ajax from 'core/http/ajax';\nimport { Network } from './net_info';\nimport getDefaultStrategy from './default_strategy';\nimport transportConnectionInitializer from './transports/transport_connection_initializer';\nimport HTTPFactory from './http/http';\nimport HTTPRequest from 'core/http/http_request';\n\nvar Runtime: Browser = {\n // for jsonp auth\n nextAuthCallbackID: 1,\n auth_callbacks: {},\n ScriptReceivers,\n DependenciesReceivers,\n getDefaultStrategy,\n Transports,\n transportConnectionInitializer,\n HTTPFactory,\n\n TimelineTransport: jsonpTimeline,\n\n getXHRAPI() {\n return window.XMLHttpRequest;\n },\n\n getWebSocketAPI() {\n return window.WebSocket || window.MozWebSocket;\n },\n\n setup(PusherClass): void {\n (<any>window).Pusher = PusherClass; // JSONp requires Pusher to be in the global scope.\n var initializeOnDocumentBody = () => {\n this.onDocumentBody(PusherClass.ready);\n };\n if (!(<any>window).JSON) {\n Dependencies.load('json2', {}, initializeOnDocumentBody);\n } else {\n initializeOnDocumentBody();\n }\n },\n\n getDocument(): Document {\n return document;\n },\n\n getProtocol(): string {\n return this.getDocument().location.protocol;\n },\n\n getAuthorizers(): AuthTransports {\n return { ajax: xhrAuth, jsonp: jsonpAuth };\n },\n\n onDocumentBody(callback: Function) {\n if (document.body) {\n callback();\n } else {\n setTimeout(() => {\n this.onDocumentBody(callback);\n }, 0);\n }\n },\n\n createJSONPRequest(url: string, data: any): JSONPRequest {\n return new JSONPRequest(url, data);\n },\n\n createScriptRequest(src: string): ScriptRequest {\n return new ScriptRequest(src);\n },\n\n getLocalStorage() {\n try {\n return window.localStorage;\n } catch (e) {\n return undefined;\n }\n },\n\n createXHR(): Ajax {\n if (this.getXHRAPI()) {\n return this.createXMLHttpRequest();\n } else {\n return this.createMicrosoftXHR();\n }\n },\n\n createXMLHttpRequest(): Ajax {\n var Constructor = this.getXHRAPI();\n return new Constructor();\n },\n\n createMicrosoftXHR(): Ajax {\n return new ActiveXObject('Microsoft.XMLHTTP');\n },\n\n getNetwork() {\n return Network;\n },\n\n createWebSocket(url: string): any {\n var Constructor = this.getWebSocketAPI();\n return new Constructor(url);\n },\n\n createSocketRequest(method: string, url: string): HTTPRequest {\n if (this.isXHRSupported()) {\n return this.HTTPFactory.createXHR(method, url);\n } else if (this.isXDRSupported(url.indexOf('https:') === 0)) {\n return this.HTTPFactory.createXDR(method, url);\n } else {\n throw 'Cross-origin HTTP requests are not supported';\n }\n },\n\n isXHRSupported(): boolean {\n var Constructor = this.getXHRAPI();\n return (\n Boolean(Constructor) && new Constructor().withCredentials !== undefined\n );\n },\n\n isXDRSupported(useTLS?: boolean): boolean {\n var protocol = useTLS ? 'https:' : 'http:';\n var documentProtocol = this.getProtocol();\n return (\n Boolean(<any>window['XDomainRequest']) && documentProtocol === protocol\n );\n },\n\n addUnloadListener(listener: any) {\n if (window.addEventListener !== undefined) {\n window.addEventListener('unload', listener, false);\n } else if (window.attachEvent !== undefined) {\n window.attachEvent('onunload', listener);\n }\n },\n\n removeUnloadListener(listener: any) {\n if (window.addEventListener !== undefined) {\n window.removeEventListener('unload', listener, false);\n } else if (window.detachEvent !== undefined) {\n window.detachEvent('onunload', listener);\n }\n },\n\n randomInt(max: number): number {\n /**\n * Return values in the range of [0, 1[\n */\n const random = function () {\n const crypto = window.crypto || window['msCrypto'];\n const random = crypto.getRandomValues(new Uint32Array(1))[0];\n\n return random / 2 ** 32;\n };\n\n return Math.floor(random() * max);\n },\n};\n\nexport default Runtime;\n","enum TimelineLevel {\n ERROR = 3,\n INFO = 6,\n DEBUG = 7,\n}\n\nexport default TimelineLevel;\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 ConnectionManager from './connection/connection_manager';\nimport {\n ChannelAuthorizationOptions,\n UserAuthenticationOptions,\n} from './auth/options';\nimport {\n ChannelAuthorizerGenerator,\n DeprecatedAuthOptions,\n} from './auth/deprecated_channel_authorizer';\nimport { AuthTransport, Transport } from './config';\nimport * as nacl from 'tweetnacl';\nimport Logger from './logger';\nimport { DeltaOptions } from './delta/types';\n\nexport interface Options {\n activityTimeout?: number;\n\n auth?: DeprecatedAuthOptions; // DEPRECATED use channelAuthorization instead\n authEndpoint?: string; // DEPRECATED use channelAuthorization instead\n authTransport?: AuthTransport; // DEPRECATED use channelAuthorization instead\n authorizer?: ChannelAuthorizerGenerator; // DEPRECATED use channelAuthorization instead\n\n channelAuthorization?: ChannelAuthorizationOptions;\n userAuthentication?: UserAuthenticationOptions;\n\n cluster: string;\n deltaCompression?: DeltaOptions;\n enableStats?: boolean;\n disableStats?: boolean;\n disabledTransports?: Transport[];\n enabledTransports?: Transport[];\n forceTLS?: boolean;\n httpHost?: string;\n httpPath?: string;\n httpPort?: number;\n httpsPort?: number;\n ignoreNullOrigin?: boolean;\n nacl?: nacl;\n pongTimeout?: number;\n statsHost?: string;\n timelineParams?: any;\n unavailableTimeout?: number;\n wsHost?: string;\n wsPath?: string;\n wsPort?: number;\n wssPort?: number;\n}\n\nexport function validateOptions(options) {\n if (options == null) {\n throw 'You must pass an options object';\n }\n if (options.cluster == null) {\n throw 'Options object must provide a cluster';\n }\n if ('disableStats' in options) {\n Logger.warn(\n 'The disableStats option is deprecated in favor of enableStats',\n );\n }\n}\n","import {\n UserAuthenticationCallback,\n InternalAuthOptions,\n UserAuthenticationHandler,\n UserAuthenticationRequestParams,\n AuthRequestType,\n} from './options';\n\nimport Runtime from 'runtime';\n\nconst composeChannelQuery = (\n params: UserAuthenticationRequestParams,\n authOptions: InternalAuthOptions,\n) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n\n return query;\n};\n\nconst UserAuthenticator = (\n authOptions: InternalAuthOptions,\n): UserAuthenticationHandler => {\n if (typeof Runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n\n return (\n params: UserAuthenticationRequestParams,\n callback: UserAuthenticationCallback,\n ) => {\n const query = composeChannelQuery(params, authOptions);\n\n Runtime.getAuthorizers()[authOptions.transport](\n Runtime,\n query,\n authOptions,\n AuthRequestType.UserAuthentication,\n callback,\n );\n };\n};\n\nexport default UserAuthenticator;\n","import {\n AuthRequestType,\n InternalAuthOptions,\n ChannelAuthorizationHandler,\n ChannelAuthorizationRequestParams,\n ChannelAuthorizationCallback,\n} from './options';\n\nimport Runtime from 'runtime';\n\nconst composeChannelQuery = (\n params: ChannelAuthorizationRequestParams,\n authOptions: InternalAuthOptions,\n) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n\n query += '&channel_name=' + encodeURIComponent(params.channelName);\n\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n\n return query;\n};\n\nconst ChannelAuthorizer = (\n authOptions: InternalAuthOptions,\n): ChannelAuthorizationHandler => {\n if (typeof Runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n\n return (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback,\n ) => {\n const query = composeChannelQuery(params, authOptions);\n\n Runtime.getAuthorizers()[authOptions.transport](\n Runtime,\n query,\n authOptions,\n AuthRequestType.ChannelAuthorization,\n callback,\n );\n };\n};\n\nexport default ChannelAuthorizer;\n","import Channel from '../channels/channel';\nimport {\n ChannelAuthorizationCallback,\n ChannelAuthorizationHandler,\n ChannelAuthorizationRequestParams,\n InternalAuthOptions,\n} from './options';\n\nexport interface DeprecatedChannelAuthorizer {\n authorize(socketId: string, callback: ChannelAuthorizationCallback): void;\n}\n\nexport interface ChannelAuthorizerGenerator {\n (\n channel: Channel,\n options: DeprecatedAuthorizerOptions,\n ): DeprecatedChannelAuthorizer;\n}\n\nexport interface DeprecatedAuthOptions {\n params?: any;\n headers?: any;\n}\n\nexport interface DeprecatedAuthorizerOptions {\n authTransport: 'ajax' | 'jsonp';\n authEndpoint: string;\n auth?: DeprecatedAuthOptions;\n}\n\nexport const ChannelAuthorizerProxy = (\n pusher,\n authOptions: InternalAuthOptions,\n channelAuthorizerGenerator: ChannelAuthorizerGenerator,\n): ChannelAuthorizationHandler => {\n const deprecatedAuthorizerOptions: DeprecatedAuthorizerOptions = {\n authTransport: authOptions.transport,\n authEndpoint: authOptions.endpoint,\n auth: {\n params: authOptions.params,\n headers: authOptions.headers,\n },\n };\n return (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback,\n ) => {\n const channel = pusher.channel(params.channelName);\n // This line creates a new channel authorizer every time.\n // In the past, this was only done once per channel and reused.\n // We can do that again if we want to keep this behavior intact.\n const channelAuthorizer: DeprecatedChannelAuthorizer =\n channelAuthorizerGenerator(channel, deprecatedAuthorizerOptions);\n channelAuthorizer.authorize(params.socketId, callback);\n };\n};\n","import { Options } from './options';\nimport Defaults from './defaults';\nimport {\n ChannelAuthorizationHandler,\n UserAuthenticationHandler,\n ChannelAuthorizationOptions,\n} from './auth/options';\nimport UserAuthenticator from './auth/user_authenticator';\nimport ChannelAuthorizer from './auth/channel_authorizer';\nimport { ChannelAuthorizerProxy } from './auth/deprecated_channel_authorizer';\nimport Runtime from 'runtime';\nimport * as nacl from 'tweetnacl';\n\nexport type AuthTransport = 'ajax' | 'jsonp';\nexport type Transport =\n | 'ws'\n | 'wss'\n | 'xhr_streaming'\n | 'xhr_polling'\n | 'sockjs';\n\nexport interface Config {\n // these are all 'required' config parameters, it's not necessary for the user\n // to set them, but they have configured defaults.\n activityTimeout: number;\n enableStats: boolean;\n httpHost: string;\n httpPath: string;\n httpPort: number;\n httpsPort: number;\n pongTimeout: number;\n statsHost: string;\n unavailableTimeout: number;\n useTLS: boolean;\n wsHost: string;\n wsPath: string;\n wsPort: number;\n wssPort: number;\n userAuthenticator: UserAuthenticationHandler;\n channelAuthorizer: ChannelAuthorizationHandler;\n\n // these are all optional parameters or overrrides. The customer can set these\n // but it's not strictly necessary\n forceTLS?: boolean;\n cluster?: string;\n disabledTransports?: Transport[];\n enabledTransports?: Transport[];\n ignoreNullOrigin?: boolean;\n nacl?: nacl;\n timelineParams?: any;\n}\n\n// getConfig mainly sets the defaults for the options that are not provided\nexport function getConfig(opts: Options, pusher): Config {\n let config: Config = {\n activityTimeout: opts.activityTimeout || Defaults.activityTimeout,\n cluster: opts.cluster,\n httpPath: opts.httpPath || Defaults.httpPath,\n httpPort: opts.httpPort || Defaults.httpPort,\n httpsPort: opts.httpsPort || Defaults.httpsPort,\n pongTimeout: opts.pongTimeout || Defaults.pongTimeout,\n statsHost: opts.statsHost || Defaults.stats_host,\n unavailableTimeout: opts.unavailableTimeout || Defaults.unavailableTimeout,\n wsPath: opts.wsPath || Defaults.wsPath,\n wsPort: opts.wsPort || Defaults.wsPort,\n wssPort: opts.wssPort || Defaults.wssPort,\n\n enableStats: getEnableStatsConfig(opts),\n httpHost: getHttpHost(opts),\n useTLS: shouldUseTLS(opts),\n wsHost: getWebsocketHost(opts),\n\n userAuthenticator: buildUserAuthenticator(opts),\n channelAuthorizer: buildChannelAuthorizer(opts, pusher),\n };\n\n if ('disabledTransports' in opts)\n config.disabledTransports = opts.disabledTransports;\n if ('enabledTransports' in opts)\n config.enabledTransports = opts.enabledTransports;\n if ('ignoreNullOrigin' in opts)\n config.ignoreNullOrigin = opts.ignoreNullOrigin;\n if ('timelineParams' in opts) config.timelineParams = opts.timelineParams;\n if ('nacl' in opts) {\n config.nacl = opts.nacl;\n }\n\n return config;\n}\n\nfunction getHttpHost(opts: Options): string {\n if (opts.httpHost) {\n return opts.httpHost;\n }\n if (opts.cluster) {\n return `sockjs-${opts.cluster}.pusher.com`;\n }\n return Defaults.httpHost;\n}\n\nfunction getWebsocketHost(opts: Options): string {\n if (opts.wsHost) {\n return opts.wsHost;\n }\n return getWebsocketHostFromCluster(opts.cluster);\n}\n\nfunction getWebsocketHostFromCluster(cluster: string): string {\n return `ws-${cluster}.pusher.com`;\n}\n\nfunction shouldUseTLS(opts: Options): boolean {\n if (Runtime.getProtocol() === 'https:') {\n return true;\n } else if (opts.forceTLS === false) {\n return false;\n }\n return true;\n}\n\n// if enableStats is set take the value\n// if disableStats is set take the inverse\n// otherwise default to false\nfunction getEnableStatsConfig(opts: Options): boolean {\n if ('enableStats' in opts) {\n return opts.enableStats;\n }\n if ('disableStats' in opts) {\n return !opts.disableStats;\n }\n return false;\n}\n\nfunction buildUserAuthenticator(opts: Options): UserAuthenticationHandler {\n const userAuthentication = {\n ...Defaults.userAuthentication,\n ...opts.userAuthentication,\n };\n if (\n 'customHandler' in userAuthentication &&\n userAuthentication['customHandler'] != null\n ) {\n return userAuthentication['customHandler'];\n }\n\n return UserAuthenticator(userAuthentication);\n}\n\nfunction buildChannelAuth(opts: Options, pusher): ChannelAuthorizationOptions {\n let channelAuthorization: ChannelAuthorizationOptions;\n if ('channelAuthorization' in opts) {\n channelAuthorization = {\n ...Defaults.channelAuthorization,\n ...opts.channelAuthorization,\n };\n } else {\n channelAuthorization = {\n transport: opts.authTransport || Defaults.authTransport,\n endpoint: opts.authEndpoint || Defaults.authEndpoint,\n };\n if ('auth' in opts) {\n if ('params' in opts.auth) channelAuthorization.params = opts.auth.params;\n if ('headers' in opts.auth)\n channelAuthorization.headers = opts.auth.headers;\n }\n if ('authorizer' in opts)\n channelAuthorization.customHandler = ChannelAuthorizerProxy(\n pusher,\n channelAuthorization,\n opts.authorizer,\n );\n }\n return channelAuthorization;\n}\n\nfunction buildChannelAuthorizer(\n opts: Options,\n pusher,\n): ChannelAuthorizationHandler {\n const channelAuthorization = buildChannelAuth(opts, pusher);\n if (\n 'customHandler' in channelAuthorization &&\n channelAuthorization['customHandler'] != null\n ) {\n return channelAuthorization['customHandler'];\n }\n\n return ChannelAuthorizer(channelAuthorization);\n}\n","import Logger from './logger';\nimport Pusher from './pusher';\nimport EventsDispatcher from './events/dispatcher';\n\nexport default class WatchlistFacade extends EventsDispatcher {\n private pusher: Pusher;\n\n public constructor(pusher: Pusher) {\n super(function (eventName, data) {\n Logger.debug(`No callbacks on watchlist events for ${eventName}`);\n });\n\n this.pusher = pusher;\n this.bindWatchlistInternalEvent();\n }\n\n handleEvent(pusherEvent) {\n pusherEvent.data.events.forEach((watchlistEvent) => {\n this.emit(watchlistEvent.name, watchlistEvent);\n });\n }\n\n private bindWatchlistInternalEvent() {\n this.pusher.connection.bind('message', (pusherEvent) => {\n var eventName = pusherEvent.event;\n if (eventName === 'pusher_internal:watchlist_events') {\n this.handleEvent(pusherEvent);\n }\n });\n }\n}\n","function flatPromise() {\n let resolve, reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nexport default flatPromise;\n","import Pusher from './pusher';\nimport Logger from './logger';\nimport {\n UserAuthenticationData,\n UserAuthenticationCallback,\n} from './auth/options';\nimport Channel from './channels/channel';\nimport WatchlistFacade from './watchlist';\nimport EventsDispatcher from './events/dispatcher';\nimport flatPromise from './utils/flat_promise';\n\nexport default class UserFacade extends EventsDispatcher {\n pusher: Pusher;\n signin_requested: boolean = false;\n user_data: any = null;\n serverToUserChannel: Channel = null;\n signinDonePromise: Promise<any> = null;\n watchlist: WatchlistFacade;\n private _signinDoneResolve: Function = null;\n\n public constructor(pusher: Pusher) {\n super(function (eventName, data) {\n Logger.debug('No callbacks on user for ' + eventName);\n });\n this.pusher = pusher;\n this.pusher.connection.bind('state_change', ({ previous, current }) => {\n if (previous !== 'connected' && current === 'connected') {\n this._signin();\n }\n if (previous === 'connected' && current !== 'connected') {\n this._cleanup();\n this._newSigninPromiseIfNeeded();\n }\n });\n\n this.watchlist = new WatchlistFacade(pusher);\n\n this.pusher.connection.bind('message', (event) => {\n var eventName = event.event;\n if (eventName === 'pusher:signin_success') {\n this._onSigninSuccess(event.data);\n }\n if (\n this.serverToUserChannel &&\n this.serverToUserChannel.name === event.channel\n ) {\n this.serverToUserChannel.handleEvent(event);\n }\n });\n }\n\n public signin() {\n if (this.signin_requested) {\n return;\n }\n\n this.signin_requested = true;\n this._signin();\n }\n\n private _signin() {\n if (!this.signin_requested) {\n return;\n }\n\n this._newSigninPromiseIfNeeded();\n\n if (this.pusher.connection.state !== 'connected') {\n // Signin will be attempted when the connection is connected\n return;\n }\n\n this.pusher.config.userAuthenticator(\n {\n socketId: this.pusher.connection.socket_id,\n },\n this._onAuthorize,\n );\n }\n\n private _onAuthorize: UserAuthenticationCallback = (\n err,\n authData: UserAuthenticationData,\n ) => {\n if (err) {\n Logger.warn(`Error during signin: ${err}`);\n this._cleanup();\n return;\n }\n\n this.pusher.send_event('pusher:signin', {\n auth: authData.auth,\n user_data: authData.user_data,\n });\n\n // Later when we get pusher:singin_success event, the user will be marked as signed in\n };\n\n private _onSigninSuccess(data: any) {\n try {\n this.user_data = JSON.parse(data.user_data);\n } catch (e) {\n Logger.error(`Failed parsing user data after signin: ${data.user_data}`);\n this._cleanup();\n return;\n }\n\n if (typeof this.user_data.id !== 'string' || this.user_data.id === '') {\n Logger.error(\n `user_data doesn't contain an id. user_data: ${this.user_data}`,\n );\n this._cleanup();\n return;\n }\n\n // Signin succeeded\n this._signinDoneResolve();\n this._subscribeChannels();\n }\n\n private _subscribeChannels() {\n const ensure_subscribed = (channel) => {\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n } else if (\n !channel.subscriptionPending &&\n this.pusher.connection.state === 'connected'\n ) {\n channel.subscribe();\n }\n };\n\n this.serverToUserChannel = new Channel(\n `#server-to-user-${this.user_data.id}`,\n this.pusher,\n );\n this.serverToUserChannel.bind_global((eventName, data) => {\n if (\n eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0\n ) {\n // ignore internal events\n return;\n }\n this.emit(eventName, data);\n });\n ensure_subscribed(this.serverToUserChannel);\n }\n\n private _cleanup() {\n this.user_data = null;\n if (this.serverToUserChannel) {\n this.serverToUserChannel.unbind_all();\n this.serverToUserChannel.disconnect();\n this.serverToUserChannel = null;\n }\n\n if (this.signin_requested) {\n // If signin is in progress and cleanup is called,\n // Mark the current signin process as done.\n this._signinDoneResolve();\n }\n }\n\n private _newSigninPromiseIfNeeded() {\n if (!this.signin_requested) {\n return;\n }\n\n // If there is a promise and it is not resolved, return without creating a new one.\n if (this.signinDonePromise && !(this.signinDonePromise as any).done) {\n return;\n }\n\n // This promise is never rejected.\n // It gets resolved when the signin process is done whether it failed or succeeded\n const { promise, resolve, reject: _ } = flatPromise();\n (promise as any).done = false;\n const setDone = () => {\n (promise as any).done = true;\n };\n promise.then(setDone).catch(setDone);\n this.signinDonePromise = promise;\n this._signinDoneResolve = resolve;\n }\n}\n","/**\n * Per-channel delta state tracking with conflation key support\n */\n\nimport { CachedMessage, CacheSyncData, ChannelDeltaStats } from './types';\n\nexport default class ChannelState {\n channelName: string;\n conflationKey: string | null;\n maxMessagesPerKey: number;\n conflationCaches: Map<string, CachedMessage[]>;\n\n // Legacy single-base tracking (for non-conflation channels)\n baseMessage: string | null;\n baseSequence: number | null;\n lastSequence: number | null;\n\n // Statistics\n deltaCount: number;\n fullMessageCount: number;\n\n constructor(channelName: string) {\n this.channelName = channelName;\n this.conflationKey = null;\n this.maxMessagesPerKey = 10;\n this.conflationCaches = new Map();\n\n this.baseMessage = null;\n this.baseSequence = null;\n this.lastSequence = null;\n\n this.deltaCount = 0;\n this.fullMessageCount = 0;\n }\n\n /**\n * Initialize cache from server sync\n */\n initializeFromCacheSync(data: CacheSyncData): void {\n this.conflationKey = data.conflation_key || null;\n this.maxMessagesPerKey = data.max_messages_per_key || 10;\n this.conflationCaches.clear();\n\n if (data.states) {\n for (const [key, messages] of Object.entries(data.states)) {\n const cache = messages.map((msg) => ({\n content: msg.content,\n sequence: msg.seq,\n }));\n this.conflationCaches.set(key, cache);\n }\n }\n }\n\n /**\n * Set new base message (legacy - for non-conflation channels)\n */\n setBase(message: string, sequence: number): void {\n this.baseMessage = message;\n this.baseSequence = sequence;\n this.lastSequence = sequence;\n }\n\n /**\n * Get base message for a conflation key at specific index\n * Note: baseIndex is the sequence number, not array index\n */\n getBaseMessage(\n conflationKeyValue?: string,\n baseIndex?: number,\n ): string | null {\n if (!this.conflationKey) {\n // Legacy mode: return single base\n return this.baseMessage;\n }\n\n const key = conflationKeyValue || '';\n const cache = this.conflationCaches.get(key);\n\n if (!cache || baseIndex === undefined) {\n console.error('[ChannelState] No cache or baseIndex undefined', {\n hasCache: !!cache,\n baseIndex,\n key,\n allCacheKeys: Array.from(this.conflationCaches.keys()),\n });\n return null;\n }\n\n // baseIndex is actually a sequence number, not an array index\n // Find the message with matching sequence number\n const message = cache.find((msg) => msg.sequence === baseIndex);\n\n if (!message) {\n console.error('[ChannelState] Could not find message with sequence', {\n searchingFor: baseIndex,\n cacheSize: cache.length,\n cacheSequences: cache.map((m) => m.sequence),\n key: conflationKeyValue,\n });\n return null;\n }\n\n return message.content;\n }\n\n /**\n * Add or update message in conflation cache\n */\n updateConflationCache(\n conflationKeyValue: string | undefined,\n message: string,\n sequence: number,\n ): void {\n const key = conflationKeyValue || '';\n let cache = this.conflationCaches.get(key);\n\n if (!cache) {\n cache = [];\n this.conflationCaches.set(key, cache);\n }\n\n // If sequence is not greater than the last cache item, clear the cache entirely\n if (cache.length > 0) {\n const lastCacheItem = cache[cache.length - 1];\n if (sequence <= lastCacheItem.sequence) {\n cache.length = 0;\n }\n }\n\n // Add message to cache\n cache.push({ content: message, sequence });\n\n // Enforce max size (FIFO eviction)\n while (cache.length > this.maxMessagesPerKey) {\n cache.shift();\n }\n }\n\n /**\n * Check if we have a valid base\n */\n hasBase(): boolean {\n if (this.conflationKey) {\n return this.conflationCaches.size > 0;\n }\n return this.baseMessage !== null && this.baseSequence !== null;\n }\n\n /**\n * Validate sequence number\n */\n isValidSequence(sequence: number): boolean {\n if (this.lastSequence === null) {\n return true; // First message\n }\n return sequence > this.lastSequence;\n }\n\n /**\n * Update sequence after processing a message\n */\n updateSequence(sequence: number): void {\n this.lastSequence = sequence;\n }\n\n /**\n * Record delta received\n */\n recordDelta(): void {\n this.deltaCount++;\n }\n\n /**\n * Record full message received\n */\n recordFullMessage(): void {\n this.fullMessageCount++;\n }\n\n /**\n * Get statistics\n */\n getStats(): ChannelDeltaStats {\n return {\n channelName: this.channelName,\n conflationKey: this.conflationKey,\n conflationGroupCount: this.conflationCaches.size,\n deltaCount: this.deltaCount,\n fullMessageCount: this.fullMessageCount,\n totalMessages: this.deltaCount + this.fullMessageCount,\n };\n }\n}\n","/*! (c) Dmitry Chestnykh, D. Richard Hipp | BSD License | https://github.com/dchest/fossil-delta-js/ */\n// Hash window width in bytes. Must be a power of two.\nconst NHASH = 16;\nclass RollingHash {\n a = 0; // hash (16-bit unsigned)\n b = 0; // values (16-bit unsigned)\n i = 0; // start of the hash window (16-bit unsigned)\n z = new Array(NHASH); // the values that have been hashed.\n // Initialize the rolling hash using the first NHASH bytes of\n // z at the given position.\n init(z, pos) {\n let a = 0, b = 0;\n for (let i = 0; i < NHASH; i++) {\n const x = z[pos + i];\n a = (a + x) & 0xffff;\n b = (b + (NHASH - i) * x) & 0xffff;\n this.z[i] = x;\n }\n this.a = a & 0xffff;\n this.b = b & 0xffff;\n this.i = 0;\n }\n // Advance the rolling hash by a single byte \"c\".\n next(c) {\n const old = this.z[this.i];\n this.z[this.i] = c;\n this.i = (this.i + 1) & (NHASH - 1);\n this.a = (this.a - old + c) & 0xffff;\n this.b = (this.b - NHASH * old + this.a) & 0xffff;\n }\n // Return a 32-bit hash value.\n value() {\n return ((this.a & 0xffff) | ((this.b & 0xffff) << 16)) >>> 0;\n }\n}\nconst zDigits = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~\"\n .split(\"\")\n .map(function (x) {\n return x.charCodeAt(0);\n});\nconst zValue = [\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1,\n -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, 36, -1, 37,\n 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,\n 57, 58, 59, 60, 61, 62, -1, -1, -1, 63, -1,\n];\n// Reader reads bytes, chars, ints from array.\nclass Reader {\n a;\n pos;\n constructor(array) {\n this.a = array; // source array\n this.pos = 0; // current position in array\n }\n haveBytes() {\n return this.pos < this.a.length;\n }\n getByte() {\n const b = this.a[this.pos];\n this.pos++;\n if (this.pos > this.a.length)\n throw new RangeError(\"out of bounds\");\n return b;\n }\n getChar() {\n return String.fromCharCode(this.getByte());\n }\n // Read base64-encoded unsigned integer.\n getInt() {\n let v = 0;\n let c;\n while (this.haveBytes() && (c = zValue[0x7f & this.getByte()]) >= 0) {\n v = (v << 6) + c;\n }\n this.pos--;\n return v >>> 0;\n }\n}\n// Write writes an array.\nclass Writer {\n a = [];\n toByteArray(sourceType) {\n if (Array.isArray(sourceType)) {\n return this.a;\n }\n return new Uint8Array(this.a);\n }\n putByte(b) {\n this.a.push(b & 0xff);\n }\n // Write an ASCII character (s is a one-char string).\n putChar(s) {\n this.putByte(s.charCodeAt(0));\n }\n // Write a base64 unsigned integer.\n putInt(v) {\n const zBuf = [];\n if (v === 0) {\n this.putChar(\"0\");\n return;\n }\n let i = 0;\n for (; v > 0; i++, v >>>= 6) {\n zBuf.push(zDigits[v & 0x3f]);\n }\n for (let j = i - 1; j >= 0; j--) {\n this.putByte(zBuf[j]);\n }\n }\n // Copy from array at start to end.\n putArray(a, start, end) {\n // TODO: optimize\n for (let i = start; i < end; i++)\n this.a.push(a[i]);\n }\n}\n// Return the number digits in the base64 representation of a positive integer.\nfunction digitCount(v) {\n let i, x;\n for (i = 1, x = 64; v >= x; i++, x <<= 6) {\n /* nothing */\n }\n return i;\n}\n// Return a 32-bit checksum of the array.\nfunction checksum(arr) {\n let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0, z = 0, N = arr.length;\n //TODO measure if this unrolling is helpful.\n while (N >= 16) {\n sum0 = (sum0 + arr[z + 0]) | 0;\n sum1 = (sum1 + arr[z + 1]) | 0;\n sum2 = (sum2 + arr[z + 2]) | 0;\n sum3 = (sum3 + arr[z + 3]) | 0;\n sum0 = (sum0 + arr[z + 4]) | 0;\n sum1 = (sum1 + arr[z + 5]) | 0;\n sum2 = (sum2 + arr[z + 6]) | 0;\n sum3 = (sum3 + arr[z + 7]) | 0;\n sum0 = (sum0 + arr[z + 8]) | 0;\n sum1 = (sum1 + arr[z + 9]) | 0;\n sum2 = (sum2 + arr[z + 10]) | 0;\n sum3 = (sum3 + arr[z + 11]) | 0;\n sum0 = (sum0 + arr[z + 12]) | 0;\n sum1 = (sum1 + arr[z + 13]) | 0;\n sum2 = (sum2 + arr[z + 14]) | 0;\n sum3 = (sum3 + arr[z + 15]) | 0;\n z += 16;\n N -= 16;\n }\n while (N >= 4) {\n sum0 = (sum0 + arr[z + 0]) | 0;\n sum1 = (sum1 + arr[z + 1]) | 0;\n sum2 = (sum2 + arr[z + 2]) | 0;\n sum3 = (sum3 + arr[z + 3]) | 0;\n z += 4;\n N -= 4;\n }\n sum3 = (((((sum3 + (sum2 << 8)) | 0) + (sum1 << 16)) | 0) + (sum0 << 24)) | 0;\n switch (N) {\n case 3:\n sum3 = (sum3 + (arr[z + 2] << 8)) | 0; /* falls through */\n case 2:\n sum3 = (sum3 + (arr[z + 1] << 16)) | 0; /* falls through */\n case 1:\n sum3 = (sum3 + (arr[z + 0] << 24)) | 0; /* falls through */\n }\n return sum3 >>> 0;\n}\n/**\n * Create a new delta array of bytes from source byte array to target byte array.\n */\nexport function createDelta(source, target) {\n const zDelta = new Writer();\n const lenOut = target.length;\n const lenSrc = source.length;\n let lastRead = -1;\n zDelta.putInt(lenOut);\n zDelta.putChar(\"\\n\");\n // If the source is very small, it means that we have no\n // chance of ever doing a copy command. Just output a single\n // literal segment for the entire target and exit.\n if (lenSrc <= NHASH) {\n zDelta.putInt(lenOut);\n zDelta.putChar(\":\");\n zDelta.putArray(target, 0, lenOut);\n zDelta.putInt(checksum(target));\n zDelta.putChar(\";\");\n return zDelta.toByteArray(source);\n }\n // Compute the hash table used to locate matching sections in the source.\n const nHash = Math.ceil(lenSrc / NHASH);\n const collide = new Array(nHash);\n const landmark = new Array(nHash);\n for (let i = 0; i < collide.length; i++) {\n collide[i] = -1;\n }\n for (let i = 0; i < landmark.length; i++) {\n landmark[i] = -1;\n }\n let hv;\n const h = new RollingHash();\n for (let i = 0; i < lenSrc - NHASH; i += NHASH) {\n h.init(source, i);\n hv = h.value() % nHash;\n collide[i / NHASH] = landmark[hv];\n landmark[hv] = i / NHASH;\n }\n let base = 0;\n let iSrc, iBlock, bestCnt, bestOfst, bestLitsz;\n while (base + NHASH < lenOut) {\n bestOfst = 0;\n bestLitsz = 0;\n h.init(target, base);\n let i = 0; // Trying to match a landmark against zOut[base+i]\n bestCnt = 0;\n while (1) {\n let limit = 250;\n hv = h.value() % nHash;\n iBlock = landmark[hv];\n while (iBlock >= 0 && limit-- > 0) {\n //\n // The hash window has identified a potential match against\n // landmark block iBlock. But we need to investigate further.\n //\n // Look for a region in zOut that matches zSrc. Anchor the search\n // at zSrc[iSrc] and zOut[base+i]. Do not include anything prior to\n // zOut[base] or after zOut[outLen] nor anything after zSrc[srcLen].\n //\n // Set cnt equal to the length of the match and set ofst so that\n // zSrc[ofst] is the first element of the match. litsz is the number\n // of characters between zOut[base] and the beginning of the match.\n // sz will be the overhead (in bytes) needed to encode the copy\n // command. Only generate copy command if the overhead of the\n // copy command is less than the amount of literal text to be copied.\n //\n let cnt, ofst, litsz;\n let j, k, x, y;\n let sz;\n // Beginning at iSrc, match forwards as far as we can.\n // j counts the number of characters that match.\n iSrc = iBlock * NHASH;\n for (j = 0, x = iSrc, y = base + i; x < lenSrc && y < lenOut; j++, x++, y++) {\n if (source[x] !== target[y])\n break;\n }\n j--;\n // Beginning at iSrc-1, match backwards as far as we can.\n // k counts the number of characters that match.\n for (k = 1; k < iSrc && k <= i; k++) {\n if (source[iSrc - k] !== target[base + i - k])\n break;\n }\n k--;\n // Compute the offset and size of the matching region.\n ofst = iSrc - k;\n cnt = j + k + 1;\n litsz = i - k; // Number of bytes of literal text before the copy\n // sz will hold the number of bytes needed to encode the \"insert\"\n // command and the copy command, not counting the \"insert\" text.\n sz = digitCount(i - k) + digitCount(cnt) + digitCount(ofst) + 3;\n if (cnt >= sz && cnt > bestCnt) {\n // Remember this match only if it is the best so far and it\n // does not increase the file size.\n bestCnt = cnt;\n bestOfst = iSrc - k;\n bestLitsz = litsz;\n }\n // Check the next matching block\n iBlock = collide[iBlock];\n }\n // We have a copy command that does not cause the delta to be larger\n // than a literal insert. So add the copy command to the delta.\n if (bestCnt > 0) {\n if (bestLitsz > 0) {\n // Add an insert command before the copy.\n zDelta.putInt(bestLitsz);\n zDelta.putChar(\":\");\n zDelta.putArray(target, base, base + bestLitsz);\n base += bestLitsz;\n }\n base += bestCnt;\n zDelta.putInt(bestCnt);\n zDelta.putChar(\"@\");\n zDelta.putInt(bestOfst);\n zDelta.putChar(\",\");\n if (bestOfst + bestCnt - 1 > lastRead) {\n lastRead = bestOfst + bestCnt - 1;\n }\n bestCnt = 0;\n break;\n }\n // If we reach this point, it means no match is found so far\n if (base + i + NHASH >= lenOut) {\n // We have reached the end and have not found any\n // matches. Do an \"insert\" for everything that does not match\n zDelta.putInt(lenOut - base);\n zDelta.putChar(\":\");\n zDelta.putArray(target, base, base + lenOut - base);\n base = lenOut;\n break;\n }\n // Advance the hash by one character. Keep looking for a match.\n h.next(target[base + i + NHASH]);\n i++;\n }\n }\n // Output a final \"insert\" record to get all the text at the end of\n // the file that does not match anything in the source.\n if (base < lenOut) {\n zDelta.putInt(lenOut - base);\n zDelta.putChar(\":\");\n zDelta.putArray(target, base, base + lenOut - base);\n }\n // Output the final checksum record.\n zDelta.putInt(checksum(target));\n zDelta.putChar(\";\");\n return zDelta.toByteArray(source);\n}\n/**\n * Return the size (in bytes) of the target from applying a delta.\n */\nexport function getDeltaTargetSize(delta) {\n const zDelta = new Reader(delta);\n const size = zDelta.getInt();\n if (zDelta.getChar() !== \"\\n\") {\n throw new Error(\"size integer not terminated by '\\\\n'\");\n }\n return size;\n}\n/**\n * Apply a delta byte array to a source byte array, returning the target byte array.\n */\nexport function applyDelta(source, delta, opts) {\n let limit, total = 0;\n const zDelta = new Reader(delta);\n const lenSrc = source.length;\n const lenDelta = delta.length;\n limit = zDelta.getInt();\n if (zDelta.getChar() !== \"\\n\")\n throw new Error(\"size integer not terminated by '\\\\n'\");\n const zOut = new Writer();\n while (zDelta.haveBytes()) {\n let cnt = zDelta.getInt();\n let ofst;\n switch (zDelta.getChar()) {\n case \"@\":\n ofst = zDelta.getInt();\n if (zDelta.haveBytes() && zDelta.getChar() !== \",\")\n throw new Error(\"copy command not terminated by ','\");\n total += cnt;\n if (total > limit)\n throw new Error(\"copy exceeds output file size\");\n if (ofst + cnt > lenSrc)\n throw new Error(\"copy extends past end of input\");\n zOut.putArray(source, ofst, ofst + cnt);\n break;\n case \":\":\n total += cnt;\n if (total > limit)\n throw new Error(\"insert command gives an output larger than predicted\");\n if (cnt > lenDelta)\n throw new Error(\"insert count exceeds size of delta\");\n zOut.putArray(zDelta.a, zDelta.pos, zDelta.pos + cnt);\n zDelta.pos += cnt;\n break;\n case \";\":\n const out = zOut.toByteArray(source);\n if ((!opts || opts.verifyChecksum !== false) && cnt !== checksum(out))\n throw new Error(\"bad checksum\");\n if (total !== limit)\n throw new Error(\"generated size does not match predicted size\");\n return out;\n default:\n throw new Error(\"unknown delta operator\");\n }\n }\n throw new Error(\"unterminated delta\");\n}\n/**\n * Create a new string delta from a source string to a target string.\n */\nexport function createStringDelta(source, target) {\n const deltaArray = createDelta(new TextEncoder().encode(source), new TextEncoder().encode(target));\n return new TextDecoder().decode(new Uint8Array(deltaArray));\n}\n/**\n * Apply a string delta to a source string, returning the target string.\n */\nexport function applyStringDelta(source, delta, opts) {\n const deltaArray = applyDelta(new TextEncoder().encode(source), new TextEncoder().encode(delta), opts);\n return new TextDecoder().decode(new Uint8Array(deltaArray));\n}\n/**\n * Return the size (in bytes) of the target from applying a delta string.\n * Note that the returned size is in UTF-8 encoded bytes, not string length.\n */\nexport function getStringDeltaTargetSize(delta) {\n const lineEnd = delta.indexOf(\"\\n\");\n if (lineEnd === -1) {\n throw new Error(\"size integer not terminated by '\\\\n'\");\n }\n const sizeLine = delta.slice(0, lineEnd + 1);\n const zDelta = new Reader(new TextEncoder().encode(sizeLine));\n const size = zDelta.getInt();\n if (zDelta.getChar() !== \"\\n\") {\n // This can happen if getInt didn't read the full line.\n throw new Error(\"size integer not terminated by '\\\\n'\");\n }\n return size;\n}\n","'use strict';\n/**\n * Takes in array of names of errors and returns an object mapping those names to error functions that take in one parameter that is used as the message for the error\n * @param names {[]}\n * @returns {{name1: function(message),...}}\n * @constructor\n */\nfunction CustomErrors(names) {\n let errors = {};\n names.forEach(name => {\n let CustomError = function CustomError(message) {\n var temp = Error.apply(this, arguments);\n temp.name = this.name = name;\n this.stack = temp.stack;\n this.message = temp.message;\n this.name = name;\n this.message = message;\n };\n CustomError.prototype = Object.create(Error.prototype, {\n constructor: {\n value: CustomError,\n writable: true,\n configurable: true\n }\n });\n errors[name] = CustomError;\n });\n return errors;\n}\n\nexport default /* @__PURE__ */ CustomErrors(['NotImplemented', 'InvalidDelta']);\n","'use strict';\n\nexport function uint8ArrayToString(uintArray) {\n let encodedString = String.fromCharCode.apply(null, uintArray);\n let decodedString = decodeURIComponent(escape(encodedString));\n return decodedString;\n}\n\nexport function stringToUint8Array(str) {\n var buf = new Uint8Array(str.length);\n for (var i=0, strLen=str.length; i < strLen; i++) {\n buf[i] = str.charCodeAt(i);\n }\n return buf;\n}\n\nexport function equal(typedArray1, typedArray2) {\n if (typedArray1.length !== typedArray2.length) {\n return false;\n }\n for (let i = 0; i < typedArray1.length; i++) {\n if (typedArray1[i] !== typedArray2[i]) {\n return false;\n }\n }\n return true;\n}\n\nexport class TypedArrayList {\n constructor() {\n this.typedArrays = [];\n this.startIndexes = [];\n this.length = 0;\n }\n\n add(typedArray) {\n let typedArrayTypes = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n Int32Array, Uint32Array, Float32Array, Float64Array];\n\n let matchingTypedArrayTypes = typedArrayTypes.filter(typedArrayType => typedArray instanceof typedArrayType);\n if (matchingTypedArrayTypes.length < 1) {\n throw Error('Given ' + typeof typedArray + ' when expected a TypedArray');\n }\n\n let startIndex;\n if (this.typedArrays.length === 0) {\n startIndex = 0;\n }\n else {\n let lastIndex = this.startIndexes.length - 1;\n let lastStartIndex = this.startIndexes[lastIndex];\n let lastLength = this.typedArrays[lastIndex].length;\n startIndex = lastStartIndex + lastLength;\n }\n\n this.startIndexes.push(startIndex);\n this.typedArrays.push(typedArray);\n this.length += startIndex + typedArray.length;\n };\n\n get(index) {\n let listIndex = getIndex(this.startIndexes, index);\n let typedArray = index - this.startIndexes[listIndex];\n return this.typedArrays[listIndex][typedArray];\n };\n\n set(index, value) {\n if (typeof index !== 'number' || isNaN(index)) {\n throw new Error('Given non-number index: ' + index);\n }\n //console.log(index);\n\n let listIndex = getIndex(this.startIndexes, index);\n let typedArrayIndex = index - this.startIndexes[listIndex];\n this.typedArrays[listIndex][typedArrayIndex] = value;\n };\n}\n\nfunction getIndex(arr, element) {\n // Performance optimization for most common case\n if (arr.length === 2) {\n return element < arr[1] ? 0 : 1;\n }\n\n let low = 0;\n let high = arr.length - 1;\n\n while (low < high) {\n let mid = Math.floor((low + high) / 2);\n\n if (arr[mid] === element) {\n return mid;\n }\n else if (arr[mid] < element) {\n low = mid + 1;\n }\n else {\n high = mid - 1;\n }\n }\n if (arr[high] > element) {\n return high - 1;\n }\n else {\n return high;\n }\n}\n","'use strict';\n\n/**\n * Converts RFC 3284 definition of integer in buffer to decimal\n * Also returns the index of the byte after the integer\n * @param buffer {Uint8Array}\n * @param position {Number}\n * @returns {{position: {Number}, value: {Number}}}\n */\nexport default function integer(buffer, position) {\n const result = { position, value: 0 };\n\n do {\n /* Shift the existing value left for 7 bits (base127 conversion)\n and merge it with the next value without its highest bit */\n result.value = (result.value << 7) | (buffer[result.position] & 127);\n\n /* Avoid Number overflows */\n if (result.value < 0) {\n throw new Error('RFC 3284 Integer conversion: Buffer overflow');\n }\n } while (buffer[result.position++] & 128);\n\n return result;\n}\n","'use strict';\n\nimport deserializeInteger from './deserialize/integer';\nimport * as TypedArray from './typed_array_util';\n\nclass ADD {\n constructor(size) {\n this.size = size;\n }\n\n name = 'ADD';\n\n execute(delta) {\n for (let i = 0; i < this.size; i++) {\n delta.U.set(delta.UTargetPosition + i, delta.data[delta.dataPosition + i]);\n }\n delta.dataPosition += this.size;\n delta.UTargetPosition += this.size;\n };\n}\n\nclass COPY {\n constructor(size, mode) {\n this.size = size;\n this.mode = mode;\n }\n\n name = 'COPY';\n\n execute(delta) {\n let address, m, next, method;\n\n if (this.mode === 0) {\n address = delta.getNextAddressInteger();\n }\n else if (this.mode === 1) {\n next = delta.getNextAddressInteger();\n address = delta.UTargetPosition - next;\n }\n else if ((m = this.mode - 2) >= 0 && (m < delta.nearCache.size)) {\n next = delta.getNextAddressInteger();\n address = delta.nearCache.get(m, next);\n method = 'near';\n }\n // same cache\n else {\n m = this.mode - (2 + delta.nearCache.size);\n next = delta.getNextAddressByte();\n address = delta.sameCache.get(m, next);\n method = 'same';\n }\n\n delta.nearCache.update(address);\n delta.sameCache.update(address);\n\n for (let i = 0; i < this.size; i++) {\n delta.U.set(delta.UTargetPosition + i, delta.U.get(address + i));\n }\n\n delta.UTargetPosition += this.size;\n }\n};\n\nclass RUN {\n constructor(size) {\n this.size = size;\n }\n\n name = 'RUN';\n\n execute(delta) {\n for (let i = 0; i < this.size; i++) {\n // repeat single byte\n delta.U.set(delta.UTargetPosition + i, delta.data[delta.dataPosition]);\n }\n // increment to next byte\n delta.dataPosition++;\n delta.UTargetPosition += this.size;\n };\n}\n\nlet instructions = {\n ADD,\n COPY,\n RUN\n};\n\nexport default instructions;\n","'use strict';\n\nimport instructions from './instructions';\nimport deserializeInteger from './deserialize/integer';\n\nexport default function tokenizeInstructions(instructionsBuffer) {\n let deserializedInstructions = [];\n\n let instructionsPosition = 0;\n\n while (instructionsPosition < instructionsBuffer.length) {\n let index = instructionsBuffer[instructionsPosition++];\n\n let addSize, copySize, size;\n\n if (index === 0) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.RUN(size));\n }\n else if (index === 1) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.ADD(size));\n }\n else if (index < 19) {\n deserializedInstructions.push(new instructions.ADD(index - 1));\n }\n else if (index === 19) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 0));\n }\n else if (index < 35) {\n deserializedInstructions.push(new instructions.COPY(index - 16, 0));\n }\n else if (index === 35) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 1));\n }\n else if (index < 51) {\n deserializedInstructions.push(new instructions.COPY(index - 32, 1));\n }\n else if (index === 51) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 2));\n }\n else if (index < 67) {\n deserializedInstructions.push(new instructions.COPY(index - 48, 2));\n }\n else if (index === 67) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 3));\n }\n else if (index < 83) {\n deserializedInstructions.push(new instructions.COPY(index - 64, 3));\n }\n else if (index === 83) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 4));\n }\n else if (index < 99) {\n deserializedInstructions.push(new instructions.COPY(index - 80, 4));\n }\n else if (index === 99) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 5));\n }\n else if (index < 115) {\n deserializedInstructions.push(new instructions.COPY(index - 96, 5));\n }\n else if (index === 115) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 6));\n }\n else if (index < 131) {\n deserializedInstructions.push(new instructions.COPY(index - 112, 6));\n }\n else if (index === 131) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 7));\n }\n else if (index < 147) {\n deserializedInstructions.push(new instructions.COPY(index - 128, 7));\n }\n else if (index === 147) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 8));\n }\n else if (index < 163) {\n deserializedInstructions.push(new instructions.COPY(index - 144, 8));\n }\n else if (index < 175) {\n ({addSize, copySize} = ADD_COPY(index, 163));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 0));\n }\n else if (index < 187) {\n ({addSize, copySize} = ADD_COPY(index, 175));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 1));\n }\n else if (index < 199) {\n ({addSize, copySize} = ADD_COPY(index, 187));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 2));\n }\n else if (index < 211) {\n ({addSize, copySize} = ADD_COPY(index, 199));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 3));\n }\n else if (index < 223) {\n ({addSize, copySize} = ADD_COPY(index, 211));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 4));\n }\n else if (index < 235) {\n ({addSize, copySize} = ADD_COPY(index, 223));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 5));\n }\n else if (index < 239) {\n deserializedInstructions.push(new instructions.ADD(index - 235 + 1));\n deserializedInstructions.push(new instructions.COPY(4, 6));\n }\n else if (index < 243) {\n deserializedInstructions.push(new instructions.ADD(index - 239 + 1));\n deserializedInstructions.push(new instructions.COPY(4, 7));\n }\n else if (index < 247) {\n deserializedInstructions.push(new instructions.ADD(index - 243 + 1));\n deserializedInstructions.push(new instructions.COPY(4, 8));\n }\n else if (index < 256) {\n deserializedInstructions.push(new instructions.COPY(4, index - 247));\n deserializedInstructions.push(new instructions.ADD(1));\n }\n else {\n throw new Error('Should not get here');\n }\n }\n\n return deserializedInstructions;\n}\n\nfunction ADD_COPY(index, baseIndex) {\n let zeroBased = index - baseIndex;\n\n // 0,1,2 -> 0 3,4,5 -> 1 etc.\n let addSizeIndex = Math.floor(zeroBased / 3);\n // offset so size starts at 1\n let addSize = addSizeIndex + 1;\n\n // rotate through 0, 1, and 2\n let copySizeIndex = zeroBased % 3;\n // offset so size starts at 4\n let copySize = copySizeIndex + 4;\n\n return {addSize, copySize};\n}\n","'use strict';\n\nimport errors from '../errors';\nimport deserializeInteger from './integer';\nimport tokenizeInstructions from '../tokenize_instructions';\n\nexport default function delta(delta, position) {\n\n let targetWindowLength, dataLength, instructionsLength, addressesLength;\n\n // parentheses are needed for assignment destructuring\n ({ value: targetWindowLength, position } = deserializeInteger(delta, position));\n\n // Delta_Indicator byte\n if (delta[position] !== 0) {\n throw new errors.NotImplemented(\n 'VCD_DECOMPRESS is not supported, Delta_Indicator must be zero at byte ' + position + ' and not ' + delta[position]\n );\n }\n position++;\n\n ({ value: dataLength, position } = deserializeInteger(delta, position));\n ({ value: instructionsLength, position } = deserializeInteger(delta, position));\n ({ value: addressesLength, position } = deserializeInteger(delta, position));\n\n let dataNextPosition = position + dataLength;\n let data = delta.slice(position, dataNextPosition);\n\n let instructionsNextPosition = dataNextPosition + instructionsLength;\n let instructions = delta.slice(dataNextPosition, instructionsNextPosition);\n let deserializedInstructions = tokenizeInstructions(instructions);\n\n let addressesNextPosition = instructionsNextPosition + addressesLength;\n let addresses = delta.slice(instructionsNextPosition, addressesNextPosition);\n\n position = addressesNextPosition;\n\n let window = {\n targetWindowLength,\n position,\n data,\n instructions: deserializedInstructions,\n addresses\n };\n\n return window;\n}\n","'use strict';\n\nexport default class NearCache {\n constructor(size) {\n this.size = size;\n this.near = new Array(this.size).fill(0);\n this.nextSlot = 0;\n }\n\n update(address) {\n if (this.near.length > 0) {\n this.near[this.nextSlot] = address;\n this.nextSlot = (this.nextSlot + 1) % this.near.length;\n }\n }\n\n get(m, offset) {\n let address = this.near[m] + offset;\n return address;\n };\n}\n","'use strict';\n\nexport default class SameCache {\n constructor(size) {\n this.size = size;\n this.same = new Array(this.size * 256).fill(0);\n }\n\n update(address) {\n if (this.same.length > 0) {\n this.same[address % (this.size * 256)] = address;\n }\n };\n\n get(m, offset) {\n let address = this.same[m * 256 + offset];\n return address;\n };\n}\n","'use strict';\n\nimport errors from './errors';\nimport * as TypedArray from './typed_array_util';\nimport deserializeInteger from './deserialize/integer';\nimport deserializeDelta from './deserialize/delta';\nimport NearCache from './address_caches/near';\nimport SameCache from './address_caches/same';\n\n/**\n *\n * @param delta {Uint8Array}\n * @param source {Uint8Array}\n * @constructor\n */\nexport default class VCDiff {\n constructor(delta, source) {\n this.delta = delta;\n this.position = 0;\n this.source = source;\n this.targetWindows = new TypedArray.TypedArrayList();\n }\n\n decode() {\n this._consumeHeader();\n while (this._consumeWindow()) {}\n\n let targetLength = this.targetWindows.typedArrays.reduce((sum, uint8Array) => uint8Array.length + sum, 0);\n let target = new Uint8Array(targetLength);\n let position = 0;\n\n // concat all uint8arrays\n for (let arrayNum = 0; arrayNum < this.targetWindows.typedArrays.length; arrayNum++) {\n let array = this.targetWindows.typedArrays[arrayNum];\n let length = array.length;\n target.set(array, position);\n position += length;\n }\n\n return target;\n };\n\n _consumeHeader() {\n\n let hasVCDiffHeader = this.delta[0] === 214 && // V\n this.delta[1] === 195 && // C\n this.delta[2] === 196 && // D\n this.delta[3] === 0; // \\0\n\n if (!hasVCDiffHeader) {\n throw new errors.InvalidDelta('first 3 bytes not VCD');\n }\n\n let hdrIndicator = this.delta[4];\n // extract least significant bit\n let vcdDecompress = 1 & hdrIndicator;\n // extract second least significant bit\n let vcdCodetable = 1 & (hdrIndicator >> 1);\n\n // verify not using Hdr_Indicator\n if (vcdDecompress || vcdCodetable) {\n throw new errors.NotImplemented(\n 'non-zero Hdr_Indicator (VCD_DECOMPRESS or VCD_CODETABLE bit is set)'\n );\n }\n\n this.position += 5;\n };\n\n _consumeWindow() {\n let winIndicator = this.delta[this.position++];\n\n // extract least significant bit\n let vcdSource = 1 & winIndicator;\n // extract second least significant bit\n let vcdTarget = 1 & (winIndicator >> 1);\n\n if (vcdSource && vcdTarget) {\n throw new errors.InvalidDelta(\n 'VCD_SOURCE and VCD_TARGET cannot both be set in Win_Indicator'\n )\n }\n else if (vcdSource) {\n let sourceSegmentLength, sourceSegmentPosition, deltaLength;\n ({ value: sourceSegmentLength, position: this.position } = deserializeInteger(this.delta, this.position));\n ({ value: sourceSegmentPosition, position: this.position } = deserializeInteger(this.delta, this.position));\n ({ value: deltaLength, position: this.position } = deserializeInteger(this.delta, this.position));\n\n let sourceSegment = this.source.slice(sourceSegmentPosition, sourceSegmentPosition + sourceSegmentLength);\n this._buildTargetWindow(this.position, sourceSegment);\n this.position += deltaLength;\n }\n else if (vcdTarget) {\n throw new errors.NotImplemented(\n 'non-zero VCD_TARGET in Win_Indicator'\n )\n }\n else {\n let deltaLength;\n ({ value: deltaLength, position: this.position } = deserializeInteger(this.delta, this.position));\n\n this._buildTargetWindow(this.position);\n this.position += deltaLength;\n }\n\n return this.position < this.delta.length;\n };\n\n // first integer is target window length\n _buildTargetWindow(position, sourceSegment) {\n let window = deserializeDelta(this.delta, position);\n\n let T = new Uint8Array(window.targetWindowLength);\n\n let U = new TypedArray.TypedArrayList();\n let uTargetPosition = 0;\n if (sourceSegment) {\n U.add(sourceSegment);\n uTargetPosition = sourceSegment.length;\n }\n U.add(T);\n\n let targetPosition = this.source.length;\n let dataPosition = 0;\n\n let delta = new Delta(U, uTargetPosition, window.data, window.addresses);\n window.instructions.forEach(instruction => {\n instruction.execute(delta);\n });\n\n this.targetWindows.add(T);\n };\n}\n\nclass Delta {\n constructor(U, UTargetPosition, data, addresses) {\n this.U = U;\n this.UTargetPosition = UTargetPosition;\n this.data = data;\n this.dataPosition = 0;\n this.addresses = addresses;\n this.addressesPosition = 0;\n this.nearCache = new NearCache(4);\n this.sameCache = new SameCache(3);\n }\n\n getNextAddressInteger() {\n let value;\n // get next address and increase the address position for the next address\n ({value, position: this.addressesPosition } = deserializeInteger(this.addresses, this.addressesPosition));\n return value;\n };\n\n getNextAddressByte() {\n // get next address and increase the address position for the next address\n let value = this.addresses[this.addressesPosition++];\n return value;\n };\n}\n","'use strict';\n\nimport VCDiff from './vcdiff';\n\n/**\n * Vcdiff decode, applying delta to source and returning the result.\n * \n * @param delta {Uint8Array} The Vcdiff format diff/patch to apply to source.\n * @param source {Uint8Array} The source to apply the delta diff/patch to.\n * @returns {Uint8Array} The result of applying delta to source.\n */\nexport function decode(delta, source) {\n let vcdiff = new VCDiff(delta, source);\n return vcdiff.decode();\n}\n","/**\n * Delta Decoders for Fossil and Xdelta3 algorithms\n */\n\nimport { applyDelta as fossilApplyDelta } from 'fossil-delta';\nimport { decode as vcdiffDecode } from '@ably/vcdiff-decoder';\n\n// Also check for globals (for browser builds without bundler)\nconst fossilDeltaGlobal =\n typeof window !== 'undefined' ? (window as any).fossilDelta : undefined;\nconst vcdiffGlobal =\n typeof window !== 'undefined' ? (window as any).vcdiff : undefined;\n\n/**\n * Base64 decode a string to Uint8Array\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to string\n */\nfunction bytesToString(bytes: Uint8Array | number[]): string {\n // Handle array-like objects that might not be proper Uint8Array\n if (Array.isArray(bytes) || !(bytes instanceof Uint8Array)) {\n bytes = new Uint8Array(bytes);\n }\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * Convert string to Uint8Array\n */\nfunction stringToBytes(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/**\n * Fossil Delta decoder\n */\nexport class FossilDeltaDecoder {\n static isAvailable(): boolean {\n return (\n typeof fossilApplyDelta !== 'undefined' ||\n (typeof fossilDeltaGlobal !== 'undefined' && fossilDeltaGlobal.apply)\n );\n }\n\n static apply(base: string | Uint8Array, delta: string | Uint8Array): string {\n if (!this.isAvailable()) {\n throw new Error('Fossil Delta library not loaded');\n }\n\n const baseBytes = typeof base === 'string' ? stringToBytes(base) : base;\n const deltaBytes = typeof delta === 'string' ? stringToBytes(delta) : delta;\n\n try {\n let result: Uint8Array;\n\n // Try ES6 import first\n if (typeof fossilApplyDelta !== 'undefined') {\n result = fossilApplyDelta(baseBytes, deltaBytes);\n }\n // Fall back to global\n else if (fossilDeltaGlobal && fossilDeltaGlobal.apply) {\n result = fossilDeltaGlobal.apply(baseBytes, deltaBytes);\n } else {\n throw new Error('No fossil-delta implementation found');\n }\n\n return bytesToString(result);\n } catch (error) {\n throw new Error(\n `Fossil delta decode failed: ${(error as Error).message} (base=${baseBytes.length}B delta=${deltaBytes.length}B)`,\n );\n }\n }\n}\n\n/**\n * Xdelta3 (VCDIFF) decoder\n */\nexport class Xdelta3Decoder {\n static isAvailable(): boolean {\n return (\n typeof vcdiffDecode !== 'undefined' ||\n (typeof vcdiffGlobal !== 'undefined' && vcdiffGlobal.decode)\n );\n }\n\n static apply(base: string | Uint8Array, delta: string | Uint8Array): string {\n if (!this.isAvailable()) {\n throw new Error('Xdelta3/VCDIFF library not loaded');\n }\n\n const baseBytes = typeof base === 'string' ? stringToBytes(base) : base;\n const deltaBytes = typeof delta === 'string' ? stringToBytes(delta) : delta;\n\n try {\n let result: Uint8Array;\n\n // Try ES6 import first\n if (typeof vcdiffDecode !== 'undefined') {\n // @ably/vcdiff-decoder API: decode(delta, source)\n result = vcdiffDecode(deltaBytes, baseBytes);\n }\n // Fall back to global\n else if (vcdiffGlobal && vcdiffGlobal.decode) {\n result = vcdiffGlobal.decode(deltaBytes, baseBytes);\n } else {\n throw new Error('No VCDIFF decoder implementation found');\n }\n\n return bytesToString(result);\n } catch (error) {\n throw new Error(\n `Xdelta3 decode failed: ${(error as Error).message} (base=${baseBytes.length}B delta=${deltaBytes.length}B)`,\n );\n }\n }\n}\n\nexport { base64ToBytes, bytesToString, stringToBytes };\n","/**\n * Delta Compression Manager\n *\n * Handles delta compression for Pusher messages with support for:\n * - Multiple delta algorithms (Fossil, Xdelta3)\n * - Conflation keys for efficient per-entity caching\n * - Bandwidth statistics tracking\n */\n\nimport Logger from '../logger';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport ChannelState from './channel_state';\nimport { FossilDeltaDecoder, Xdelta3Decoder, base64ToBytes } from './decoders';\nimport {\n DeltaOptions,\n DeltaStats,\n DeltaMessage,\n DeltaAlgorithm,\n CacheSyncData,\n} from './types';\n\nexport default class DeltaCompressionManager {\n private options: Required<DeltaOptions>;\n private enabled: boolean;\n private channelStates: Map<string, ChannelState>;\n private stats: {\n totalMessages: number;\n deltaMessages: number;\n fullMessages: number;\n totalBytesWithoutCompression: number;\n totalBytesWithCompression: number;\n errors: number;\n };\n private availableAlgorithms: DeltaAlgorithm[];\n private sendEventCallback: (event: string, data: any) => boolean;\n\n constructor(\n options: DeltaOptions = {},\n sendEventCallback: (event: string, data: any) => boolean,\n ) {\n this.options = {\n enabled: options.enabled !== false,\n algorithms: options.algorithms || ['fossil', 'xdelta3'],\n debug: options.debug || false,\n onStats: options.onStats || null,\n onError: options.onError || null,\n };\n\n this.enabled = false;\n this.channelStates = new Map();\n this.stats = {\n totalMessages: 0,\n deltaMessages: 0,\n fullMessages: 0,\n totalBytesWithoutCompression: 0,\n totalBytesWithCompression: 0,\n errors: 0,\n };\n\n this.sendEventCallback = sendEventCallback;\n this.availableAlgorithms = this.detectAvailableAlgorithms();\n\n if (this.availableAlgorithms.length === 0) {\n Logger.warn(\n '[DeltaCompression] No delta algorithms available. ' +\n 'Please include fossil-delta or vcdiff-decoder libraries.',\n );\n }\n }\n\n /**\n * Detect which algorithm libraries are loaded\n */\n private detectAvailableAlgorithms(): DeltaAlgorithm[] {\n const available: DeltaAlgorithm[] = [];\n\n if (FossilDeltaDecoder.isAvailable()) {\n available.push('fossil');\n this.log('Fossil Delta decoder available');\n }\n\n if (Xdelta3Decoder.isAvailable()) {\n available.push('xdelta3');\n this.log('Xdelta3 decoder available');\n }\n\n return available;\n }\n\n /**\n * Enable delta compression\n */\n enable(): void {\n if (this.enabled || !this.options.enabled) {\n return;\n }\n\n if (this.availableAlgorithms.length === 0) {\n this.log('No delta algorithms available, cannot enable');\n return;\n }\n\n // Filter to only algorithms we support AND want to use\n const supportedAlgorithms = this.availableAlgorithms.filter((algo) =>\n this.options.algorithms.includes(algo),\n );\n\n if (supportedAlgorithms.length === 0) {\n this.log('No mutually supported algorithms');\n return;\n }\n\n // Send enable request\n this.log('Sending enable request', supportedAlgorithms);\n this.sendEventCallback('pusher:enable_delta_compression', {\n algorithms: supportedAlgorithms,\n });\n }\n\n /**\n * Disable delta compression\n * Note: We intentionally do NOT clear channelStates here.\n * This allows state to be preserved across enable/disable cycles,\n * which is important for reconnection scenarios and user toggling.\n * Use clearChannelState() if you need to explicitly clear state.\n */\n disable(): void {\n this.enabled = false;\n }\n\n /**\n * Handle delta compression enabled confirmation\n */\n handleEnabled(data: any): void {\n this.enabled = data.enabled || true;\n this.log('Delta compression enabled', data);\n }\n\n /**\n * Handle cache sync message (conflation keys)\n */\n handleCacheSync(channel: string, data: CacheSyncData): void {\n this.log('Received cache sync', {\n channel,\n conflationKey: data.conflation_key,\n groupCount: Object.keys(data.states || {}).length,\n });\n\n let channelState = this.channelStates.get(channel);\n if (!channelState) {\n channelState = new ChannelState(channel);\n this.channelStates.set(channel, channelState);\n }\n\n channelState.initializeFromCacheSync(data);\n this.log('Cache initialized', channelState.getStats());\n }\n\n /**\n * Handle delta-compressed message\n */\n handleDeltaMessage(\n channel: string,\n deltaData: DeltaMessage,\n ): PusherEvent | null {\n let deltaBytes: Uint8Array | null = null;\n\n try {\n const event = deltaData.event;\n const delta = deltaData.delta;\n const sequence = deltaData.seq;\n const algorithm = deltaData.algorithm || 'fossil';\n const conflationKey = deltaData.conflation_key;\n const baseIndex = deltaData.base_index;\n\n this.log('Received delta message', {\n channel,\n event,\n sequence,\n algorithm,\n conflationKey,\n baseIndex,\n deltaSize: delta.length,\n });\n\n // Get channel state\n let channelState = this.channelStates.get(channel);\n if (!channelState) {\n // Silently ignore - this is likely an in-flight delta message for an unsubscribed channel\n // No need to log errors or request resync since the channel is gone\n this.log(`Ignoring delta for unsubscribed channel: ${channel}`);\n return null;\n }\n\n // Get base message\n let baseMessage: string | null;\n if (channelState.conflationKey) {\n baseMessage = channelState.getBaseMessage(conflationKey, baseIndex);\n if (!baseMessage) {\n this.error(\n `No base message for channel ${channel}, key ${conflationKey}, index ${baseIndex}`,\n );\n if (this.options.debug) {\n this.log('Current conflation cache snapshot', {\n channel,\n conflationKey: channelState.conflationKey,\n cacheSizes: Array.from(\n channelState.conflationCaches.entries(),\n ).map(([key, cache]) => ({ key, size: cache.length })),\n });\n }\n this.requestResync(channel);\n return null;\n }\n } else {\n baseMessage = channelState.baseMessage;\n if (!baseMessage) {\n this.error(`No base message for channel ${channel}`);\n if (this.options.debug) {\n this.log('Channel state missing base', {\n channel,\n lastSequence: channelState.lastSequence,\n });\n }\n this.requestResync(channel);\n return null;\n }\n }\n\n // Decode base64 delta\n deltaBytes = base64ToBytes(delta);\n\n // Apply delta based on algorithm\n let reconstructedMessage: string;\n try {\n if (algorithm === 'fossil') {\n reconstructedMessage = FossilDeltaDecoder.apply(\n baseMessage,\n deltaBytes,\n );\n } else if (algorithm === 'xdelta3') {\n reconstructedMessage = Xdelta3Decoder.apply(baseMessage, deltaBytes);\n } else {\n throw Error(`Unknown algorithm: ${algorithm}`);\n }\n } catch (decodeError) {\n throw decodeError;\n }\n\n // Update conflation cache with reconstructed message\n if (channelState.conflationKey) {\n channelState.updateConflationCache(\n conflationKey,\n reconstructedMessage,\n sequence,\n );\n } else {\n // Update base for non-conflation channels\n channelState.setBase(reconstructedMessage, sequence);\n }\n\n // Update state\n channelState.updateSequence(sequence);\n channelState.recordDelta();\n\n // Update stats\n this.stats.totalMessages++;\n this.stats.deltaMessages++;\n this.stats.totalBytesWithCompression += deltaBytes.length;\n this.stats.totalBytesWithoutCompression += reconstructedMessage.length;\n this.updateStats();\n\n this.log('Delta applied successfully', {\n channel,\n event,\n conflationKey,\n originalSize: reconstructedMessage.length,\n deltaSize: deltaBytes.length,\n compressionRatio:\n ((deltaBytes.length / reconstructedMessage.length) * 100).toFixed(1) +\n '%',\n });\n\n // Parse and return the reconstructed event\n try {\n const parsedMessage = JSON.parse(reconstructedMessage);\n return {\n event: event,\n channel: channel,\n data: parsedMessage.data || parsedMessage,\n };\n } catch (e) {\n // If not JSON, return as-is\n return {\n event: event,\n channel: channel,\n data: reconstructedMessage,\n };\n }\n } catch (error) {\n this.error('Delta decode failed', {\n channel,\n event: deltaData.event,\n sequence: deltaData.seq,\n algorithm: deltaData.algorithm,\n conflationKey: deltaData.conflation_key,\n baseIndex: deltaData.base_index,\n deltaSize: deltaData.delta?.length,\n decodedDeltaBytes: deltaBytes ? deltaBytes.length : 'n/a',\n message: (error as Error).message,\n });\n this.stats.errors++;\n return null;\n }\n }\n\n /**\n * Handle regular (full) message with delta sequence markers\n */\n handleFullMessage(\n channel: string,\n rawMessage: string,\n sequence?: number,\n conflationKey?: string,\n ): void {\n if (!sequence && sequence !== 0) {\n // Attempt to extract __delta_seq from payload when not provided separately\n try {\n const parsed = JSON.parse(rawMessage);\n const candidate =\n typeof parsed.data === 'string'\n ? (JSON.parse(parsed.data).__delta_seq ?? parsed.__delta_seq)\n : (parsed.data?.__delta_seq ?? parsed.__delta_seq);\n if (candidate === 0 || candidate) {\n sequence = candidate;\n } else {\n this.log('handleFullMessage missing sequence, skipping', {\n channel,\n hasSequence: false,\n });\n return;\n }\n } catch (e) {\n this.log('handleFullMessage missing sequence and parse failed', {\n channel,\n hasSequence: false,\n });\n return;\n }\n }\n\n const messageSize = rawMessage.length;\n\n let channelState = this.channelStates.get(channel);\n if (!channelState) {\n channelState = new ChannelState(channel);\n this.channelStates.set(channel, channelState);\n }\n\n // The rawMessage is already stripped of __delta_seq and __conflation_key by pusher.ts\n // We use it directly as the base - NO re-parsing/re-stringifying to preserve exact bytes\n // (JSON.parse/stringify can change float representations which breaks delta checksums)\n\n // Use the provided conflationKey parameter (already extracted by pusher.ts from original message)\n const finalConflationKey = conflationKey;\n\n // Initialize conflation if we have a conflation key\n if (finalConflationKey !== undefined && !channelState.conflationKey) {\n channelState.conflationKey = 'enabled';\n }\n\n if (channelState.conflationKey && finalConflationKey !== undefined) {\n channelState.updateConflationCache(\n finalConflationKey,\n rawMessage, // Store raw message directly\n sequence,\n );\n this.log('Stored full message (conflation)', {\n channel,\n conflationKey: finalConflationKey,\n sequence,\n size: messageSize,\n });\n } else {\n channelState.setBase(rawMessage, sequence); // Store raw message directly\n this.log('Stored full message', {\n channel,\n sequence,\n size: messageSize,\n });\n }\n\n channelState.recordFullMessage();\n\n // Update stats\n this.stats.totalMessages++;\n this.stats.fullMessages++;\n this.stats.totalBytesWithoutCompression += messageSize;\n this.stats.totalBytesWithCompression += messageSize;\n this.updateStats();\n }\n\n /**\n * Request resync for a channel\n */\n private requestResync(channel: string): void {\n this.log('Requesting resync for channel', channel);\n this.sendEventCallback('pusher:delta_sync_error', { channel });\n this.channelStates.delete(channel);\n }\n\n /**\n * Update and emit stats\n */\n private updateStats(): void {\n if (this.options.onStats) {\n this.options.onStats(this.getStats());\n }\n }\n\n /**\n * Get current statistics\n */\n getStats(): DeltaStats {\n const bandwidthSaved =\n this.stats.totalBytesWithoutCompression -\n this.stats.totalBytesWithCompression;\n const bandwidthSavedPercent =\n this.stats.totalBytesWithoutCompression > 0\n ? (bandwidthSaved / this.stats.totalBytesWithoutCompression) * 100\n : 0;\n\n const channelStats = Array.from(this.channelStates.values()).map((state) =>\n state.getStats(),\n );\n\n return {\n ...this.stats,\n bandwidthSaved,\n bandwidthSavedPercent,\n channelCount: this.channelStates.size,\n channels: channelStats,\n };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalMessages: 0,\n deltaMessages: 0,\n fullMessages: 0,\n totalBytesWithoutCompression: 0,\n totalBytesWithCompression: 0,\n errors: 0,\n };\n this.updateStats();\n }\n\n /**\n * Clear channel state\n */\n clearChannelState(channel?: string): void {\n if (channel) {\n this.channelStates.delete(channel);\n } else {\n this.channelStates.clear();\n }\n }\n\n /**\n * Check if delta compression is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Get available algorithms\n */\n getAvailableAlgorithms(): DeltaAlgorithm[] {\n return this.availableAlgorithms;\n }\n\n /**\n * Log message (if debug enabled)\n */\n private log(...args: any[]): void {\n if (this.options.debug) {\n Logger.debug('[DeltaCompression]', ...args);\n }\n }\n\n /**\n * Log error\n */\n private error(...args: any[]): void {\n Logger.error('[DeltaCompression]', ...args);\n if (this.options.onError) {\n this.options.onError(args);\n }\n }\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, { setLoggerConfig } from './logger';\nimport Factory from './utils/factory';\nimport UrlStore from 'core/utils/url_store';\nimport { Options, validateOptions } from './options';\nimport { Config, getConfig } from './config';\nimport StrategyOptions from './strategies/strategy_options';\nimport UserFacade from './user';\nimport DeltaCompressionManager from './delta/manager';\nimport { DeltaStats } from './delta/types';\nimport { Filter, validateFilter, FilterExamples } from './channels/filter';\nimport type { FilterNode } from './channels/filter';\n\n// Re-export filter types and utilities for easy access\nexport { Filter, validateFilter, FilterExamples };\nexport type { FilterNode };\n\nexport default class Pusher {\n /* STATIC PROPERTIES */\n static instances: Pusher[] = [];\n static isReady: boolean = false;\n\n private static _logToConsole: boolean = false;\n private static _log: ((message: any) => void) | undefined;\n\n static get logToConsole(): boolean {\n return this._logToConsole;\n }\n\n static set logToConsole(value: boolean) {\n this._logToConsole = value;\n setLoggerConfig({ logToConsole: value, log: this._log });\n }\n\n static get log(): ((message: any) => void) | undefined {\n return this._log;\n }\n\n static set log(fn: ((message: any) => void) | undefined) {\n this._log = fn;\n setLoggerConfig({ logToConsole: this._logToConsole, log: fn });\n }\n\n // for jsonp\n static Runtime: AbstractRuntime = Runtime;\n static ScriptReceivers: any = (<any>Runtime).ScriptReceivers;\n static DependenciesReceivers: any = (<any>Runtime).DependenciesReceivers;\n static auth_callbacks: any = (<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 private static getClientFeatures(): string[] {\n return Collections.keys(\n Collections.filterObject({ ws: Runtime.Transports.ws }, function (t) {\n return t.isSupported({});\n }),\n );\n }\n\n /* INSTANCE PROPERTIES */\n key: string;\n config: Config;\n channels: Channels;\n global_emitter: EventsDispatcher;\n sessionID: number;\n timeline: Timeline;\n timelineSender: TimelineSender;\n connection: ConnectionManager;\n timelineSenderTimer: PeriodicTimer;\n user: UserFacade;\n deltaCompression: DeltaCompressionManager;\n constructor(app_key: string, options: Options) {\n checkAppKey(app_key);\n validateOptions(options);\n this.key = app_key;\n this.config = getConfig(options, this);\n\n this.channels = Factory.createChannels();\n this.global_emitter = new EventsDispatcher();\n this.sessionID = Runtime.randomInt(1000000000);\n\n this.timeline = new Timeline(this.key, this.sessionID, {\n cluster: this.config.cluster,\n features: Pusher.getClientFeatures(),\n params: this.config.timelineParams || {},\n limit: 50,\n level: TimelineLevel.INFO,\n version: Defaults.VERSION,\n });\n if (this.config.enableStats) {\n this.timelineSender = Factory.createTimelineSender(this.timeline, {\n host: this.config.statsHost,\n path: '/timeline/v2/' + Runtime.TimelineTransport.name,\n });\n }\n\n var getStrategy = (options: StrategyOptions) => {\n return Runtime.getDefaultStrategy(this.config, options, defineTransport);\n };\n\n this.connection = Factory.createConnectionManager(this.key, {\n getStrategy: getStrategy,\n timeline: this.timeline,\n activityTimeout: this.config.activityTimeout,\n pongTimeout: this.config.pongTimeout,\n unavailableTimeout: this.config.unavailableTimeout,\n useTLS: Boolean(this.config.useTLS),\n });\n\n // Initialize delta compression manager if configured\n // Note: We always create the manager if deltaCompression option is present,\n // but only enable it automatically if enabled: true\n if (options.deltaCompression !== undefined) {\n this.deltaCompression = new DeltaCompressionManager(\n options.deltaCompression || {},\n (event: string, data: any) => this.send_event(event, data),\n );\n }\n\n this.connection.bind('connected', () => {\n this.subscribeAll();\n if (this.timelineSender) {\n this.timelineSender.send(this.connection.isUsingTLS());\n }\n // Enable delta compression after connection only if explicitly enabled\n if (this.deltaCompression && options.deltaCompression?.enabled === true) {\n this.deltaCompression.enable();\n }\n });\n\n this.connection.bind('message', (event) => {\n var eventName = event.event;\n var internal = eventName.indexOf('pusher_internal:') === 0;\n\n // Handle delta compression protocol events\n if (this.deltaCompression) {\n if (eventName === 'pusher:delta_compression_enabled') {\n this.deltaCompression.handleEnabled(event.data);\n // Don't return - let it emit to global listeners\n } else if (eventName === 'pusher:delta_cache_sync' && event.channel) {\n this.deltaCompression.handleCacheSync(event.channel, event.data);\n return;\n } else if (eventName === 'pusher:delta' && event.channel) {\n // Check if channel still exists before processing delta\n // This prevents errors from in-flight delta messages after unsubscribe\n var channel = this.channel(event.channel);\n if (!channel) {\n // Channel was unsubscribed, silently ignore delta message\n return;\n }\n\n // Decode delta and emit reconstructed event\n const reconstructedEvent = this.deltaCompression.handleDeltaMessage(\n event.channel,\n event.data,\n );\n if (reconstructedEvent) {\n // Route to channel\n if (channel) {\n channel.handleEvent(reconstructedEvent);\n }\n // Emit globally\n this.global_emitter.emit(\n reconstructedEvent.event,\n reconstructedEvent.data,\n );\n }\n return;\n }\n }\n\n if (event.channel) {\n var channel = this.channel(event.channel);\n if (channel) {\n channel.handleEvent(event);\n }\n\n // Store full messages for delta compression\n if (\n this.deltaCompression &&\n event.event &&\n !event.event.startsWith('pusher:') &&\n !event.event.startsWith('pusher_internal:')\n ) {\n // Extract sequence number from message level (not from data)\n let sequence: number | undefined;\n if (typeof (event as any).sequence === 'number') {\n sequence = (event as any).sequence;\n }\n\n // Extract conflation_key before we delete it\n let conflationKey: string | undefined;\n if (typeof (event as any).conflation_key === 'string') {\n conflationKey = (event as any).conflation_key;\n }\n\n // Use RAW message and strip metadata fields using REGEX\n // This preserves exact byte representation (including float precision)\n // We MUST NOT use JSON.parse/stringify as it can change float representations\n let fullMessage = event.rawMessage || '';\n\n if (fullMessage && sequence !== undefined) {\n // Strip metadata fields using regex to preserve exact bytes\n // Pattern matches: ,\"__delta_seq\":NUMBER or \"__delta_seq\":NUMBER, at start\n fullMessage = fullMessage.replace(/,\"__delta_seq\":\\d+/g, '');\n fullMessage = fullMessage.replace(/\"__delta_seq\":\\d+,/g, '');\n // Pattern matches: ,\"__conflation_key\":\"...\" or \"__conflation_key\":\"...\", at start\n fullMessage = fullMessage.replace(\n /,\"__conflation_key\":\"[^\"]*\"/g,\n '',\n );\n fullMessage = fullMessage.replace(\n /\"__conflation_key\":\"[^\"]*\",/g,\n '',\n );\n }\n\n this.deltaCompression.handleFullMessage(\n event.channel,\n fullMessage,\n sequence,\n conflationKey,\n );\n }\n }\n // Emit globally [deprecated]\n if (!internal) {\n this.global_emitter.emit(event.event, event.data);\n }\n });\n this.connection.bind('connecting', () => {\n this.channels.disconnect();\n });\n this.connection.bind('disconnected', () => {\n this.channels.disconnect();\n });\n this.connection.bind('error', (err) => {\n Logger.warn(err);\n });\n\n Pusher.instances.push(this);\n this.timeline.info({ instances: Pusher.instances.length });\n\n this.user = new UserFacade(this);\n\n if (Pusher.isReady) {\n this.connect();\n }\n }\n\n channel(name: string): Channel {\n return this.channels.find(name);\n }\n\n allChannels(): Channel[] {\n return this.channels.all();\n }\n\n connect() {\n this.connection.connect();\n\n if (this.timelineSender) {\n if (!this.timelineSenderTimer) {\n var usingTLS = this.connection.isUsingTLS();\n var timelineSender = this.timelineSender;\n this.timelineSenderTimer = new PeriodicTimer(60000, function () {\n timelineSender.send(usingTLS);\n });\n }\n }\n }\n\n disconnect() {\n this.connection.disconnect();\n\n if (this.timelineSenderTimer) {\n this.timelineSenderTimer.ensureAborted();\n this.timelineSenderTimer = null;\n }\n }\n\n bind(event_name: string, callback: Function, context?: any): Pusher {\n this.global_emitter.bind(event_name, callback, context);\n return this;\n }\n\n unbind(event_name?: string, callback?: Function, context?: any): Pusher {\n this.global_emitter.unbind(event_name, callback, context);\n return this;\n }\n\n bind_global(callback: Function): Pusher {\n this.global_emitter.bind_global(callback);\n return this;\n }\n\n unbind_global(callback?: Function): Pusher {\n this.global_emitter.unbind_global(callback);\n return this;\n }\n\n unbind_all(callback?: Function): Pusher {\n this.global_emitter.unbind_all();\n return this;\n }\n\n subscribeAll() {\n var channelName;\n for (channelName in this.channels.channels) {\n if (this.channels.channels.hasOwnProperty(channelName)) {\n this.subscribe(channelName);\n }\n }\n }\n\n subscribe(channel_name: string, tagsFilter?: any) {\n var channel = this.channels.add(channel_name, this);\n\n // Set tags filter if provided\n if (tagsFilter) {\n channel.tagsFilter = tagsFilter;\n }\n\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 // Clear delta compression state for this channel to prevent stale base messages\n // on resubscribe. The server also clears its state, so both sides start fresh.\n if (this.deltaCompression) {\n this.deltaCompression.clearChannelState(channel_name);\n }\n }\n\n send_event(event_name: string, data: any, channel?: string) {\n return this.connection.send_event(event_name, data, channel);\n }\n\n shouldUseTLS(): boolean {\n return this.config.useTLS;\n }\n\n signin() {\n this.user.signin();\n }\n\n /**\n * Get delta compression statistics\n * @returns {DeltaStats} Statistics about delta compression bandwidth savings\n */\n getDeltaStats(): DeltaStats | null {\n if (!this.deltaCompression) {\n return null;\n }\n return this.deltaCompression.getStats();\n }\n\n /**\n * Reset delta compression statistics\n */\n resetDeltaStats(): void {\n if (this.deltaCompression) {\n this.deltaCompression.resetStats();\n }\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"],"names":["prefix","AuthRequestType","UrlStore","keys","values","base64encode","jsonp","Logger","document","Collections.buildQueryString","Browser","Collections.keys","Collections.apply","Collections.filter","EventsDispatcher","hooks","Collections.extend","URLSchemes.ws","URLSchemes.http","Transports","URLSchemes.sockjs","Collections.objectApply","Errors.BadEventName","encode","decode","this","d","b","Coder","URLSafeCoder","nacl","decodeBase64","Errors.UnsupportedFeature","encodeUTF8","Network","Timer","Collections.values","urlStore","Errors.BadChannelName","Collections.any","Collections.map","Collections.all","Collections.safeJSONStringify","config","defineTransport","Errors.RequestTimedOut","State","streamingHooks","pollingHooks","xhrHooks","xdrHooks","HTTPFactory","jsonpTimeline","jsonpAuth","random","TimelineLevel","Level","Errors.UnsupportedStrategy","Errors.TransportPriorityTooLow","Errors.TransportClosed","Errors.UnsupportedTransport","Collections.arrayIndexOf","UnsupportedStrategy","composeChannelQuery","delta","errors","CustomError","deserializeInteger","instructions","window","TypedArray.TypedArrayList","deserializeDelta","base64","fossilApplyDelta","vcdiffDecode","Collections.filterObject","options"],"mappings":"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","x_google_ignoreList":[35,36,73,74,75,76,77,78,79,80,81,82,83]}
1
+ {"version":3,"file":"pusher.mjs","sources":["../../src/runtimes/web/dom/script_receiver_factory.ts","../../src/core/defaults.ts","../../src/runtimes/web/dom/dependency_loader.ts","../../src/runtimes/web/dom/dependencies.ts","../../src/core/utils/url_store.ts","../../src/core/auth/options.ts","../../src/core/errors.ts","../../src/runtimes/isomorphic/auth/xhr_auth.ts","../../src/core/base64.ts","../../src/core/utils/timers/abstract_timer.ts","../../src/core/utils/timers/index.ts","../../src/core/util.ts","../../src/core/utils/collections.ts","../../src/core/logger.ts","../../src/runtimes/web/auth/jsonp_auth.ts","../../src/runtimes/web/dom/script_request.ts","../../src/runtimes/web/dom/jsonp_request.ts","../../src/runtimes/web/timeline/jsonp_timeline.ts","../../src/core/transports/url_schemes.ts","../../src/core/events/callback_registry.ts","../../src/core/events/dispatcher.ts","../../src/core/transports/transport_connection.ts","../../src/core/transports/transport.ts","../../src/runtimes/isomorphic/transports/transports.ts","../../src/runtimes/web/transports/transports.ts","../../src/runtimes/web/net_info.ts","../../src/core/transports/assistant_to_the_transport_manager.ts","../../src/core/connection/protocol/protocol.ts","../../src/core/connection/connection.ts","../../src/core/connection/handshake/index.ts","../../src/core/timeline/timeline_sender.ts","../../src/core/channels/channel.ts","../../src/core/channels/private_channel.ts","../../src/core/channels/members.ts","../../src/core/channels/presence_channel.ts","../../node_modules/@stablelib/utf8/lib/utf8.js","../../node_modules/@stablelib/base64/lib/base64.js","../../src/core/channels/encrypted_channel.ts","../../src/core/connection/connection_manager.ts","../../src/core/channels/channels.ts","../../src/core/utils/factory.ts","../../src/core/transports/transport_manager.ts","../../src/core/strategies/sequential_strategy.ts","../../src/core/strategies/best_connected_ever_strategy.ts","../../src/core/strategies/websocket_prioritized_cached_strategy.ts","../../src/core/strategies/delayed_strategy.ts","../../src/core/strategies/if_strategy.ts","../../src/core/strategies/first_connected_strategy.ts","../../src/runtimes/web/default_strategy.ts","../../src/runtimes/web/transports/transport_connection_initializer.ts","../../src/runtimes/web/http/http_xdomain_request.ts","../../src/core/http/http_request.ts","../../src/core/http/state.ts","../../src/core/http/http_socket.ts","../../src/core/http/http_streaming_socket.ts","../../src/core/http/http_polling_socket.ts","../../src/runtimes/isomorphic/http/http_xhr_request.ts","../../src/runtimes/isomorphic/http/http.ts","../../src/runtimes/web/http/http.ts","../../src/runtimes/web/runtime.ts","../../src/core/timeline/level.ts","../../src/core/timeline/timeline.ts","../../src/core/strategies/transport_strategy.ts","../../src/core/strategies/strategy_builder.ts","../../src/core/options.ts","../../src/core/auth/user_authenticator.ts","../../src/core/auth/channel_authorizer.ts","../../src/core/auth/deprecated_channel_authorizer.ts","../../src/core/config.ts","../../src/core/watchlist.ts","../../src/core/utils/flat_promise.ts","../../src/core/user.ts","../../src/core/delta/channel_state.ts","../../node_modules/fossil-delta/fossil-delta.js","../../node_modules/@ably/vcdiff-decoder/lib/errors.js","../../node_modules/@ably/vcdiff-decoder/lib/typed_array_util.js","../../node_modules/@ably/vcdiff-decoder/lib/deserialize/integer.js","../../node_modules/@ably/vcdiff-decoder/lib/instructions.js","../../node_modules/@ably/vcdiff-decoder/lib/tokenize_instructions.js","../../node_modules/@ably/vcdiff-decoder/lib/deserialize/delta.js","../../node_modules/@ably/vcdiff-decoder/lib/address_caches/near.js","../../node_modules/@ably/vcdiff-decoder/lib/address_caches/same.js","../../node_modules/@ably/vcdiff-decoder/lib/vcdiff.js","../../node_modules/@ably/vcdiff-decoder/lib/vcdiff_decoder.js","../../src/core/delta/decoders.ts","../../src/core/delta/manager.ts","../../src/core/pusher.ts"],"sourcesContent":["import ScriptReceiver from './script_receiver';\n\n/** Builds receivers for JSONP and Script requests.\n *\n * Each receiver is an object with following fields:\n * - number - unique (for the factory instance), numerical id of the receiver\n * - id - a string ID that can be used in DOM attributes\n * - name - name of the function triggering the receiver\n * - callback - callback function\n *\n * Receivers are triggered only once, on the first callback call.\n *\n * Receivers can be called by their name or by accessing factory object\n * by the number key.\n *\n * @param {String} prefix the prefix used in ids\n * @param {String} name the name of the object\n */\nexport class ScriptReceiverFactory {\n lastId: number;\n prefix: string;\n name: string;\n\n constructor(prefix: string, name: string) {\n this.lastId = 0;\n this.prefix = prefix;\n this.name = name;\n }\n\n create(callback: Function): ScriptReceiver {\n this.lastId++;\n\n var number = this.lastId;\n var id = this.prefix + number;\n var name = this.name + '[' + number + ']';\n\n var called = false;\n var callbackWrapper = function () {\n if (!called) {\n callback.apply(null, arguments);\n called = true;\n }\n };\n\n this[number] = callbackWrapper;\n return { number: number, id: id, name: name, callback: callbackWrapper };\n }\n\n remove(receiver: ScriptReceiver) {\n delete this[receiver.number];\n }\n}\n\nexport var ScriptReceivers = new ScriptReceiverFactory(\n '_pusher_script_',\n 'Pusher.ScriptReceivers',\n);\n","import {\n ChannelAuthorizationOptions,\n UserAuthenticationOptions,\n} from './auth/options';\nimport { AuthTransport } from './config';\n\nexport interface DefaultConfig {\n VERSION: string;\n PROTOCOL: number;\n wsPort: number;\n wssPort: number;\n wsPath: string;\n httpHost: string;\n httpPort: number;\n httpsPort: number;\n httpPath: string;\n stats_host: string;\n authEndpoint: string;\n authTransport: AuthTransport;\n activityTimeout: number;\n pongTimeout: number;\n unavailableTimeout: number;\n userAuthentication: UserAuthenticationOptions;\n channelAuthorization: ChannelAuthorizationOptions;\n\n cdn_http?: string;\n cdn_https?: string;\n dependency_suffix?: string;\n}\n\nvar Defaults: DefaultConfig = {\n VERSION: VERSION,\n PROTOCOL: 7,\n\n wsPort: 80,\n wssPort: 443,\n wsPath: '',\n // DEPRECATED: SockJS fallback parameters\n httpHost: 'sockjs.pusher.com',\n httpPort: 80,\n httpsPort: 443,\n httpPath: '/pusher',\n // DEPRECATED: Stats\n stats_host: 'stats.pusher.com',\n // DEPRECATED: Other settings\n authEndpoint: '/pusher/auth',\n authTransport: 'ajax',\n activityTimeout: 120000,\n pongTimeout: 30000,\n unavailableTimeout: 10000,\n userAuthentication: {\n endpoint: '/pusher/user-auth',\n transport: 'ajax',\n },\n channelAuthorization: {\n endpoint: '/pusher/auth',\n transport: 'ajax',\n },\n\n // CDN configuration\n cdn_http: CDN_HTTP,\n cdn_https: CDN_HTTPS,\n dependency_suffix: DEPENDENCY_SUFFIX,\n};\n\nexport default Defaults;\n","import {\n ScriptReceivers,\n ScriptReceiverFactory,\n} from './script_receiver_factory';\nimport Runtime from 'runtime';\nimport ScriptRequest from './script_request';\n\n/** Handles loading dependency files.\n *\n * Dependency loaders don't remember whether a resource has been loaded or\n * not. It is caller's responsibility to make sure the resource is not loaded\n * twice. This is because it's impossible to detect resource loading status\n * without knowing its content.\n *\n * Options:\n * - cdn_http - url to HTTP CND\n * - cdn_https - url to HTTPS CDN\n * - version - version of pusher-js\n * - suffix - suffix appended to all names of dependency files\n *\n * @param {Object} options\n */\nexport default class DependencyLoader {\n options: any;\n receivers: ScriptReceiverFactory;\n loading: any;\n\n constructor(options: any) {\n this.options = options;\n this.receivers = options.receivers || ScriptReceivers;\n this.loading = {};\n }\n\n /** Loads the dependency from CDN.\n *\n * @param {String} name\n * @param {Function} callback\n */\n load(name: string, options: any, callback: Function) {\n var self = this;\n\n if (self.loading[name] && self.loading[name].length > 0) {\n self.loading[name].push(callback);\n } else {\n self.loading[name] = [callback];\n\n var request = Runtime.createScriptRequest(self.getPath(name, options));\n var receiver = self.receivers.create(function (error) {\n self.receivers.remove(receiver);\n\n if (self.loading[name]) {\n var callbacks = self.loading[name];\n delete self.loading[name];\n\n var successCallback = function (wasSuccessful) {\n if (!wasSuccessful) {\n request.cleanup();\n }\n };\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](error, successCallback);\n }\n }\n });\n request.send(receiver);\n }\n }\n\n /** Returns a root URL for pusher-js CDN.\n *\n * @returns {String}\n */\n getRoot(options: any): string {\n var cdn;\n var protocol = Runtime.getDocument().location.protocol;\n if ((options && options.useTLS) || protocol === 'https:') {\n cdn = this.options.cdn_https;\n } else {\n cdn = this.options.cdn_http;\n }\n // make sure there are no double slashes\n return cdn.replace(/\\/*$/, '') + '/' + this.options.version;\n }\n\n /** Returns a full path to a dependency file.\n *\n * @param {String} name\n * @returns {String}\n */\n getPath(name: string, options: any): string {\n return this.getRoot(options) + '/' + name + this.options.suffix + '.js';\n }\n}\n","import { ScriptReceiverFactory } from './script_receiver_factory';\nimport Defaults from 'core/defaults';\nimport DependencyLoader from './dependency_loader';\n\nexport var DependenciesReceivers = new ScriptReceiverFactory(\n '_pusher_dependencies',\n 'Pusher.DependenciesReceivers',\n);\n\nexport var Dependencies = new DependencyLoader({\n cdn_http: Defaults.cdn_http,\n cdn_https: Defaults.cdn_https,\n version: Defaults.VERSION,\n suffix: Defaults.dependency_suffix,\n receivers: DependenciesReceivers,\n});\n","/**\n * A place to store help URLs for error messages etc\n */\n\nconst urlStore = {\n baseUrl: 'https://pusher.com',\n urls: {\n authenticationEndpoint: {\n path: '/docs/channels/server_api/authenticating_users',\n },\n authorizationEndpoint: {\n path: '/docs/channels/server_api/authorizing-users/',\n },\n javascriptQuickStart: {\n path: '/docs/javascript_quick_start',\n },\n triggeringClientEvents: {\n path: '/docs/client_api_guide/client_events#trigger-events',\n },\n encryptedChannelSupport: {\n fullUrl:\n 'https://github.com/pusher/pusher-js/tree/cc491015371a4bde5743d1c87a0fbac0feb53195#encrypted-channel-support',\n },\n },\n};\n\n/** Builds a consistent string with links to pusher documentation\n *\n * @param {string} key - relevant key in the url_store.urls object\n * @return {string} suffix string to append to log message\n */\nconst buildLogSuffix = function (key: string): string {\n const urlPrefix = 'See:';\n const urlObj = urlStore.urls[key];\n if (!urlObj) return '';\n\n let url;\n if (urlObj.fullUrl) {\n url = urlObj.fullUrl;\n } else if (urlObj.path) {\n url = urlStore.baseUrl + urlObj.path;\n }\n\n if (!url) return '';\n return `${urlPrefix} ${url}`;\n};\n\nexport default { buildLogSuffix };\n","export enum AuthRequestType {\n UserAuthentication = 'user-authentication',\n ChannelAuthorization = 'channel-authorization',\n}\n\nexport interface ChannelAuthorizationData {\n auth: string;\n channel_data?: string;\n shared_secret?: string;\n}\n\nexport type ChannelAuthorizationCallback = (\n error: Error | null,\n authData: ChannelAuthorizationData | null,\n) => void;\n\nexport interface ChannelAuthorizationRequestParams {\n socketId: string;\n channelName: string;\n}\n\nexport interface ChannelAuthorizationHandler {\n (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback,\n ): void;\n}\n\nexport interface UserAuthenticationData {\n auth: string;\n user_data: string;\n}\n\nexport type UserAuthenticationCallback = (\n error: Error | null,\n authData: UserAuthenticationData | null,\n) => void;\n\nexport interface UserAuthenticationRequestParams {\n socketId: string;\n}\n\nexport interface UserAuthenticationHandler {\n (\n params: UserAuthenticationRequestParams,\n callback: UserAuthenticationCallback,\n ): void;\n}\n\nexport type AuthTransportCallback =\n | ChannelAuthorizationCallback\n | UserAuthenticationCallback;\n\nexport interface AuthOptionsT<AuthHandler> {\n transport: 'ajax' | 'jsonp';\n endpoint: string;\n params?: any;\n headers?: any;\n paramsProvider?: () => any;\n headersProvider?: () => any;\n customHandler?: AuthHandler;\n}\n\nexport declare type UserAuthenticationOptions =\n AuthOptionsT<UserAuthenticationHandler>;\nexport declare type ChannelAuthorizationOptions =\n AuthOptionsT<ChannelAuthorizationHandler>;\n\nexport interface InternalAuthOptions {\n transport: 'ajax' | 'jsonp';\n endpoint: string;\n params?: any;\n headers?: any;\n paramsProvider?: () => any;\n headersProvider?: () => any;\n}\n","/** Error classes used throughout the library. */\n// https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\nexport class BadEventName extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class BadChannelName extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class RequestTimedOut extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class TransportPriorityTooLow extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class TransportClosed extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedFeature extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedTransport extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedStrategy extends Error {\n constructor(msg?: string) {\n super(msg);\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class HTTPAuthError extends Error {\n status: number;\n constructor(status: number, msg?: string) {\n super(msg);\n this.status = status;\n\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import TimelineSender from 'core/timeline/timeline_sender';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from 'runtime';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport AbstractRuntime from 'runtimes/interface';\nimport UrlStore from 'core/utils/url_store';\nimport {\n AuthRequestType,\n AuthTransportCallback,\n InternalAuthOptions,\n} from 'core/auth/options';\nimport { HTTPAuthError } from 'core/errors';\n\nconst ajax: AuthTransport = function (\n context: AbstractRuntime,\n query: string,\n authOptions: InternalAuthOptions,\n authRequestType: AuthRequestType,\n callback: AuthTransportCallback,\n) {\n const xhr = Runtime.createXHR();\n xhr.open('POST', authOptions.endpoint, true);\n\n // add request headers\n xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n for (var headerName in authOptions.headers) {\n xhr.setRequestHeader(headerName, authOptions.headers[headerName]);\n }\n if (authOptions.headersProvider != null) {\n let dynamicHeaders = authOptions.headersProvider();\n for (var headerName in dynamicHeaders) {\n xhr.setRequestHeader(headerName, dynamicHeaders[headerName]);\n }\n }\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n let data;\n let parsed = false;\n\n try {\n data = JSON.parse(xhr.responseText);\n parsed = true;\n } catch (e) {\n callback(\n new HTTPAuthError(\n 200,\n `JSON returned from ${authRequestType.toString()} endpoint was invalid, yet status code was 200. Data was: ${\n xhr.responseText\n }`,\n ),\n null,\n );\n }\n\n if (parsed) {\n // prevents double execution.\n callback(null, data);\n }\n } else {\n let suffix = '';\n switch (authRequestType) {\n case AuthRequestType.UserAuthentication:\n suffix = UrlStore.buildLogSuffix('authenticationEndpoint');\n break;\n case AuthRequestType.ChannelAuthorization:\n suffix = `Clients must be authorized to join private or presence channels. ${UrlStore.buildLogSuffix(\n 'authorizationEndpoint',\n )}`;\n break;\n }\n callback(\n new HTTPAuthError(\n xhr.status,\n `Unable to retrieve auth string from ${authRequestType.toString()} endpoint - ` +\n `received status: ${xhr.status} from ${authOptions.endpoint}. ${suffix}`,\n ),\n null,\n );\n }\n }\n };\n\n xhr.send(query);\n return xhr;\n};\n\nexport default ajax;\n","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<T>(target: any, ...sources: any[]): T {\n for (var i = 0; i < sources.length; i++) {\n var extensions = sources[i];\n for (var property in extensions) {\n if (\n extensions[property] &&\n extensions[property].constructor &&\n extensions[property].constructor === Object\n ) {\n target[property] = extend(target[property] || {}, extensions[property]);\n } else {\n target[property] = extensions[property];\n }\n }\n }\n return target;\n}\n\nexport function stringify(): string {\n var m = ['Pusher'];\n for (var i = 0; i < arguments.length; i++) {\n if (typeof arguments[i] === 'string') {\n m.push(arguments[i]);\n } else {\n m.push(safeJSONStringify(arguments[i]));\n }\n }\n return m.join(' : ');\n}\n\nexport function arrayIndexOf(array: any[], item: any): number {\n // MSIE doesn't have array.indexOf\n var nativeIndexOf = Array.prototype.indexOf;\n if (array === null) {\n return -1;\n }\n if (nativeIndexOf && array.indexOf === nativeIndexOf) {\n return array.indexOf(item);\n }\n for (var i = 0, l = array.length; i < l; i++) {\n if (array[i] === item) {\n return i;\n }\n }\n return -1;\n}\n\n/** Applies a function f to all properties of an object.\n *\n * Function f gets 3 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function objectApply(object: any, f: Function) {\n for (var key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n f(object[key], key, object);\n }\n }\n}\n\n/** Return a list of objects own proerty keys\n *\n * @param {Object} object\n * @returns {Array}\n */\nexport function keys(object: any): string[] {\n var keys = [];\n objectApply(object, function (_, key) {\n keys.push(key);\n });\n return keys;\n}\n\n/** Return a list of object's own property values\n *\n * @param {Object} object\n * @returns {Array}\n */\nexport function values(object: any): any[] {\n var values = [];\n objectApply(object, function (value) {\n values.push(value);\n });\n return values;\n}\n\n/** Applies a function f to all elements of an array.\n *\n * Function f gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function apply(array: any[], f: Function, context?: any) {\n for (var i = 0; i < array.length; i++) {\n f.call(context || global, array[i], i, array);\n }\n}\n\n/** Maps all elements of the array and returns the result.\n *\n * Function f gets 4 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n * - reference to the destination array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function map(array: any[], f: Function): any[] {\n var result = [];\n for (var i = 0; i < array.length; i++) {\n result.push(f(array[i], i, array, result));\n }\n return result;\n}\n\n/** Maps all elements of the object and returns the result.\n *\n * Function f gets 4 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the source object\n * - reference to the destination object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function mapObject(object: any, f: Function): any {\n var result = {};\n objectApply(object, function (value, key) {\n result[key] = f(value);\n });\n return result;\n}\n\n/** Filters elements of the array using a test function.\n *\n * Function test gets 4 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n * - reference to the destination array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function filter(array: any[], test: Function): any[] {\n test =\n test ||\n function (value) {\n return !!value;\n };\n\n var result = [];\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array, result)) {\n result.push(array[i]);\n }\n }\n return result;\n}\n\n/** Filters properties of the object using a test function.\n *\n * Function test gets 4 arguments passed:\n * - element from the object\n * - key of the element\n * - reference to the source object\n * - reference to the destination object\n *\n * @param {Object} object\n * @param {Function} f\n */\nexport function filterObject(object: Object, test: Function) {\n var result = {};\n objectApply(object, function (value, key) {\n if ((test && test(value, key, object, result)) || Boolean(value)) {\n result[key] = value;\n }\n });\n return result;\n}\n\n/** Flattens an object into a two-dimensional array.\n *\n * @param {Object} object\n * @return {Array} resulting array of [key, value] pairs\n */\nexport function flatten(object: Object): any[] {\n var result = [];\n objectApply(object, function (value, key) {\n result.push([key, value]);\n });\n return result;\n}\n\n/** Checks whether any element of the array passes the test.\n *\n * Function test gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function any(array: any[], test: Function): boolean {\n for (var i = 0; i < array.length; i++) {\n if (test(array[i], i, array)) {\n return true;\n }\n }\n return false;\n}\n\n/** Checks whether all elements of the array pass the test.\n *\n * Function test gets 3 arguments passed:\n * - element from the array\n * - index of the element\n * - reference to the source array\n *\n * @param {Array} array\n * @param {Function} f\n */\nexport function all(array: any[], test: Function): boolean {\n for (var i = 0; i < array.length; i++) {\n if (!test(array[i], i, array)) {\n return false;\n }\n }\n return true;\n}\n\nexport function encodeParamsObject(data): string {\n return mapObject(data, function (value) {\n if (typeof value === 'object') {\n value = safeJSONStringify(value);\n }\n return encodeURIComponent(base64encode(value.toString()));\n });\n}\n\nexport function buildQueryString(data: any): string {\n var params = filterObject(data, function (value) {\n return value !== undefined;\n });\n\n var query = map(\n flatten(encodeParamsObject(params)),\n Util.method('join', '='),\n ).join('&');\n\n return query;\n}\n\n/**\n * See https://github.com/douglascrockford/JSON-js/blob/master/cycle.js\n *\n * Remove circular references from an object. Required for JSON.stringify in\n * React Native, which tends to blow up a lot.\n *\n * @param {any} object\n * @return {any} Decycled object\n */\nexport function decycleObject(object: any): any {\n var objects = [],\n paths = [];\n\n return (function derez(value, path) {\n var i, name, nu;\n\n switch (typeof value) {\n case 'object':\n if (!value) {\n return null;\n }\n for (i = 0; i < objects.length; i += 1) {\n if (objects[i] === value) {\n return { $ref: paths[i] };\n }\n }\n\n objects.push(value);\n paths.push(path);\n\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n nu = [];\n for (i = 0; i < value.length; i += 1) {\n nu[i] = derez(value[i], path + '[' + i + ']');\n }\n } else {\n nu = {};\n for (name in value) {\n if (Object.prototype.hasOwnProperty.call(value, name)) {\n nu[name] = derez(\n value[name],\n path + '[' + JSON.stringify(name) + ']',\n );\n }\n }\n }\n return nu;\n case 'number':\n case 'string':\n case 'boolean':\n return value;\n }\n })(object, '$');\n}\n\n/**\n * Provides a cross-browser and cross-platform way to safely stringify objects\n * into JSON. This is particularly necessary for ReactNative, where circular JSON\n * structures throw an exception.\n *\n * @param {any} source The object to stringify\n * @return {string} The serialized output.\n */\nexport function safeJSONStringify(source: any): string {\n try {\n return JSON.stringify(source);\n } catch (e) {\n return JSON.stringify(decycleObject(source));\n }\n}\n","import { stringify } from './utils/collections';\n\n// Logger configuration - can be set by Pusher class\nexport interface LoggerConfig {\n log?: (message: string) => void;\n logToConsole?: boolean;\n}\n\nlet config: LoggerConfig = {\n logToConsole: false,\n};\n\nexport function setLoggerConfig(newConfig: LoggerConfig) {\n config = { ...config, ...newConfig };\n}\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 (config.log) {\n config.log(message);\n } else if (config.logToConsole) {\n const log = defaultLoggingFunction.bind(this);\n log(message);\n }\n }\n}\n\nexport default new Logger();\n","import Browser from '../browser';\nimport Logger from 'core/logger';\nimport JSONPRequest from '../dom/jsonp_request';\nimport { ScriptReceivers } from '../dom/script_receiver_factory';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport {\n AuthRequestType,\n AuthTransportCallback,\n InternalAuthOptions,\n} from 'core/auth/options';\n\nvar jsonp: AuthTransport = function (\n context: Browser,\n query: string,\n authOptions: InternalAuthOptions,\n authRequestType: AuthRequestType,\n callback: AuthTransportCallback,\n) {\n if (\n authOptions.headers !== undefined ||\n authOptions.headersProvider != null\n ) {\n Logger.warn(\n `To send headers with the ${authRequestType.toString()} request, you must use AJAX, rather than JSONP.`,\n );\n }\n\n var callbackName = context.nextAuthCallbackID.toString();\n context.nextAuthCallbackID++;\n\n var document = context.getDocument();\n var script = document.createElement('script');\n // Hacked wrapper.\n context.auth_callbacks[callbackName] = function (data) {\n callback(null, data);\n };\n\n var callback_name = \"Pusher.auth_callbacks['\" + callbackName + \"']\";\n script.src =\n authOptions.endpoint +\n '?callback=' +\n encodeURIComponent(callback_name) +\n '&' +\n query;\n\n var head =\n document.getElementsByTagName('head')[0] || document.documentElement;\n head.insertBefore(script, head.firstChild);\n};\n\nexport default jsonp;\n","import ScriptReceiver from './script_receiver';\n\n/** Sends a generic HTTP GET request using a script tag.\n *\n * By constructing URL in a specific way, it can be used for loading\n * JavaScript resources or JSONP requests. It can notify about errors, but\n * only in certain environments. Please take care of monitoring the state of\n * the request yourself.\n *\n * @param {String} src\n */\nexport default class ScriptRequest {\n src: string;\n script: any;\n errorScript: any;\n\n constructor(src: string) {\n this.src = src;\n }\n\n send(receiver: ScriptReceiver) {\n var self = this;\n var errorString = 'Error loading ' + self.src;\n\n self.script = document.createElement('script');\n self.script.id = receiver.id;\n self.script.src = self.src;\n self.script.type = 'text/javascript';\n self.script.charset = 'UTF-8';\n\n if (self.script.addEventListener) {\n self.script.onerror = function () {\n receiver.callback(errorString);\n };\n self.script.onload = function () {\n receiver.callback(null);\n };\n } else {\n self.script.onreadystatechange = function () {\n if (\n self.script.readyState === 'loaded' ||\n self.script.readyState === 'complete'\n ) {\n receiver.callback(null);\n }\n };\n }\n\n // Opera<11.6 hack for missing onerror callback\n if (\n self.script.async === undefined &&\n (<any>document).attachEvent &&\n /opera/i.test(navigator.userAgent)\n ) {\n self.errorScript = document.createElement('script');\n self.errorScript.id = receiver.id + '_error';\n self.errorScript.text = receiver.name + \"('\" + errorString + \"');\";\n self.script.async = self.errorScript.async = false;\n } else {\n self.script.async = true;\n }\n\n var head = document.getElementsByTagName('head')[0];\n head.insertBefore(self.script, head.firstChild);\n if (self.errorScript) {\n head.insertBefore(self.errorScript, self.script.nextSibling);\n }\n }\n\n /** Cleans up the DOM remains of the script request. */\n cleanup() {\n if (this.script) {\n this.script.onload = this.script.onerror = null;\n this.script.onreadystatechange = null;\n }\n if (this.script && this.script.parentNode) {\n this.script.parentNode.removeChild(this.script);\n }\n if (this.errorScript && this.errorScript.parentNode) {\n this.errorScript.parentNode.removeChild(this.errorScript);\n }\n this.script = null;\n this.errorScript = null;\n }\n}\n","import ScriptReceiver from './script_receiver';\nimport ScriptRequest from './script_request';\nimport * as Collections from 'core/utils/collections';\nimport Util from 'core/util';\nimport Runtime from '../runtime';\n\n/** Sends data via JSONP.\n *\n * Data is a key-value map. Its values are JSON-encoded and then passed\n * through base64. Finally, keys and encoded values are appended to the query\n * string.\n *\n * The class itself does not guarantee raising errors on failures, as it's not\n * possible to support such feature on all browsers. Instead, JSONP endpoint\n * should call back in a way that's easy to distinguish from browser calls,\n * for example by passing a second argument to the receiver.\n *\n * @param {String} url\n * @param {Object} data key-value map of data to be submitted\n */\nexport default class JSONPRequest {\n url: string;\n data: any;\n request: ScriptRequest;\n\n constructor(url: string, data: any) {\n this.url = url;\n this.data = data;\n }\n\n /** Sends the actual JSONP request.\n *\n * @param {ScriptReceiver} receiver\n */\n send(receiver: ScriptReceiver) {\n if (this.request) {\n return;\n }\n\n var query = Collections.buildQueryString(this.data);\n var url = this.url + '/' + receiver.number + '?' + query;\n this.request = Runtime.createScriptRequest(url);\n this.request.send(receiver);\n }\n\n /** Cleans up the DOM remains of the JSONP request. */\n cleanup() {\n if (this.request) {\n this.request.cleanup();\n }\n }\n}\n","import TimelineSender from 'core/timeline/timeline_sender';\nimport TimelineTransport from 'core/timeline/timeline_transport';\nimport Browser from 'runtime';\nimport { AuthTransport } from 'core/auth/auth_transports';\nimport { ScriptReceivers } from '../dom/script_receiver_factory';\n\nvar getAgent = function (sender: TimelineSender, useTLS: boolean) {\n return function (data: any, callback: Function) {\n var scheme = 'http' + (useTLS ? 's' : '') + '://';\n var url =\n scheme + (sender.host || sender.options.host) + sender.options.path;\n var request = Browser.createJSONPRequest(url, data);\n\n var receiver = Browser.ScriptReceivers.create(function (error, result) {\n ScriptReceivers.remove(receiver);\n request.cleanup();\n\n if (result && result.host) {\n sender.host = result.host;\n }\n if (callback) {\n callback(error, result);\n }\n });\n request.send(receiver);\n };\n};\n\nvar jsonp = {\n name: 'jsonp',\n getAgent,\n};\n\nexport default jsonp;\n","import Defaults from '../defaults';\nimport { default as URLScheme, URLSchemeParams } from './url_scheme';\n\nfunction getGenericURL(\n baseScheme: string,\n params: URLSchemeParams,\n path: string,\n): string {\n var scheme = baseScheme + (params.useTLS ? 's' : '');\n var host = params.useTLS ? params.hostTLS : params.hostNonTLS;\n return scheme + '://' + host + path;\n}\n\nfunction getGenericPath(key: string, queryString?: string): string {\n var path = '/app/' + key;\n var query =\n '?protocol=' +\n Defaults.PROTOCOL +\n '&client=js' +\n '&version=' +\n Defaults.VERSION +\n (queryString ? '&' + queryString : '');\n return path + query;\n}\n\nexport var ws: URLScheme = {\n getInitial: function (key: string, params: URLSchemeParams): string {\n var path = (params.httpPath || '') + getGenericPath(key, 'flash=false');\n return getGenericURL('ws', params, path);\n },\n};\n\nexport var http: URLScheme = {\n getInitial: function (key: string, params: URLSchemeParams): string {\n var path = (params.httpPath || '/pusher') + getGenericPath(key);\n return getGenericURL('http', params, path);\n },\n};\n\nexport var sockjs: URLScheme = {\n getInitial: function (key: string, params: URLSchemeParams): string {\n return getGenericURL('http', params, params.httpPath || '/pusher');\n },\n getPath: function (key: string, params: URLSchemeParams): string {\n return getGenericPath(key);\n },\n};\n","import Callback from './callback';\nimport * as Collections from '../utils/collections';\nimport CallbackTable from './callback_table';\n\nexport default class CallbackRegistry {\n _callbacks: CallbackTable;\n\n constructor() {\n this._callbacks = {};\n }\n\n get(name: string): Callback[] {\n return this._callbacks[prefix(name)];\n }\n\n add(name: string, callback: Function, context: any) {\n var prefixedEventName = prefix(name);\n this._callbacks[prefixedEventName] =\n this._callbacks[prefixedEventName] || [];\n this._callbacks[prefixedEventName].push({\n fn: callback,\n context: context,\n });\n }\n\n remove(name?: string, callback?: Function, context?: any) {\n if (!name && !callback && !context) {\n this._callbacks = {};\n return;\n }\n\n var names = name ? [prefix(name)] : Collections.keys(this._callbacks);\n\n if (callback || context) {\n this.removeCallback(names, callback, context);\n } else {\n this.removeAllCallbacks(names);\n }\n }\n\n private removeCallback(names: string[], callback: Function, context: any) {\n Collections.apply(\n names,\n function (name) {\n this._callbacks[name] = Collections.filter(\n this._callbacks[name] || [],\n function (binding) {\n return (\n (callback && callback !== binding.fn) ||\n (context && context !== binding.context)\n );\n },\n );\n if (this._callbacks[name].length === 0) {\n delete this._callbacks[name];\n }\n },\n this,\n );\n }\n\n private removeAllCallbacks(names: string[]) {\n Collections.apply(\n names,\n function (name) {\n delete this._callbacks[name];\n },\n this,\n );\n }\n}\n\nfunction prefix(name: string): string {\n return '_' + name;\n}\n","import * as Collections from '../utils/collections';\nimport Callback from './callback';\nimport Metadata from '../channels/metadata';\nimport CallbackRegistry from './callback_registry';\n\n/** Manages callback bindings and event emitting.\n *\n * @param Function failThrough called when no listeners are bound to an event\n */\nexport default class Dispatcher {\n callbacks: CallbackRegistry;\n global_callbacks: Function[];\n failThrough: Function;\n\n constructor(failThrough?: Function) {\n this.callbacks = new CallbackRegistry();\n this.global_callbacks = [];\n this.failThrough = failThrough;\n }\n\n bind(eventName: string, callback: Function, context?: any) {\n this.callbacks.add(eventName, callback, context);\n return this;\n }\n\n bind_global(callback: Function) {\n this.global_callbacks.push(callback);\n return this;\n }\n\n unbind(eventName?: string, callback?: Function, context?: any) {\n this.callbacks.remove(eventName, callback, context);\n return this;\n }\n\n unbind_global(callback?: Function) {\n if (!callback) {\n this.global_callbacks = [];\n return this;\n }\n\n this.global_callbacks = Collections.filter(\n this.global_callbacks || [],\n (c) => c !== callback,\n );\n\n return this;\n }\n\n unbind_all() {\n this.unbind();\n this.unbind_global();\n return this;\n }\n\n emit(eventName: string, data?: any, metadata?: Metadata): Dispatcher {\n for (var i = 0; i < this.global_callbacks.length; i++) {\n this.global_callbacks[i](eventName, data);\n }\n\n var callbacks = this.callbacks.get(eventName);\n var args = [];\n\n if (metadata) {\n // if there's a metadata argument, we need to call the callback with both\n // data and metadata regardless of whether data is undefined\n args.push(data, metadata);\n } else if (data) {\n // metadata is undefined, so we only need to call the callback with data\n // if data exists\n args.push(data);\n }\n\n if (callbacks && callbacks.length > 0) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i].fn.apply(callbacks[i].context || global, args);\n }\n } else if (this.failThrough) {\n this.failThrough(eventName, data);\n }\n\n return this;\n }\n}\n","import Util from '../util';\nimport * as Collections from '../utils/collections';\nimport { default as EventsDispatcher } from '../events/dispatcher';\nimport Logger from '../logger';\nimport TransportHooks from './transport_hooks';\nimport Socket from '../socket';\nimport Runtime from 'runtime';\nimport Timeline from '../timeline/timeline';\nimport TransportConnectionOptions from './transport_connection_options';\n\n/** Provides universal API for transport connections.\n *\n * Transport connection is a low-level object that wraps a connection method\n * and exposes a simple evented interface for the connection state and\n * messaging. It does not implement Pusher-specific WebSocket protocol.\n *\n * Additionally, it fetches resources needed for transport to work and exposes\n * an interface for querying transport features.\n *\n * States:\n * - new - initial state after constructing the object\n * - initializing - during initialization phase, usually fetching resources\n * - intialized - ready to establish a connection\n * - connection - when connection is being established\n * - open - when connection ready to be used\n * - closed - after connection was closed be either side\n *\n * Emits:\n * - error - after the connection raised an error\n *\n * Options:\n * - useTLS - whether connection should be over TLS\n * - hostTLS - host to connect to when connection is over TLS\n * - hostNonTLS - host to connect to when connection is over TLS\n *\n * @param {String} key application key\n * @param {Object} options\n */\nexport default class TransportConnection extends EventsDispatcher {\n hooks: TransportHooks;\n name: string;\n priority: number;\n key: string;\n options: TransportConnectionOptions;\n state: string;\n timeline: Timeline;\n activityTimeout: number;\n id: number;\n socket: Socket;\n beforeOpen: Function;\n initialize: Function;\n\n constructor(\n hooks: TransportHooks,\n name: string,\n priority: number,\n key: string,\n options: TransportConnectionOptions,\n ) {\n super();\n this.initialize = Runtime.transportConnectionInitializer;\n this.hooks = hooks;\n this.name = name;\n this.priority = priority;\n this.key = key;\n this.options = options;\n\n this.state = 'new';\n this.timeline = options.timeline;\n this.activityTimeout = options.activityTimeout;\n this.id = this.timeline.generateUniqueID();\n }\n\n /** Checks whether the transport handles activity checks by itself.\n *\n * @return {Boolean}\n */\n handlesActivityChecks(): boolean {\n return Boolean(this.hooks.handlesActivityChecks);\n }\n\n /** Checks whether the transport supports the ping/pong API.\n *\n * @return {Boolean}\n */\n supportsPing(): boolean {\n return Boolean(this.hooks.supportsPing);\n }\n\n /** Tries to establish a connection.\n *\n * @returns {Boolean} false if transport is in invalid state\n */\n connect(): boolean {\n if (this.socket || this.state !== 'initialized') {\n return false;\n }\n\n var url = this.hooks.urls.getInitial(this.key, this.options);\n try {\n this.socket = this.hooks.getSocket(url, this.options);\n } catch (e) {\n Util.defer(() => {\n this.onError(e);\n this.changeState('closed');\n });\n return false;\n }\n\n this.bindListeners();\n\n Logger.debug('Connecting', { transport: this.name, url });\n this.changeState('connecting');\n return true;\n }\n\n /** Closes the connection.\n *\n * @return {Boolean} true if there was a connection to close\n */\n close(): boolean {\n if (this.socket) {\n this.socket.close();\n return true;\n } else {\n return false;\n }\n }\n\n /** Sends data over the open connection.\n *\n * @param {String} data\n * @return {Boolean} true only when in the \"open\" state\n */\n send(data: any): boolean {\n if (this.state === 'open') {\n // Workaround for MobileSafari bug (see https://gist.github.com/2052006)\n Util.defer(() => {\n if (this.socket) {\n this.socket.send(data);\n }\n });\n return true;\n } else {\n return false;\n }\n }\n\n /** Sends a ping if the connection is open and transport supports it. */\n ping() {\n if (this.state === 'open' && this.supportsPing()) {\n this.socket.ping();\n }\n }\n\n private onOpen() {\n if (this.hooks.beforeOpen) {\n this.hooks.beforeOpen(\n this.socket,\n this.hooks.urls.getPath(this.key, this.options),\n );\n }\n this.changeState('open');\n this.socket.onopen = undefined;\n }\n\n private onError(error) {\n this.emit('error', { type: 'WebSocketError', error: error });\n this.timeline.error(this.buildTimelineMessage({ error: error.toString() }));\n }\n\n private onClose(closeEvent?: any) {\n if (closeEvent) {\n this.changeState('closed', {\n code: closeEvent.code,\n reason: closeEvent.reason,\n wasClean: closeEvent.wasClean,\n });\n } else {\n this.changeState('closed');\n }\n this.unbindListeners();\n this.socket = undefined;\n }\n\n private onMessage(message) {\n this.emit('message', message);\n }\n\n private onActivity() {\n this.emit('activity');\n }\n\n private bindListeners() {\n this.socket.onopen = () => {\n this.onOpen();\n };\n this.socket.onerror = (error) => {\n this.onError(error);\n };\n this.socket.onclose = (closeEvent) => {\n this.onClose(closeEvent);\n };\n this.socket.onmessage = (message) => {\n this.onMessage(message);\n };\n\n if (this.supportsPing()) {\n this.socket.onactivity = () => {\n this.onActivity();\n };\n }\n }\n\n private unbindListeners() {\n if (this.socket) {\n this.socket.onopen = undefined;\n this.socket.onerror = undefined;\n this.socket.onclose = undefined;\n this.socket.onmessage = undefined;\n if (this.supportsPing()) {\n this.socket.onactivity = undefined;\n }\n }\n }\n\n private changeState(state: string, params?: any) {\n this.state = state;\n this.timeline.info(\n this.buildTimelineMessage({\n state: state,\n params: params,\n }),\n );\n this.emit(state, params);\n }\n\n buildTimelineMessage(message): any {\n return Collections.extend({ cid: this.id }, message);\n }\n}\n","import Factory from '../utils/factory';\nimport TransportHooks from './transport_hooks';\nimport TransportConnection from './transport_connection';\nimport TransportConnectionOptions from './transport_connection_options';\n\n/** Provides interface for transport connection instantiation.\n *\n * Takes transport-specific hooks as the only argument, which allow checking\n * for transport support and creating its connections.\n *\n * Supported hooks: * - file - the name of the file to be fetched during initialization\n * - urls - URL scheme to be used by transport\n * - handlesActivityCheck - true when the transport handles activity checks\n * - supportsPing - true when the transport has a ping/activity API\n * - isSupported - tells whether the transport is supported in the environment\n * - getSocket - creates a WebSocket-compatible transport socket\n *\n * See transports.js for specific implementations.\n *\n * @param {Object} hooks object containing all needed transport hooks\n */\nexport default class Transport {\n hooks: TransportHooks;\n\n constructor(hooks: TransportHooks) {\n this.hooks = hooks;\n }\n\n /** Returns whether the transport is supported in the environment.\n *\n * @param {Object} envronment te environment details (encryption, settings)\n * @returns {Boolean} true when the transport is supported\n */\n isSupported(environment: any): boolean {\n return this.hooks.isSupported(environment);\n }\n\n /** Creates a transport connection.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {String} key the application key\n * @param {Object} options\n * @returns {TransportConnection}\n */\n createConnection(\n name: string,\n priority: number,\n key: string,\n options: any,\n ): TransportConnection {\n return new TransportConnection(this.hooks, name, priority, key, options);\n }\n}\n","import * as URLSchemes from 'core/transports/url_schemes';\nimport URLScheme from 'core/transports/url_scheme';\nimport Transport from 'core/transports/transport';\nimport Util from 'core/util';\nimport * as Collections from 'core/utils/collections';\nimport TransportHooks from 'core/transports/transport_hooks';\nimport TransportsTable from 'core/transports/transports_table';\nimport Runtime from 'runtime';\n\n/** WebSocket transport.\n *\n * Uses native WebSocket implementation, including MozWebSocket supported by\n * earlier Firefox versions.\n */\nvar WSTransport = new Transport(<TransportHooks>{\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 <TransportHooks>(\n Collections.extend({}, streamingConfiguration, xhrConfiguration)\n ),\n);\n\n/** HTTP long-polling transport using CORS-enabled XMLHttpRequest. */\nvar XHRPollingTransport = new Transport(\n <TransportHooks>(\n Collections.extend({}, pollingConfiguration, xhrConfiguration)\n ),\n);\n\nvar Transports: TransportsTable = {\n ws: WSTransport,\n xhr_streaming: XHRStreamingTransport,\n xhr_polling: XHRPollingTransport,\n};\n\nexport default Transports;\n","import {\n default as Transports,\n streamingConfiguration,\n pollingConfiguration,\n} from 'isomorphic/transports/transports';\nimport Transport from 'core/transports/transport';\nimport TransportHooks from 'core/transports/transport_hooks';\nimport * as URLSchemes from 'core/transports/url_schemes';\nimport Runtime from 'runtime';\nimport { Dependencies } from '../dom/dependencies';\nimport * as Collections from 'core/utils/collections';\n\nvar SockJSTransport = new Transport(<TransportHooks>{\n file: 'sockjs',\n urls: URLSchemes.sockjs,\n handlesActivityChecks: true,\n supportsPing: false,\n\n isSupported: function () {\n return true;\n },\n isInitialized: function () {\n return window.SockJS !== undefined;\n },\n getSocket: function (url, options) {\n return new window.SockJS(url, null, {\n js_path: Dependencies.getPath('sockjs', {\n useTLS: options.useTLS,\n }),\n ignore_null_origin: options.ignoreNullOrigin,\n });\n },\n beforeOpen: function (socket, path) {\n socket.send(\n JSON.stringify({\n path: path,\n }),\n );\n },\n});\n\nvar xdrConfiguration = {\n isSupported: function (environment): boolean {\n var yes = Runtime.isXDRSupported(environment.useTLS);\n return yes;\n },\n};\n\n/** HTTP streaming transport using XDomainRequest (IE 8,9). */\nvar XDRStreamingTransport = new Transport(\n <TransportHooks>(\n Collections.extend({}, streamingConfiguration, xdrConfiguration)\n ),\n);\n\n/** HTTP long-polling transport using XDomainRequest (IE 8,9). */\nvar XDRPollingTransport = new Transport(\n <TransportHooks>(\n Collections.extend({}, pollingConfiguration, xdrConfiguration)\n ),\n);\n\nTransports.xdr_streaming = XDRStreamingTransport;\nTransports.xdr_polling = XDRPollingTransport;\nTransports.sockjs = SockJSTransport;\n\nexport default Transports;\n","import Reachability from 'core/reachability';\nimport { default as EventsDispatcher } from 'core/events/dispatcher';\n\n/** Really basic interface providing network availability info.\n *\n * Emits:\n * - online - when browser goes online\n * - offline - when browser goes offline\n */\nexport class NetInfo extends EventsDispatcher implements Reachability {\n constructor() {\n super();\n var self = this;\n // This is okay, as IE doesn't support this stuff anyway.\n if (window.addEventListener !== undefined) {\n window.addEventListener(\n 'online',\n function () {\n self.emit('online');\n },\n false,\n );\n window.addEventListener(\n 'offline',\n function () {\n self.emit('offline');\n },\n false,\n );\n }\n }\n\n /** Returns whether browser is online or not\n *\n * Offline means definitely offline (no connection to router).\n * Inverse does NOT mean definitely online (only currently supported in Safari\n * and even there only means the device has a connection to the router).\n *\n * @return {Boolean}\n */\n isOnline(): boolean {\n if (window.navigator.onLine === undefined) {\n return true;\n } else {\n return window.navigator.onLine;\n }\n }\n}\n\nexport var Network = new NetInfo();\n","import Util from '../util';\nimport * as Collections from '../utils/collections';\nimport TransportManager from './transport_manager';\nimport TransportConnection from './transport_connection';\nimport Transport from './transport';\nimport PingDelayOptions from './ping_delay_options';\n\n/** Creates transport connections monitored by a transport manager.\n *\n * When a transport is closed, it might mean the environment does not support\n * it. It's possible that messages get stuck in an intermediate buffer or\n * proxies terminate inactive connections. To combat these problems,\n * assistants monitor the connection lifetime, report unclean exits and\n * adjust ping timeouts to keep the connection active. The decision to disable\n * a transport is the manager's responsibility.\n *\n * @param {TransportManager} manager\n * @param {TransportConnection} transport\n * @param {Object} options\n */\nexport default class AssistantToTheTransportManager {\n manager: TransportManager;\n transport: Transport;\n minPingDelay: number;\n maxPingDelay: number;\n pingDelay: number;\n\n constructor(\n manager: TransportManager,\n transport: Transport,\n options: PingDelayOptions,\n ) {\n this.manager = manager;\n this.transport = transport;\n this.minPingDelay = options.minPingDelay;\n this.maxPingDelay = options.maxPingDelay;\n this.pingDelay = undefined;\n }\n\n /** Creates a transport connection.\n *\n * This function has the same API as Transport#createConnection.\n *\n * @param {String} name\n * @param {Number} priority\n * @param {String} key the application key\n * @param {Object} options\n * @returns {TransportConnection}\n */\n createConnection(\n name: string,\n priority: number,\n key: string,\n options: Object,\n ): TransportConnection {\n options = Collections.extend({}, options, {\n activityTimeout: this.pingDelay,\n });\n var connection = this.transport.createConnection(\n name,\n priority,\n key,\n options,\n );\n\n var openTimestamp = null;\n\n var onOpen = function () {\n connection.unbind('open', onOpen);\n connection.bind('closed', onClosed);\n openTimestamp = Util.now();\n };\n var onClosed = (closeEvent) => {\n connection.unbind('closed', onClosed);\n\n if (closeEvent.code === 1002 || closeEvent.code === 1003) {\n // we don't want to use transports not obeying the protocol\n this.manager.reportDeath();\n } else if (!closeEvent.wasClean && openTimestamp) {\n // report deaths only for short-living transport\n var lifespan = Util.now() - openTimestamp;\n if (lifespan < 2 * this.maxPingDelay) {\n this.manager.reportDeath();\n this.pingDelay = Math.max(lifespan / 2, this.minPingDelay);\n }\n }\n };\n\n connection.bind('open', onOpen);\n return connection;\n }\n\n /** Returns whether the transport is supported in the environment.\n *\n * This function has the same API as Transport#isSupported. Might return false\n * when the manager decides to kill the transport.\n *\n * @param {Object} environment the environment details (encryption, settings)\n * @returns {Boolean} true when the transport is supported\n */\n isSupported(environment: string): boolean {\n return this.manager.isAlive() && this.transport.isSupported(environment);\n }\n}\n","import Action from './action';\nimport { PusherEvent } from './message-types';\n/**\n * Provides functions for handling Pusher protocol-specific messages.\n */\n\nconst Protocol = {\n /**\n * Decodes a message in a Pusher format.\n *\n * The MessageEvent we receive from the transport should contain a pusher event\n * (https://pusher.com/docs/pusher_protocol#events) serialized as JSON in the\n * data field\n *\n * The pusher event may contain a data field too, and it may also be\n * serialised as JSON\n *\n * Throws errors when messages are not parse'able.\n *\n * @param {MessageEvent} messageEvent\n * @return {PusherEvent}\n */\n decodeMessage: function (messageEvent: MessageEvent): PusherEvent {\n try {\n var messageData = JSON.parse(messageEvent.data);\n var pusherEventData = messageData.data;\n if (typeof pusherEventData === 'string') {\n try {\n pusherEventData = JSON.parse(messageData.data);\n } catch (e) {}\n }\n var pusherEvent: PusherEvent = {\n event: messageData.event,\n channel: messageData.channel,\n data: pusherEventData,\n rawMessage: messageEvent.data, // Preserve raw message for delta compression\n };\n if (messageData.user_id) {\n pusherEvent.user_id = messageData.user_id;\n }\n // Copy sequence and conflation_key for delta compression\n // Server sends these as __delta_seq and __conflation_key\n const sequence = messageData.__delta_seq ?? messageData.sequence;\n const conflationKey =\n messageData.__conflation_key ?? messageData.conflation_key;\n if (typeof sequence === 'number') {\n (pusherEvent as any).sequence = sequence;\n }\n if (conflationKey !== undefined) {\n (pusherEvent as any).conflation_key = conflationKey;\n }\n return pusherEvent;\n } catch (e) {\n throw { type: 'MessageParseError', error: e, data: messageEvent.data };\n }\n },\n\n /**\n * Encodes a message to be sent.\n *\n * @param {PusherEvent} event\n * @return {String}\n */\n encodeMessage: function (event: PusherEvent): string {\n return JSON.stringify(event);\n },\n\n /**\n * Processes a handshake message and returns appropriate actions.\n *\n * Returns an object with an 'action' and other action-specific properties.\n *\n * There are three outcomes when calling this function. First is a successful\n * connection attempt, when pusher:connection_established is received, which\n * results in a 'connected' action with an 'id' property. When passed a\n * pusher:error event, it returns a result with action appropriate to the\n * close code and an error. Otherwise, it raises an exception.\n *\n * @param {String} message\n * @result Object\n */\n processHandshake: function (messageEvent: MessageEvent): Action {\n var message = Protocol.decodeMessage(messageEvent);\n\n if (message.event === 'pusher:connection_established') {\n if (!message.data.activity_timeout) {\n throw 'No activity timeout specified in handshake';\n }\n return {\n action: 'connected',\n id: message.data.socket_id,\n activityTimeout: message.data.activity_timeout * 1000,\n };\n } else if (message.event === 'pusher:error') {\n // From protocol 6 close codes are sent only once, so this only\n // happens when connection does not support close codes\n return {\n action: this.getCloseAction(message.data),\n error: this.getCloseError(message.data),\n };\n } else {\n throw 'Invalid handshake';\n }\n },\n\n /**\n * Dispatches the close event and returns an appropriate action name.\n *\n * See:\n * 1. https://developer.mozilla.org/en-US/docs/WebSockets/WebSockets_reference/CloseEvent\n * 2. http://pusher.com/docs/pusher_protocol\n *\n * @param {CloseEvent} closeEvent\n * @return {String} close action name\n */\n getCloseAction: function (closeEvent): string {\n if (closeEvent.code < 4000) {\n // ignore 1000 CLOSE_NORMAL, 1001 CLOSE_GOING_AWAY,\n // 1005 CLOSE_NO_STATUS, 1006 CLOSE_ABNORMAL\n // ignore 1007...3999\n // handle 1002 CLOSE_PROTOCOL_ERROR, 1003 CLOSE_UNSUPPORTED,\n // 1004 CLOSE_TOO_LARGE\n if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {\n return 'backoff';\n } else {\n return null;\n }\n } else if (closeEvent.code === 4000) {\n return 'tls_only';\n } else if (closeEvent.code < 4100) {\n return 'refused';\n } else if (closeEvent.code < 4200) {\n return 'backoff';\n } else if (closeEvent.code < 4300) {\n return 'retry';\n } else {\n // unknown error\n return 'refused';\n }\n },\n\n /**\n * Returns an error or null basing on the close event.\n *\n * Null is returned when connection was closed cleanly. Otherwise, an object\n * with error details is returned.\n *\n * @param {CloseEvent} closeEvent\n * @return {Object} error object\n */\n getCloseError: function (closeEvent): any {\n if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {\n return {\n type: 'PusherError',\n data: {\n code: closeEvent.code,\n message: closeEvent.reason || closeEvent.message,\n },\n };\n } else {\n return null;\n }\n },\n};\n\nexport default Protocol;\n","import * as Collections from '../utils/collections';\nimport { default as EventsDispatcher } from '../events/dispatcher';\nimport Protocol from './protocol/protocol';\nimport { PusherEvent } from './protocol/message-types';\nimport Logger from '../logger';\nimport TransportConnection from '../transports/transport_connection';\nimport Socket from '../socket';\n/**\n * Provides Pusher protocol interface for transports.\n *\n * Emits following events:\n * - message - on received messages\n * - ping - on ping requests\n * - pong - on pong responses\n * - error - when the transport emits an error\n * - closed - after closing the transport\n *\n * It also emits more events when connection closes with a code.\n * See Protocol.getCloseAction to get more details.\n *\n * @param {Number} id\n * @param {AbstractTransport} transport\n */\nexport default class Connection extends EventsDispatcher implements Socket {\n id: string;\n transport: TransportConnection;\n activityTimeout: number;\n\n constructor(id: string, transport: TransportConnection) {\n super();\n this.id = id;\n this.transport = transport;\n this.activityTimeout = transport.activityTimeout;\n this.bindListeners();\n }\n\n /** Returns whether used transport handles activity checks by itself\n *\n * @returns {Boolean} true if activity checks are handled by the transport\n */\n handlesActivityChecks() {\n return this.transport.handlesActivityChecks();\n }\n\n /** Sends raw data.\n *\n * @param {String} data\n */\n send(data: any): boolean {\n return this.transport.send(data);\n }\n\n /** Sends an event.\n *\n * @param {String} name\n * @param {String} data\n * @param {String} [channel]\n * @returns {Boolean} whether message was sent or not\n */\n send_event(name: string, data: any, channel?: string): boolean {\n var event: PusherEvent = { event: name, data: data };\n if (channel) {\n event.channel = channel;\n }\n Logger.debug('Event sent', event);\n return this.send(Protocol.encodeMessage(event));\n }\n\n /** Sends a ping message to the server.\n *\n * Basing on the underlying transport, it might send either transport's\n * protocol-specific ping or pusher:ping event.\n */\n ping() {\n if (this.transport.supportsPing()) {\n this.transport.ping();\n } else {\n this.send_event('pusher:ping', {});\n }\n }\n\n /** Closes the connection. */\n close() {\n this.transport.close();\n }\n\n private bindListeners() {\n var listeners = {\n message: (messageEvent: MessageEvent) => {\n var pusherEvent;\n try {\n pusherEvent = Protocol.decodeMessage(messageEvent);\n } catch (e) {\n this.emit('error', {\n type: 'MessageParseError',\n error: e,\n data: messageEvent.data,\n });\n }\n\n if (pusherEvent !== undefined) {\n Logger.debug('Event recd', pusherEvent);\n\n switch (pusherEvent.event) {\n case 'pusher:error':\n this.emit('error', {\n type: 'PusherError',\n data: pusherEvent.data,\n });\n break;\n case 'pusher:ping':\n this.emit('ping');\n break;\n case 'pusher:pong':\n this.emit('pong');\n break;\n }\n this.emit('message', pusherEvent);\n }\n },\n activity: () => {\n this.emit('activity');\n },\n error: (error) => {\n this.emit('error', error);\n },\n closed: (closeEvent) => {\n unbindListeners();\n\n if (closeEvent && closeEvent.code) {\n this.handleCloseEvent(closeEvent);\n }\n\n this.transport = null;\n this.emit('closed');\n },\n };\n\n var unbindListeners = () => {\n Collections.objectApply(listeners, (listener, event) => {\n this.transport.unbind(event, listener);\n });\n };\n\n Collections.objectApply(listeners, (listener, event) => {\n this.transport.bind(event, listener);\n });\n }\n\n private handleCloseEvent(closeEvent: any) {\n var action = Protocol.getCloseAction(closeEvent);\n var error = Protocol.getCloseError(closeEvent);\n if (error) {\n this.emit('error', error);\n }\n if (action) {\n this.emit(action, { action: action, error: error });\n }\n }\n}\n","import Util from '../../util';\nimport * as Collections from '../../utils/collections';\nimport Protocol from '../protocol/protocol';\nimport Connection from '../connection';\nimport TransportConnection from '../../transports/transport_connection';\nimport HandshakePayload from './handshake_payload';\n\n/**\n * Handles Pusher protocol handshakes for transports.\n *\n * Calls back with a result object after handshake is completed. Results\n * always have two fields:\n * - action - string describing action to be taken after the handshake\n * - transport - the transport object passed to the constructor\n *\n * Different actions can set different additional properties on the result.\n * In the case of 'connected' action, there will be a 'connection' property\n * containing a Connection object for the transport. Other actions should\n * carry an 'error' property.\n *\n * @param {AbstractTransport} transport\n * @param {Function} callback\n */\nexport default class Handshake {\n transport: TransportConnection;\n callback: (HandshakePayload) => void;\n onMessage: Function;\n onClosed: Function;\n\n constructor(\n transport: TransportConnection,\n callback: (HandshakePayload) => void,\n ) {\n this.transport = transport;\n this.callback = callback;\n this.bindListeners();\n }\n\n close() {\n this.unbindListeners();\n this.transport.close();\n }\n\n private bindListeners() {\n this.onMessage = (m) => {\n this.unbindListeners();\n\n var result;\n try {\n result = Protocol.processHandshake(m);\n } catch (e) {\n this.finish('error', { error: e });\n this.transport.close();\n return;\n }\n\n if (result.action === 'connected') {\n this.finish('connected', {\n connection: new Connection(result.id, this.transport),\n activityTimeout: result.activityTimeout,\n });\n } else {\n this.finish(result.action, { error: result.error });\n this.transport.close();\n }\n };\n\n this.onClosed = (closeEvent) => {\n this.unbindListeners();\n\n var action = Protocol.getCloseAction(closeEvent) || 'backoff';\n var error = Protocol.getCloseError(closeEvent);\n this.finish(action, { error: error });\n };\n\n this.transport.bind('message', this.onMessage);\n this.transport.bind('closed', this.onClosed);\n }\n\n private unbindListeners() {\n this.transport.unbind('message', this.onMessage);\n this.transport.unbind('closed', this.onClosed);\n }\n\n private finish(action: string, params: any) {\n this.callback(\n Collections.extend({ transport: this.transport, action: action }, params),\n );\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport base64encode from '../base64';\nimport Timeline from './timeline';\nimport Runtime from 'runtime';\n\nexport interface TimelineSenderOptions {\n host?: string;\n port?: number;\n path?: string;\n}\n\nexport default class TimelineSender {\n timeline: Timeline;\n options: TimelineSenderOptions;\n host: string;\n\n constructor(timeline: Timeline, options: TimelineSenderOptions) {\n this.timeline = timeline;\n this.options = options || {};\n }\n\n send(useTLS: boolean, callback?: Function) {\n if (this.timeline.isEmpty()) {\n return;\n }\n\n this.timeline.send(\n Runtime.TimelineTransport.getAgent(this, useTLS),\n callback,\n );\n }\n}\n","import { default as EventsDispatcher } from '../events/dispatcher';\nimport * as Errors from '../errors';\nimport Logger from '../logger';\nimport Pusher from '../pusher';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport Metadata from './metadata';\nimport UrlStore from '../utils/url_store';\nimport {\n ChannelAuthorizationData,\n ChannelAuthorizationCallback,\n} from '../auth/options';\nimport { HTTPAuthError } from '../errors';\nimport { FilterNode } from './filter';\n\n/** Provides base public channel interface with an event emitter.\n *\n * Emits:\n * - pusher:subscription_succeeded - after subscribing successfully\n * - other non-internal events\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class Channel extends EventsDispatcher {\n name: string;\n pusher: Pusher;\n subscribed: boolean;\n subscriptionPending: boolean;\n subscriptionCancelled: boolean;\n subscriptionCount: null;\n tagsFilter: FilterNode | null;\n\n constructor(name: string, pusher: Pusher) {\n super(function (event, data) {\n Logger.debug('No callbacks on ' + name + ' for ' + event);\n });\n\n this.name = name;\n this.pusher = pusher;\n this.subscribed = false;\n this.subscriptionPending = false;\n this.subscriptionCancelled = false;\n this.tagsFilter = null;\n }\n\n /** Skips authorization, since public channels don't require it.\n *\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n return callback(null, { auth: '' });\n }\n\n /** Triggers an event */\n trigger(event: string, data: any) {\n if (event.indexOf('client-') !== 0) {\n throw new Errors.BadEventName(\n \"Event '\" + event + \"' does not start with 'client-'\",\n );\n }\n if (!this.subscribed) {\n var suffix = UrlStore.buildLogSuffix('triggeringClientEvents');\n Logger.warn(\n `Client event triggered before channel 'subscription_succeeded' event . ${suffix}`,\n );\n }\n return this.pusher.send_event(event, data, this.name);\n }\n\n /** Signals disconnection to the channel. For internal use only. */\n disconnect() {\n this.subscribed = false;\n this.subscriptionPending = false;\n }\n\n /** Handles a PusherEvent. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n if (eventName === 'pusher_internal:subscription_succeeded') {\n this.handleSubscriptionSucceededEvent(event);\n } else if (eventName === 'pusher_internal:subscription_count') {\n this.handleSubscriptionCountEvent(event);\n } else if (eventName.indexOf('pusher_internal:') !== 0) {\n var metadata: Metadata = {};\n this.emit(eventName, data, metadata);\n }\n }\n\n handleSubscriptionSucceededEvent(event: PusherEvent) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n } else {\n this.emit('pusher:subscription_succeeded', event.data);\n }\n }\n\n handleSubscriptionCountEvent(event: PusherEvent) {\n if (event.data.subscription_count) {\n this.subscriptionCount = event.data.subscription_count;\n }\n\n this.emit('pusher:subscription_count', event.data);\n }\n\n /** Sends a subscription request. For internal use only. */\n subscribe() {\n if (this.subscribed) {\n return;\n }\n this.subscriptionPending = true;\n this.subscriptionCancelled = false;\n this.authorize(\n this.pusher.connection.socket_id,\n (error: Error | null, data: ChannelAuthorizationData) => {\n if (error) {\n this.subscriptionPending = false;\n // Why not bind to 'pusher:subscription_error' a level up, and log there?\n // Binding to this event would cause the warning about no callbacks being\n // bound (see constructor) to be suppressed, that's not what we want.\n Logger.error(error.toString());\n this.emit(\n 'pusher:subscription_error',\n Object.assign(\n {},\n {\n type: 'AuthError',\n error: error.message,\n },\n error instanceof HTTPAuthError ? { status: error.status } : {},\n ),\n );\n } else {\n const subscribeData: any = {\n auth: data.auth,\n channel_data: data.channel_data,\n channel: this.name,\n };\n\n // Add tags filter if present\n if (this.tagsFilter) {\n subscribeData.tags_filter = this.tagsFilter;\n }\n\n this.pusher.send_event('pusher:subscribe', subscribeData);\n }\n },\n );\n }\n\n /** Sends an unsubscription request. For internal use only. */\n unsubscribe() {\n this.subscribed = false;\n this.pusher.send_event('pusher:unsubscribe', {\n channel: this.name,\n });\n }\n\n /** Cancels an in progress subscription. For internal use only. */\n cancelSubscription() {\n this.subscriptionCancelled = true;\n }\n\n /** Reinstates an in progress subscripiton. For internal use only. */\n reinstateSubscription() {\n this.subscriptionCancelled = false;\n }\n}\n","import Factory from '../utils/factory';\nimport Channel from './channel';\nimport { ChannelAuthorizationCallback } from '../auth/options';\n\n/** Extends public channels to provide private channel interface.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class PrivateChannel extends Channel {\n /** Authorizes the connection to use the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n return this.pusher.config.channelAuthorizer(\n {\n channelName: this.name,\n socketId: socketId,\n },\n callback,\n );\n }\n}\n","import * as Collections from '../utils/collections';\n\n/** Represents a collection of members of a presence channel. */\nexport default class Members {\n members: any;\n count: number;\n myID: any;\n me: any;\n\n constructor() {\n this.reset();\n }\n\n /** Returns member's info for given id.\n *\n * Resulting object containts two fields - id and info.\n *\n * @param {Number} id\n * @return {Object} member's info or null\n */\n get(id: string): any {\n if (Object.prototype.hasOwnProperty.call(this.members, id)) {\n return {\n id: id,\n info: this.members[id],\n };\n } else {\n return null;\n }\n }\n\n /** Calls back for each member in unspecified order.\n *\n * @param {Function} callback\n */\n each(callback: Function) {\n Collections.objectApply(this.members, (member, id) => {\n callback(this.get(id));\n });\n }\n\n /** Updates the id for connected member. For internal use only. */\n setMyID(id: string) {\n this.myID = id;\n }\n\n /** Handles subscription data. For internal use only. */\n onSubscription(subscriptionData: any) {\n this.members = subscriptionData.presence.hash;\n this.count = subscriptionData.presence.count;\n this.me = this.get(this.myID);\n }\n\n /** Adds a new member to the collection. For internal use only. */\n addMember(memberData: any) {\n if (this.get(memberData.user_id) === null) {\n this.count++;\n }\n this.members[memberData.user_id] = memberData.user_info;\n return this.get(memberData.user_id);\n }\n\n /** Adds a member from the collection. For internal use only. */\n removeMember(memberData: any) {\n var member = this.get(memberData.user_id);\n if (member) {\n delete this.members[memberData.user_id];\n this.count--;\n }\n return member;\n }\n\n /** Resets the collection to the initial state. For internal use only. */\n reset() {\n this.members = {};\n this.count = 0;\n this.myID = null;\n this.me = null;\n }\n}\n","import PrivateChannel from './private_channel';\nimport Logger from '../logger';\nimport Members from './members';\nimport Pusher from '../pusher';\nimport UrlStore from 'core/utils/url_store';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport Metadata from './metadata';\nimport { ChannelAuthorizationData } from '../auth/options';\n\nexport default class PresenceChannel extends PrivateChannel {\n members: Members;\n\n /** Adds presence channel functionality to private channels.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\n constructor(name: string, pusher: Pusher) {\n super(name, pusher);\n this.members = new Members();\n }\n\n /** Authorizes the connection as a member of the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: Function) {\n super.authorize(socketId, async (error, authData) => {\n if (!error) {\n authData = authData as ChannelAuthorizationData;\n if (authData.channel_data != null) {\n var channelData = JSON.parse(authData.channel_data);\n this.members.setMyID(channelData.user_id);\n } else {\n await this.pusher.user.signinDonePromise;\n if (this.pusher.user.user_data != null) {\n // If the user is signed in, get the id of the authenticated user\n // and allow the presence authorization to continue.\n this.members.setMyID(this.pusher.user.user_data.id);\n } else {\n let suffix = UrlStore.buildLogSuffix('authorizationEndpoint');\n Logger.error(\n `Invalid auth response for channel '${this.name}', ` +\n `expected 'channel_data' field. ${suffix}, ` +\n `or the user should be signed in.`,\n );\n callback('Invalid auth response');\n return;\n }\n }\n }\n callback(error, authData);\n });\n }\n\n /** Handles presence and subscription events. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n if (eventName.indexOf('pusher_internal:') === 0) {\n this.handleInternalEvent(event);\n } else {\n var data = event.data;\n var metadata: Metadata = {};\n if (event.user_id) {\n metadata.user_id = event.user_id;\n }\n this.emit(eventName, data, metadata);\n }\n }\n handleInternalEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n switch (eventName) {\n case 'pusher_internal:subscription_succeeded':\n this.handleSubscriptionSucceededEvent(event);\n break;\n case 'pusher_internal:subscription_count':\n this.handleSubscriptionCountEvent(event);\n break;\n case 'pusher_internal:member_added':\n var addedMember = this.members.addMember(data);\n this.emit('pusher:member_added', addedMember);\n break;\n case 'pusher_internal:member_removed':\n var removedMember = this.members.removeMember(data);\n if (removedMember) {\n this.emit('pusher:member_removed', removedMember);\n }\n break;\n }\n }\n\n handleSubscriptionSucceededEvent(event: PusherEvent) {\n this.subscriptionPending = false;\n this.subscribed = true;\n if (this.subscriptionCancelled) {\n this.pusher.unsubscribe(this.name);\n } else {\n this.members.onSubscription(event.data);\n this.emit('pusher:subscription_succeeded', this.members);\n }\n }\n\n /** Resets the channel state, including members map. For internal use only. */\n disconnect() {\n this.members.reset();\n super.disconnect();\n }\n}\n","\"use strict\";\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package utf8 implements UTF-8 encoding and decoding.\n */\nvar INVALID_UTF16 = \"utf8: invalid string\";\nvar INVALID_UTF8 = \"utf8: invalid source encoding\";\n/**\n * Encodes the given string into UTF-8 byte array.\n * Throws if the source string has invalid UTF-16 encoding.\n */\nfunction encode(s) {\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 var arr = new Uint8Array(encodedLength(s));\n var pos = 0;\n for (var i = 0; i < s.length; i++) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n arr[pos++] = c;\n }\n else if (c < 0x800) {\n arr[pos++] = 0xc0 | c >> 6;\n arr[pos++] = 0x80 | c & 0x3f;\n }\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 }\n else {\n i++; // get one more character\n c = (c & 0x3ff) << 10;\n c |= s.charCodeAt(i) & 0x3ff;\n c += 0x10000;\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}\nexports.encode = encode;\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 */\nfunction encodedLength(s) {\n var result = 0;\n for (var i = 0; i < s.length; i++) {\n var c = s.charCodeAt(i);\n if (c < 0x80) {\n result += 1;\n }\n else if (c < 0x800) {\n result += 2;\n }\n else if (c < 0xd800) {\n result += 3;\n }\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 }\n else {\n throw new Error(INVALID_UTF16);\n }\n }\n return result;\n}\nexports.encodedLength = encodedLength;\n/**\n * Decodes the given byte array from UTF-8 into a string.\n * Throws if encoding is invalid.\n */\nfunction decode(arr) {\n var chars = [];\n for (var i = 0; i < arr.length; i++) {\n var b = arr[i];\n if (b & 0x80) {\n var min = void 0;\n if (b < 0xe0) {\n // Need 1 more byte.\n if (i >= arr.length) {\n throw new Error(INVALID_UTF8);\n }\n var 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 }\n else if (b < 0xf0) {\n // Need 2 more bytes.\n if (i >= arr.length - 1) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n var 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 }\n else if (b < 0xf8) {\n // Need 3 more bytes.\n if (i >= arr.length - 2) {\n throw new Error(INVALID_UTF8);\n }\n var n1 = arr[++i];\n var n2 = arr[++i];\n var 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 }\n else {\n throw new Error(INVALID_UTF8);\n }\n if (b < min || (b >= 0xd800 && b <= 0xdfff)) {\n throw new Error(INVALID_UTF8);\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 chars.push(String.fromCharCode(b));\n }\n return chars.join(\"\");\n}\nexports.decode = decode;\n//# sourceMappingURL=utf8.js.map","\"use strict\";\n// Copyright (C) 2016 Dmitry Chestnykh\n// MIT License. See LICENSE file for details.\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Package base64 implements Base64 encoding and decoding.\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.\nvar INVALID_BYTE = 256;\n/**\n * Implements standard Base64 encoding.\n *\n * Operates in constant time.\n */\nvar Coder = /** @class */ (function () {\n // TODO(dchest): methods to encode chunk-by-chunk.\n function Coder(_paddingCharacter) {\n if (_paddingCharacter === void 0) { _paddingCharacter = \"=\"; }\n this._paddingCharacter = _paddingCharacter;\n }\n Coder.prototype.encodedLength = function (length) {\n if (!this._paddingCharacter) {\n return (length * 8 + 5) / 6 | 0;\n }\n return (length + 2) / 3 * 4 | 0;\n };\n Coder.prototype.encode = function (data) {\n var out = \"\";\n var i = 0;\n for (; i < data.length - 2; i += 3) {\n var 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 var left = data.length - i;\n if (left > 0) {\n var 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 }\n else {\n out += this._paddingCharacter || \"\";\n }\n out += this._paddingCharacter || \"\";\n }\n return out;\n };\n Coder.prototype.maxDecodedLength = function (length) {\n if (!this._paddingCharacter) {\n return (length * 6 + 7) / 8 | 0;\n }\n return length / 4 * 3 | 0;\n };\n Coder.prototype.decodedLength = function (s) {\n return this.maxDecodedLength(s.length - this._getPaddingLength(s));\n };\n Coder.prototype.decode = function (s) {\n if (s.length === 0) {\n return new Uint8Array(0);\n }\n var paddingLength = this._getPaddingLength(s);\n var length = s.length - paddingLength;\n var out = new Uint8Array(this.maxDecodedLength(length));\n var op = 0;\n var i = 0;\n var haveBad = 0;\n var 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 // 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 // Encode 6 bits in b into a new character.\n Coder.prototype._encodeByte = function (b) {\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 var 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 return String.fromCharCode(result);\n };\n // Decode a character code into a byte.\n // Must return 256 if character is out of alphabet range.\n Coder.prototype._decodeChar = function (c) {\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 var result = INVALID_BYTE; // start with invalid character\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 return result;\n };\n Coder.prototype._getPaddingLength = function (s) {\n var paddingLength = 0;\n if (this._paddingCharacter) {\n for (var 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 return Coder;\n}());\nexports.Coder = Coder;\nvar stdCoder = new Coder();\nfunction encode(data) {\n return stdCoder.encode(data);\n}\nexports.encode = encode;\nfunction decode(s) {\n return stdCoder.decode(s);\n}\nexports.decode = decode;\n/**\n * Implements URL-safe Base64 encoding.\n * (Same as Base64, but '+' is replaced with '-', and '/' with '_').\n *\n * Operates in constant time.\n */\nvar URLSafeCoder = /** @class */ (function (_super) {\n __extends(URLSafeCoder, _super);\n function URLSafeCoder() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\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 URLSafeCoder.prototype._encodeByte = function (b) {\n var 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 return String.fromCharCode(result);\n };\n URLSafeCoder.prototype._decodeChar = function (c) {\n var result = INVALID_BYTE;\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 return result;\n };\n return URLSafeCoder;\n}(Coder));\nexports.URLSafeCoder = URLSafeCoder;\nvar urlSafeCoder = new URLSafeCoder();\nfunction encodeURLSafe(data) {\n return urlSafeCoder.encode(data);\n}\nexports.encodeURLSafe = encodeURLSafe;\nfunction decodeURLSafe(s) {\n return urlSafeCoder.decode(s);\n}\nexports.decodeURLSafe = decodeURLSafe;\nexports.encodedLength = function (length) {\n return stdCoder.encodedLength(length);\n};\nexports.maxDecodedLength = function (length) {\n return stdCoder.maxDecodedLength(length);\n};\nexports.decodedLength = function (s) {\n return stdCoder.decodedLength(s);\n};\n//# sourceMappingURL=base64.js.map","import PrivateChannel from './private_channel';\nimport * as Errors from '../errors';\nimport Logger from '../logger';\nimport Pusher from '../pusher';\nimport { decode as encodeUTF8 } from '@stablelib/utf8';\nimport { decode as decodeBase64 } from '@stablelib/base64';\nimport Dispatcher from '../events/dispatcher';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport {\n ChannelAuthorizationData,\n ChannelAuthorizationCallback,\n} from '../auth/options';\nimport * as nacl from 'tweetnacl';\n\n/** Extends private channels to provide encrypted channel interface.\n *\n * @param {String} name\n * @param {Pusher} pusher\n */\nexport default class EncryptedChannel extends PrivateChannel {\n key: Uint8Array = null;\n nacl: nacl;\n\n constructor(name: string, pusher: Pusher, nacl: nacl) {\n super(name, pusher);\n this.nacl = nacl;\n }\n\n /** Authorizes the connection to use the channel.\n *\n * @param {String} socketId\n * @param {Function} callback\n */\n authorize(socketId: string, callback: ChannelAuthorizationCallback) {\n super.authorize(\n socketId,\n (error: Error | null, authData: ChannelAuthorizationData) => {\n if (error) {\n callback(error, authData);\n return;\n }\n let sharedSecret = authData['shared_secret'];\n if (!sharedSecret) {\n callback(\n new Error(\n `No shared_secret key in auth payload for encrypted channel: ${this.name}`,\n ),\n null,\n );\n return;\n }\n this.key = decodeBase64(sharedSecret);\n delete authData['shared_secret'];\n callback(null, authData);\n },\n );\n }\n\n trigger(event: string, data: any): boolean {\n throw new Errors.UnsupportedFeature(\n 'Client events are not currently supported for encrypted channels',\n );\n }\n\n /** Handles an event. For internal use only.\n *\n * @param {PusherEvent} event\n */\n handleEvent(event: PusherEvent) {\n var eventName = event.event;\n var data = event.data;\n if (\n eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0\n ) {\n super.handleEvent(event);\n return;\n }\n this.handleEncryptedEvent(eventName, data);\n }\n\n private handleEncryptedEvent(event: string, data: any): void {\n if (!this.key) {\n Logger.debug(\n 'Received encrypted event before key has been retrieved from the authEndpoint',\n );\n return;\n }\n if (!data.ciphertext || !data.nonce) {\n Logger.error(\n 'Unexpected format for encrypted event, expected object with `ciphertext` and `nonce` fields, got: ' +\n data,\n );\n return;\n }\n let cipherText = decodeBase64(data.ciphertext);\n if (cipherText.length < this.nacl.secretbox.overheadLength) {\n Logger.error(\n `Expected encrypted event ciphertext length to be ${this.nacl.secretbox.overheadLength}, got: ${cipherText.length}`,\n );\n return;\n }\n let nonce = decodeBase64(data.nonce);\n if (nonce.length < this.nacl.secretbox.nonceLength) {\n Logger.error(\n `Expected encrypted event nonce length to be ${this.nacl.secretbox.nonceLength}, got: ${nonce.length}`,\n );\n return;\n }\n\n let bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n Logger.debug(\n 'Failed to decrypt an event, probably because it was encrypted with a different key. Fetching a new key from the authEndpoint...',\n );\n // Try a single time to retrieve a new auth key and decrypt the event with it\n // If this fails, a new key will be requested when a new message is received\n this.authorize(this.pusher.connection.socket_id, (error, authData) => {\n if (error) {\n Logger.error(\n `Failed to make a request to the authEndpoint: ${authData}. Unable to fetch new key, so dropping encrypted event`,\n );\n return;\n }\n bytes = this.nacl.secretbox.open(cipherText, nonce, this.key);\n if (bytes === null) {\n Logger.error(\n `Failed to decrypt event with new key. Dropping encrypted event`,\n );\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n return;\n });\n return;\n }\n this.emit(event, this.getDataToEmit(bytes));\n }\n\n // Try and parse the decrypted bytes as JSON. If we can't parse it, just\n // return the utf-8 string\n getDataToEmit(bytes: Uint8Array): string {\n let raw = encodeUTF8(bytes);\n try {\n return JSON.parse(raw);\n } catch {\n return raw;\n }\n }\n}\n","import { default as EventsDispatcher } from '../events/dispatcher';\nimport { OneOffTimer as Timer } from '../utils/timers';\nimport { Config } from '../config';\nimport Logger from '../logger';\nimport HandshakePayload from './handshake/handshake_payload';\nimport Connection from './connection';\nimport Strategy from '../strategies/strategy';\nimport StrategyRunner from '../strategies/strategy_runner';\nimport * as Collections from '../utils/collections';\nimport Timeline from '../timeline/timeline';\nimport ConnectionManagerOptions from './connection_manager_options';\nimport Runtime from 'runtime';\n\nimport {\n ErrorCallbacks,\n HandshakeCallbacks,\n ConnectionCallbacks,\n} from './callbacks';\nimport Action from './protocol/action';\n\n/** Manages connection to Pusher.\n *\n * Uses a strategy (currently only default), timers and network availability\n * info to establish a connection and export its state. In case of failures,\n * manages reconnection attempts.\n *\n * Exports state changes as following events:\n * - \"state_change\", { previous: p, current: state }\n * - state\n *\n * States:\n * - initialized - initial state, never transitioned to\n * - connecting - connection is being established\n * - connected - connection has been fully established\n * - disconnected - on requested disconnection\n * - unavailable - after connection timeout or when there's no network\n * - failed - when the connection strategy is not supported\n *\n * Options:\n * - unavailableTimeout - time to transition to unavailable state\n * - activityTimeout - time after which ping message should be sent\n * - pongTimeout - time for Pusher to respond with pong before reconnecting\n *\n * @param {String} key application key\n * @param {Object} options\n */\nexport default class ConnectionManager extends EventsDispatcher {\n key: string;\n options: ConnectionManagerOptions;\n state: string;\n connection: Connection;\n usingTLS: boolean;\n timeline: Timeline;\n socket_id: string;\n unavailableTimer: Timer;\n activityTimer: Timer;\n retryTimer: Timer;\n activityTimeout: number;\n strategy: Strategy;\n runner: StrategyRunner;\n errorCallbacks: ErrorCallbacks;\n handshakeCallbacks: HandshakeCallbacks;\n connectionCallbacks: ConnectionCallbacks;\n\n constructor(key: string, options: ConnectionManagerOptions) {\n super();\n this.state = 'initialized';\n this.connection = null;\n\n this.key = key;\n this.options = options;\n this.timeline = this.options.timeline;\n this.usingTLS = this.options.useTLS;\n\n this.errorCallbacks = this.buildErrorCallbacks();\n this.connectionCallbacks = this.buildConnectionCallbacks(\n this.errorCallbacks,\n );\n this.handshakeCallbacks = this.buildHandshakeCallbacks(this.errorCallbacks);\n\n var Network = Runtime.getNetwork();\n\n Network.bind('online', () => {\n this.timeline.info({ netinfo: 'online' });\n if (this.state === 'connecting' || this.state === 'unavailable') {\n this.retryIn(0);\n }\n });\n Network.bind('offline', () => {\n this.timeline.info({ netinfo: 'offline' });\n if (this.connection) {\n this.sendActivityCheck();\n }\n });\n\n this.updateStrategy();\n }\n\n /** Establishes a connection to Pusher.\n *\n * Does nothing when connection is already established. See top-level doc\n * to find events emitted on connection attempts.\n */\n connect() {\n if (this.connection || this.runner) {\n return;\n }\n if (!this.strategy.isSupported()) {\n this.updateState('failed');\n return;\n }\n this.updateState('connecting');\n this.startConnecting();\n this.setUnavailableTimer();\n }\n\n /** Sends raw data.\n *\n * @param {String} data\n */\n send(data) {\n if (this.connection) {\n return this.connection.send(data);\n } else {\n return false;\n }\n }\n\n /** Sends an event.\n *\n * @param {String} name\n * @param {String} data\n * @param {String} [channel]\n * @returns {Boolean} whether message was sent or not\n */\n send_event(name: string, data: any, channel?: string) {\n if (this.connection) {\n return this.connection.send_event(name, data, channel);\n } else {\n return false;\n }\n }\n\n /** Closes the connection. */\n disconnect() {\n this.disconnectInternally();\n this.updateState('disconnected');\n }\n\n isUsingTLS() {\n return this.usingTLS;\n }\n\n private startConnecting() {\n var callback = (error, handshake) => {\n if (error) {\n this.runner = this.strategy.connect(0, callback);\n } else {\n if (handshake.action === 'error') {\n this.emit('error', {\n type: 'HandshakeError',\n error: handshake.error,\n });\n this.timeline.error({ handshakeError: handshake.error });\n } else {\n this.abortConnecting(); // we don't support switching connections yet\n this.handshakeCallbacks[handshake.action](handshake);\n }\n }\n };\n this.runner = this.strategy.connect(0, callback);\n }\n\n private abortConnecting() {\n if (this.runner) {\n this.runner.abort();\n this.runner = null;\n }\n }\n\n private disconnectInternally() {\n this.abortConnecting();\n this.clearRetryTimer();\n this.clearUnavailableTimer();\n if (this.connection) {\n var connection = this.abandonConnection();\n connection.close();\n }\n }\n\n private updateStrategy() {\n this.strategy = this.options.getStrategy({\n key: this.key,\n timeline: this.timeline,\n useTLS: this.usingTLS,\n });\n }\n\n private retryIn(delay) {\n this.timeline.info({ action: 'retry', delay: delay });\n if (delay > 0) {\n this.emit('connecting_in', Math.round(delay / 1000));\n }\n this.retryTimer = new Timer(delay || 0, () => {\n this.disconnectInternally();\n this.connect();\n });\n }\n\n private clearRetryTimer() {\n if (this.retryTimer) {\n this.retryTimer.ensureAborted();\n this.retryTimer = null;\n }\n }\n\n private setUnavailableTimer() {\n this.unavailableTimer = new Timer(this.options.unavailableTimeout, () => {\n this.updateState('unavailable');\n });\n }\n\n private clearUnavailableTimer() {\n if (this.unavailableTimer) {\n this.unavailableTimer.ensureAborted();\n }\n }\n\n private sendActivityCheck() {\n this.stopActivityCheck();\n this.connection.ping();\n // wait for pong response\n this.activityTimer = new Timer(this.options.pongTimeout, () => {\n this.timeline.error({ pong_timed_out: this.options.pongTimeout });\n this.retryIn(0);\n });\n }\n\n private resetActivityCheck() {\n this.stopActivityCheck();\n // send ping after inactivity\n if (this.connection && !this.connection.handlesActivityChecks()) {\n this.activityTimer = new Timer(this.activityTimeout, () => {\n this.sendActivityCheck();\n });\n }\n }\n\n private stopActivityCheck() {\n if (this.activityTimer) {\n this.activityTimer.ensureAborted();\n }\n }\n\n private buildConnectionCallbacks(\n errorCallbacks: ErrorCallbacks,\n ): ConnectionCallbacks {\n return Collections.extend<ConnectionCallbacks>({}, 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<HandshakeCallbacks>({}, errorCallbacks, {\n connected: (handshake: HandshakePayload) => {\n this.activityTimeout = Math.min(\n this.options.activityTimeout,\n handshake.activityTimeout,\n handshake.connection.activityTimeout || Infinity,\n );\n this.clearUnavailableTimer();\n this.setConnection(handshake.connection);\n this.socket_id = this.connection.id;\n this.updateState('connected', { socket_id: this.socket_id });\n },\n });\n }\n\n private buildErrorCallbacks(): ErrorCallbacks {\n let withErrorEmitted = (callback) => {\n return (result: Action | HandshakePayload) => {\n if (result.error) {\n this.emit('error', { type: 'WebSocketError', error: result.error });\n }\n callback(result);\n };\n };\n\n return {\n tls_only: withErrorEmitted(() => {\n this.usingTLS = true;\n this.updateStrategy();\n this.retryIn(0);\n }),\n refused: withErrorEmitted(() => {\n this.disconnect();\n }),\n backoff: withErrorEmitted(() => {\n this.retryIn(1000);\n }),\n retry: withErrorEmitted(() => {\n this.retryIn(0);\n }),\n };\n }\n\n private setConnection(connection) {\n this.connection = connection;\n for (var event in this.connectionCallbacks) {\n this.connection.bind(event, this.connectionCallbacks[event]);\n }\n this.resetActivityCheck();\n }\n\n private abandonConnection() {\n if (!this.connection) {\n return;\n }\n this.stopActivityCheck();\n for (var event in this.connectionCallbacks) {\n this.connection.unbind(event, this.connectionCallbacks[event]);\n }\n var connection = this.connection;\n this.connection = null;\n return connection;\n }\n\n private updateState(newState: string, data?: any) {\n var previousState = this.state;\n this.state = newState;\n if (previousState !== newState) {\n var newStateDescription = newState;\n if (newStateDescription === 'connected') {\n newStateDescription += ' with new socket ID ' + data.socket_id;\n }\n Logger.debug(\n 'State changed',\n previousState + ' -> ' + newStateDescription,\n );\n this.timeline.info({ state: newState, params: data });\n this.emit('state_change', { previous: previousState, current: newState });\n this.emit(newState, data);\n }\n }\n\n private shouldRetry(): boolean {\n return this.state === 'connecting' || this.state === 'connected';\n }\n}\n","import Channel from './channel';\nimport * as Collections from '../utils/collections';\nimport ChannelTable from './channel_table';\nimport Factory from '../utils/factory';\nimport Pusher from '../pusher';\nimport Logger from '../logger';\nimport * as Errors from '../errors';\nimport urlStore from '../utils/url_store';\n\n/** Handles a channel map. */\nexport default class Channels {\n channels: ChannelTable;\n\n constructor() {\n this.channels = {};\n }\n\n /** Creates or retrieves an existing channel by its name.\n *\n * @param {String} name\n * @param {Pusher} pusher\n * @return {Channel}\n */\n add(name: string, pusher: Pusher) {\n if (!this.channels[name]) {\n this.channels[name] = createChannel(name, pusher);\n }\n return this.channels[name];\n }\n\n /** Returns a list of all channels\n *\n * @return {Array}\n */\n all(): Channel[] {\n return Collections.values(this.channels);\n }\n\n /** Finds a channel by its name.\n *\n * @param {String} name\n * @return {Channel} channel or null if it doesn't exist\n */\n find(name: string) {\n return this.channels[name];\n }\n\n /** Removes a channel from the map.\n *\n * @param {String} name\n */\n remove(name: string) {\n var channel = this.channels[name];\n delete this.channels[name];\n return channel;\n }\n\n /** Proxies disconnection signal to all channels. */\n disconnect() {\n Collections.objectApply(this.channels, function (channel) {\n channel.disconnect();\n });\n }\n}\n\nfunction createChannel(name: string, pusher: Pusher): Channel {\n if (name.indexOf('private-encrypted-') === 0) {\n if (pusher.config.nacl) {\n return Factory.createEncryptedChannel(name, pusher, pusher.config.nacl);\n }\n let errMsg =\n 'Tried to subscribe to a private-encrypted- channel but no nacl implementation available';\n let suffix = urlStore.buildLogSuffix('encryptedChannelSupport');\n throw new Errors.UnsupportedFeature(`${errMsg}. ${suffix}`);\n } else if (name.indexOf('private-') === 0) {\n return Factory.createPrivateChannel(name, pusher);\n } else if (name.indexOf('presence-') === 0) {\n return Factory.createPresenceChannel(name, pusher);\n } else if (name.indexOf('#') === 0) {\n throw new Errors.BadChannelName(\n 'Cannot create a channel with name \"' + name + '\".',\n );\n } else {\n return Factory.createChannel(name, pusher);\n }\n}\n","import AssistantToTheTransportManager from '../transports/assistant_to_the_transport_manager';\nimport PingDelayOptions from '../transports/ping_delay_options';\nimport Transport from '../transports/transport';\nimport TransportManager from '../transports/transport_manager';\nimport Handshake from '../connection/handshake';\nimport TransportConnection from '../transports/transport_connection';\nimport SocketHooks from '../http/socket_hooks';\nimport HTTPSocket from '../http/http_socket';\n\nimport Timeline from '../timeline/timeline';\nimport {\n default as TimelineSender,\n TimelineSenderOptions,\n} from '../timeline/timeline_sender';\nimport PresenceChannel from '../channels/presence_channel';\nimport PrivateChannel from '../channels/private_channel';\nimport EncryptedChannel from '../channels/encrypted_channel';\nimport Channel from '../channels/channel';\nimport ConnectionManager from '../connection/connection_manager';\nimport ConnectionManagerOptions from '../connection/connection_manager_options';\nimport Ajax from '../http/ajax';\nimport Channels from '../channels/channels';\nimport Pusher from '../pusher';\nimport { Config } from '../config';\nimport * as nacl from 'tweetnacl';\n\nvar Factory = {\n createChannels(): Channels {\n return new Channels();\n },\n\n createConnectionManager(\n key: string,\n options: ConnectionManagerOptions,\n ): ConnectionManager {\n return new ConnectionManager(key, options);\n },\n\n createChannel(name: string, pusher: Pusher): Channel {\n return new Channel(name, pusher);\n },\n\n createPrivateChannel(name: string, pusher: Pusher): PrivateChannel {\n return new PrivateChannel(name, pusher);\n },\n\n createPresenceChannel(name: string, pusher: Pusher): PresenceChannel {\n return new PresenceChannel(name, pusher);\n },\n\n createEncryptedChannel(\n name: string,\n pusher: Pusher,\n nacl: nacl,\n ): EncryptedChannel {\n return new EncryptedChannel(name, pusher, nacl);\n },\n\n createTimelineSender(timeline: Timeline, options: TimelineSenderOptions) {\n return new TimelineSender(timeline, options);\n },\n\n createHandshake(\n transport: TransportConnection,\n callback: (HandshakePayload) => void,\n ): Handshake {\n return new Handshake(transport, callback);\n },\n\n createAssistantToTheTransportManager(\n manager: TransportManager,\n transport: Transport,\n options: PingDelayOptions,\n ): AssistantToTheTransportManager {\n return new AssistantToTheTransportManager(manager, transport, options);\n },\n};\n\nexport default Factory;\n","import AssistantToTheTransportManager from './assistant_to_the_transport_manager';\nimport Transport from './transport';\nimport PingDelayOptions from './ping_delay_options';\nimport Factory from '../utils/factory';\n\nexport interface TransportManagerOptions extends PingDelayOptions {\n lives?: number;\n}\n\n/** Keeps track of the number of lives left for a transport.\n *\n * In the beginning of a session, transports may be assigned a number of\n * lives. When an AssistantToTheTransportManager instance reports a transport\n * connection closed uncleanly, the transport loses a life. When the number\n * of lives drops to zero, the transport gets disabled by its manager.\n *\n * @param {Object} options\n */\nexport default class TransportManager {\n options: TransportManagerOptions;\n livesLeft: number;\n\n constructor(options: TransportManagerOptions) {\n this.options = options || {};\n this.livesLeft = this.options.lives || Infinity;\n }\n\n /** Creates a assistant for the transport.\n *\n * @param {Transport} transport\n * @returns {AssistantToTheTransportManager}\n */\n getAssistant(transport: Transport): AssistantToTheTransportManager {\n return Factory.createAssistantToTheTransportManager(this, transport, {\n minPingDelay: this.options.minPingDelay,\n maxPingDelay: this.options.maxPingDelay,\n });\n }\n\n /** Returns whether the transport has any lives left.\n *\n * @returns {Boolean}\n */\n isAlive(): boolean {\n return this.livesLeft > 0;\n }\n\n /** Takes one life from the transport. */\n reportDeath() {\n this.livesLeft -= 1;\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport { OneOffTimer as Timer } from '../utils/timers';\nimport Strategy from './strategy';\nimport StrategyOptions from './strategy_options';\n\n/** Loops through strategies with optional timeouts.\n *\n * Options:\n * - loop - whether it should loop through the substrategy list\n * - timeout - initial timeout for a single substrategy\n * - timeoutLimit - maximum timeout\n *\n * @param {Strategy[]} strategies\n * @param {Object} options\n */\nexport default class SequentialStrategy implements Strategy {\n strategies: Strategy[];\n loop: boolean;\n failFast: boolean;\n timeout: number;\n timeoutLimit: number;\n\n constructor(strategies: Strategy[], options: StrategyOptions) {\n this.strategies = strategies;\n this.loop = Boolean(options.loop);\n this.failFast = Boolean(options.failFast);\n this.timeout = options.timeout;\n this.timeoutLimit = options.timeoutLimit;\n }\n\n isSupported(): boolean {\n return Collections.any(this.strategies, Util.method('isSupported'));\n }\n\n connect(minPriority: number, callback: Function) {\n var strategies = this.strategies;\n var current = 0;\n var timeout = this.timeout;\n var runner = null;\n\n var tryNextStrategy = (error, handshake) => {\n if (handshake) {\n callback(null, handshake);\n } else {\n current = current + 1;\n if (this.loop) {\n current = current % strategies.length;\n }\n\n if (current < strategies.length) {\n if (timeout) {\n timeout = timeout * 2;\n if (this.timeoutLimit) {\n timeout = Math.min(timeout, this.timeoutLimit);\n }\n }\n runner = this.tryStrategy(\n strategies[current],\n minPriority,\n { timeout, failFast: this.failFast },\n tryNextStrategy,\n );\n } else {\n callback(true);\n }\n }\n };\n\n runner = this.tryStrategy(\n strategies[current],\n minPriority,\n { timeout: timeout, failFast: this.failFast },\n tryNextStrategy,\n );\n\n return {\n abort: function () {\n runner.abort();\n },\n forceMinPriority: function (p) {\n minPriority = p;\n if (runner) {\n runner.forceMinPriority(p);\n }\n },\n };\n }\n\n private tryStrategy(\n strategy: Strategy,\n minPriority: number,\n options: StrategyOptions,\n callback: Function,\n ) {\n var timer = null;\n var runner = null;\n\n if (options.timeout > 0) {\n timer = new Timer(options.timeout, function () {\n runner.abort();\n callback(true);\n });\n }\n\n runner = strategy.connect(minPriority, function (error, handshake) {\n if (error && timer && timer.isRunning() && !options.failFast) {\n // advance to the next strategy after the timeout\n return;\n }\n if (timer) {\n timer.ensureAborted();\n }\n callback(error, handshake);\n });\n\n return {\n abort: function () {\n if (timer) {\n timer.ensureAborted();\n }\n runner.abort();\n },\n forceMinPriority: function (p) {\n runner.forceMinPriority(p);\n },\n };\n }\n}\n","import * as Collections from '../utils/collections';\nimport Util from '../util';\nimport Strategy from './strategy';\n\n/** Launches all substrategies and emits prioritized connected transports.\n *\n * @param {Array} strategies\n */\nexport default class BestConnectedEverStrategy implements Strategy {\n strategies: Strategy[];\n\n constructor(strategies: Strategy[]) {\n this.strategies = strategies;\n }\n\n isSupported(): boolean {\n return Collections.any(this.strategies, Util.method('isSupported'));\n }\n\n connect(minPriority: number, callback: Function) {\n return connect(this.strategies, minPriority, function (i, runners) {\n return function (error, handshake) {\n runners[i].error = error;\n if (error) {\n if (allRunnersFailed(runners)) {\n callback(true);\n }\n return;\n }\n Collections.apply(runners, function (runner) {\n runner.forceMinPriority(handshake.transport.priority);\n });\n callback(null, handshake);\n };\n });\n }\n}\n\n/** Connects to all strategies in parallel.\n *\n * Callback builder should be a function that takes two arguments: index\n * and a list of runners. It should return another function that will be\n * passed to the substrategy with given index. Runners can be aborted using\n * abortRunner(s) functions from this class.\n *\n * @param {Array} strategies\n * @param {Function} callbackBuilder\n * @return {Object} strategy runner\n */\nfunction connect(\n strategies: Strategy[],\n minPriority: number,\n callbackBuilder: Function,\n) {\n var runners = Collections.map(strategies, function (strategy, i, _, rs) {\n return strategy.connect(minPriority, callbackBuilder(i, rs));\n });\n return {\n abort: function () {\n Collections.apply(runners, abortRunner);\n },\n forceMinPriority: function (p) {\n Collections.apply(runners, function (runner) {\n runner.forceMinPriority(p);\n });\n },\n };\n}\n\nfunction allRunnersFailed(runners): boolean {\n return Collections.all(runners, function (runner) {\n return Boolean(runner.error);\n });\n}\n\nfunction abortRunner(runner) {\n if (!runner.error && !runner.aborted) {\n runner.abort();\n runner.aborted = true;\n }\n}\n","import Util from '../util';\nimport Runtime from 'runtime';\nimport Strategy from './strategy';\nimport SequentialStrategy from './sequential_strategy';\nimport StrategyOptions from './strategy_options';\nimport TransportStrategy from './transport_strategy';\nimport Timeline from '../timeline/timeline';\nimport * as Collections from '../utils/collections';\n\nexport interface TransportStrategyDictionary {\n [key: string]: TransportStrategy;\n}\n\n/** Caches the last successful transport and, after the first few attempts,\n * uses the cached transport for subsequent attempts.\n *\n * @param {Strategy} strategy\n * @param {Object} transports\n * @param {Object} options\n */\nexport default class WebSocketPrioritizedCachedStrategy 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 var cacheSkipCount = info && info.cacheSkipCount ? info.cacheSkipCount : 0;\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 if (['ws', 'wss'].includes(info.transport) || cacheSkipCount > 3) {\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 } else {\n cacheSkipCount++;\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 cacheSkipCount,\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 cacheSkipCount: 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 cacheSkipCount: cacheSkipCount,\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(\n minPriority,\n function (error, handshake) {\n if (handshake) {\n runner.abort();\n }\n callback(error, handshake);\n },\n );\n return runner;\n }\n}\n","import * as Collections from 'core/utils/collections';\nimport TransportManager from 'core/transports/transport_manager';\nimport Strategy from 'core/strategies/strategy';\nimport StrategyOptions from 'core/strategies/strategy_options';\nimport SequentialStrategy from 'core/strategies/sequential_strategy';\nimport BestConnectedEverStrategy from 'core/strategies/best_connected_ever_strategy';\nimport WebSocketPrioritizedCachedStrategy, {\n TransportStrategyDictionary,\n} from 'core/strategies/websocket_prioritized_cached_strategy';\nimport DelayedStrategy from 'core/strategies/delayed_strategy';\nimport IfStrategy from 'core/strategies/if_strategy';\nimport FirstConnectedStrategy from 'core/strategies/first_connected_strategy';\nimport { Config } from 'core/config';\n\nfunction testSupportsStrategy(strategy: Strategy) {\n return function () {\n return strategy.isSupported();\n };\n}\n\nvar getDefaultStrategy = function (\n config: Config,\n baseOptions: StrategyOptions,\n defineTransport: Function,\n): Strategy {\n var definedTransports = <TransportStrategyDictionary>{};\n\n function defineTransportStrategy(\n name: string,\n type: string,\n priority: number,\n options: StrategyOptions,\n manager?: TransportManager,\n ) {\n var transport = defineTransport(\n config,\n name,\n type,\n priority,\n options,\n manager,\n );\n\n definedTransports[name] = transport;\n\n return transport;\n }\n\n var ws_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.wsHost + ':' + config.wsPort,\n hostTLS: config.wsHost + ':' + config.wssPort,\n httpPath: config.wsPath,\n });\n var wss_options: StrategyOptions = Object.assign({}, ws_options, {\n useTLS: true,\n });\n var sockjs_options: StrategyOptions = Object.assign({}, baseOptions, {\n hostNonTLS: config.httpHost + ':' + config.httpPort,\n hostTLS: config.httpHost + ':' + config.httpsPort,\n httpPath: config.httpPath,\n });\n\n var timeouts = {\n loop: true,\n timeout: 15000,\n timeoutLimit: 60000,\n };\n\n var ws_manager = new TransportManager({\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout,\n });\n var streaming_manager = new TransportManager({\n lives: 2,\n minPingDelay: 10000,\n maxPingDelay: config.activityTimeout,\n });\n\n var ws_transport = defineTransportStrategy(\n 'ws',\n 'ws',\n 3,\n ws_options,\n ws_manager,\n );\n var wss_transport = defineTransportStrategy(\n 'wss',\n 'ws',\n 3,\n wss_options,\n ws_manager,\n );\n var sockjs_transport = defineTransportStrategy(\n 'sockjs',\n 'sockjs',\n 1,\n sockjs_options,\n );\n var xhr_streaming_transport = defineTransportStrategy(\n 'xhr_streaming',\n 'xhr_streaming',\n 1,\n sockjs_options,\n streaming_manager,\n );\n var xdr_streaming_transport = defineTransportStrategy(\n 'xdr_streaming',\n 'xdr_streaming',\n 1,\n sockjs_options,\n streaming_manager,\n );\n var xhr_polling_transport = defineTransportStrategy(\n 'xhr_polling',\n 'xhr_polling',\n 1,\n sockjs_options,\n );\n var xdr_polling_transport = defineTransportStrategy(\n 'xdr_polling',\n 'xdr_polling',\n 1,\n sockjs_options,\n );\n\n var ws_loop = new SequentialStrategy([ws_transport], timeouts);\n var wss_loop = new SequentialStrategy([wss_transport], timeouts);\n var sockjs_loop = new SequentialStrategy([sockjs_transport], timeouts);\n var streaming_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(xhr_streaming_transport),\n xhr_streaming_transport,\n xdr_streaming_transport,\n ),\n ],\n timeouts,\n );\n var polling_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(xhr_polling_transport),\n xhr_polling_transport,\n xdr_polling_transport,\n ),\n ],\n timeouts,\n );\n\n var http_loop = new SequentialStrategy(\n [\n new IfStrategy(\n testSupportsStrategy(streaming_loop),\n new BestConnectedEverStrategy([\n streaming_loop,\n new DelayedStrategy(polling_loop, { delay: 4000 }),\n ]),\n polling_loop,\n ),\n ],\n timeouts,\n );\n\n var http_fallback_loop = new IfStrategy(\n testSupportsStrategy(http_loop),\n http_loop,\n sockjs_loop,\n );\n\n var wsStrategy;\n if (baseOptions.useTLS) {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(http_fallback_loop, { delay: 2000 }),\n ]);\n } else {\n wsStrategy = new BestConnectedEverStrategy([\n ws_loop,\n new DelayedStrategy(wss_loop, { delay: 2000 }),\n new DelayedStrategy(http_fallback_loop, { delay: 5000 }),\n ]);\n }\n\n return new WebSocketPrioritizedCachedStrategy(\n new FirstConnectedStrategy(\n new IfStrategy(\n testSupportsStrategy(ws_transport),\n wsStrategy,\n http_fallback_loop,\n ),\n ),\n definedTransports,\n {\n ttl: 1800000,\n timeline: baseOptions.timeline,\n useTLS: baseOptions.useTLS,\n },\n );\n};\n\nexport default getDefaultStrategy;\n","import { Dependencies } from '../dom/dependencies';\n\n/** Initializes the transport.\n *\n * Fetches resources if needed and then transitions to initialized.\n */\nexport default function () {\n var self = this;\n\n self.timeline.info(\n self.buildTimelineMessage({\n transport: self.name + (self.options.useTLS ? 's' : ''),\n }),\n );\n\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n } else if (self.hooks.file) {\n self.changeState('initializing');\n Dependencies.load(\n self.hooks.file,\n { useTLS: self.options.useTLS },\n function (error, callback) {\n if (self.hooks.isInitialized()) {\n self.changeState('initialized');\n callback(true);\n } else {\n if (error) {\n self.onError(error);\n }\n self.onClose();\n callback(false);\n }\n },\n );\n } else {\n self.onClose();\n }\n}\n","import HTTPRequest from 'core/http/http_request';\nimport RequestHooks from 'core/http/request_hooks';\nimport Ajax from 'core/http/ajax';\nimport * as Errors from 'core/errors';\n\nvar hooks: RequestHooks = {\n getRequest: function (socket: HTTPRequest): Ajax {\n var xdr = new (<any>window).XDomainRequest();\n xdr.ontimeout = function () {\n socket.emit('error', new Errors.RequestTimedOut());\n socket.close();\n };\n xdr.onerror = function (e) {\n socket.emit('error', e);\n socket.close();\n };\n xdr.onprogress = function () {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n };\n xdr.onload = function () {\n if (xdr.responseText && xdr.responseText.length > 0) {\n socket.onChunk(200, xdr.responseText);\n }\n socket.emit('finished', 200);\n socket.close();\n };\n return xdr;\n },\n abortRequest: function (xdr: Ajax) {\n xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null;\n xdr.abort();\n },\n};\n\nexport default hooks;\n","import Runtime from 'runtime';\nimport RequestHooks from './request_hooks';\nimport Ajax from './ajax';\nimport { default as EventsDispatcher } from '../events/dispatcher';\n\nconst MAX_BUFFER_LENGTH = 256 * 1024;\n\nexport default class HTTPRequest extends EventsDispatcher {\n hooks: RequestHooks;\n method: string;\n url: string;\n position: number;\n xhr: Ajax;\n unloader: Function;\n\n constructor(hooks: RequestHooks, method: string, url: string) {\n super();\n this.hooks = hooks;\n this.method = method;\n this.url = url;\n }\n\n start(payload?: any) {\n this.position = 0;\n this.xhr = this.hooks.getRequest(this);\n\n this.unloader = () => {\n this.close();\n };\n Runtime.addUnloadListener(this.unloader);\n\n this.xhr.open(this.method, this.url, true);\n\n if (this.xhr.setRequestHeader) {\n this.xhr.setRequestHeader('Content-Type', 'application/json'); // ReactNative doesn't set this header by default.\n }\n this.xhr.send(payload);\n }\n\n close() {\n if (this.unloader) {\n Runtime.removeUnloadListener(this.unloader);\n this.unloader = null;\n }\n if (this.xhr) {\n this.hooks.abortRequest(this.xhr);\n this.xhr = null;\n }\n }\n\n onChunk(status: number, data: any) {\n while (true) {\n var chunk = this.advanceBuffer(data);\n if (chunk) {\n this.emit('chunk', { status: status, data: chunk });\n } else {\n break;\n }\n }\n if (this.isBufferTooLong(data)) {\n this.emit('buffer_too_long');\n }\n }\n\n private advanceBuffer(buffer: any[]): any {\n var unreadData = buffer.slice(this.position);\n var endOfLinePosition = unreadData.indexOf('\\n');\n\n if (endOfLinePosition !== -1) {\n this.position += endOfLinePosition + 1;\n return unreadData.slice(0, endOfLinePosition);\n } else {\n // chunk is not finished yet, don't move the buffer pointer\n return null;\n }\n }\n\n private isBufferTooLong(buffer: any): boolean {\n return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH;\n }\n}\n","enum State {\n CONNECTING = 0,\n OPEN = 1,\n CLOSED = 3,\n}\n\nexport default State;\n","import URLLocation from './url_location';\nimport State from './state';\nimport Socket from '../socket';\nimport SocketHooks from './socket_hooks';\nimport Util from '../util';\nimport Ajax from './ajax';\nimport HTTPRequest from './http_request';\nimport Runtime from 'runtime';\n\nvar autoIncrement = 1;\n\nclass HTTPSocket implements Socket {\n hooks: SocketHooks;\n session: string;\n location: URLLocation;\n readyState: State;\n stream: HTTPRequest;\n\n onopen: () => void;\n onerror: (error: any) => void;\n onclose: (closeEvent: any) => void;\n onmessage: (message: any) => void;\n onactivity: () => void;\n\n constructor(hooks: SocketHooks, url: string) {\n this.hooks = hooks;\n this.session = randomNumber(1000) + '/' + randomString(8);\n this.location = getLocation(url);\n this.readyState = State.CONNECTING;\n this.openStream();\n }\n\n send(payload: any) {\n return this.sendRaw(JSON.stringify([payload]));\n }\n\n ping() {\n this.hooks.sendHeartbeat(this);\n }\n\n close(code: any, reason: any) {\n this.onClose(code, reason, true);\n }\n\n /** For internal use only */\n sendRaw(payload: any): boolean {\n if (this.readyState === State.OPEN) {\n try {\n Runtime.createSocketRequest(\n 'POST',\n getUniqueURL(getSendURL(this.location, this.session)),\n ).start(payload);\n return true;\n } catch (e) {\n return false;\n }\n } else {\n return false;\n }\n }\n\n /** For internal use only */\n reconnect() {\n this.closeStream();\n this.openStream();\n }\n\n /** For internal use only */\n onClose(code, reason, wasClean) {\n this.closeStream();\n this.readyState = State.CLOSED;\n if (this.onclose) {\n this.onclose({\n code: code,\n reason: reason,\n wasClean: wasClean,\n });\n }\n }\n\n private onChunk(chunk) {\n if (chunk.status !== 200) {\n return;\n }\n if (this.readyState === State.OPEN) {\n this.onActivity();\n }\n\n var payload;\n var type = chunk.data.slice(0, 1);\n switch (type) {\n case 'o':\n payload = JSON.parse(chunk.data.slice(1) || '{}');\n this.onOpen(payload);\n break;\n case 'a':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n for (var i = 0; i < payload.length; i++) {\n this.onEvent(payload[i]);\n }\n break;\n case 'm':\n payload = JSON.parse(chunk.data.slice(1) || 'null');\n this.onEvent(payload);\n break;\n case 'h':\n this.hooks.onHeartbeat(this);\n break;\n case 'c':\n payload = JSON.parse(chunk.data.slice(1) || '[]');\n this.onClose(payload[0], payload[1], true);\n break;\n }\n }\n\n private onOpen(options) {\n if (this.readyState === State.CONNECTING) {\n if (options && options.hostname) {\n this.location.base = replaceHost(this.location.base, options.hostname);\n }\n this.readyState = State.OPEN;\n\n if (this.onopen) {\n this.onopen();\n }\n } else {\n this.onClose(1006, 'Server lost session', true);\n }\n }\n\n private onEvent(event) {\n if (this.readyState === State.OPEN && this.onmessage) {\n this.onmessage({ data: event });\n }\n }\n\n private onActivity() {\n if (this.onactivity) {\n this.onactivity();\n }\n }\n\n private onError(error) {\n if (this.onerror) {\n this.onerror(error);\n }\n }\n\n private openStream() {\n this.stream = Runtime.createSocketRequest(\n 'POST',\n getUniqueURL(this.hooks.getReceiveURL(this.location, this.session)),\n );\n\n this.stream.bind('chunk', (chunk) => {\n this.onChunk(chunk);\n });\n this.stream.bind('finished', (status) => {\n this.hooks.onFinished(this, status);\n });\n this.stream.bind('buffer_too_long', () => {\n this.reconnect();\n });\n\n try {\n this.stream.start();\n } catch (error) {\n Util.defer(() => {\n this.onError(error);\n this.onClose(1006, 'Could not start streaming', false);\n });\n }\n }\n\n private closeStream() {\n if (this.stream) {\n this.stream.unbind_all();\n this.stream.close();\n this.stream = null;\n }\n }\n}\n\nfunction getLocation(url): URLLocation {\n var parts = /([^\\?]*)\\/*(\\??.*)/.exec(url);\n return {\n base: parts[1],\n queryString: parts[2],\n };\n}\n\nfunction getSendURL(url: URLLocation, session: string): string {\n return url.base + '/' + session + '/xhr_send';\n}\n\nfunction getUniqueURL(url: string): string {\n var separator = url.indexOf('?') === -1 ? '?' : '&';\n return url + separator + 't=' + +new Date() + '&n=' + autoIncrement++;\n}\n\nfunction replaceHost(url: string, hostname: string): string {\n var urlParts = /(https?:\\/\\/)([^\\/:]+)((\\/|:)?.*)/.exec(url);\n return urlParts[1] + hostname + urlParts[3];\n}\n\nfunction randomNumber(max: number): number {\n return Runtime.randomInt(max);\n}\n\nfunction randomString(length: number): string {\n var result = [];\n\n for (var i = 0; i < length; i++) {\n result.push(randomNumber(32).toString(32));\n }\n\n return result.join('');\n}\n\nexport default HTTPSocket;\n","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 HTTPRequest from 'core/http/http_request';\nimport HTTPSocket from 'core/http/http_socket';\nimport SocketHooks from 'core/http/socket_hooks';\nimport RequestHooks from 'core/http/request_hooks';\nimport streamingHooks from 'core/http/http_streaming_socket';\nimport pollingHooks from 'core/http/http_polling_socket';\nimport xhrHooks from './http_xhr_request';\nimport HTTPFactory from 'core/http/http_factory';\n\nvar HTTP: HTTPFactory = {\n createStreamingSocket(url: string): HTTPSocket {\n return this.createSocket(streamingHooks, url);\n },\n\n createPollingSocket(url: string): HTTPSocket {\n return this.createSocket(pollingHooks, url);\n },\n\n createSocket(hooks: SocketHooks, url: string): HTTPSocket {\n return new HTTPSocket(hooks, url);\n },\n\n createXHR(method: string, url: string): HTTPRequest {\n return this.createRequest(xhrHooks, method, url);\n },\n\n createRequest(hooks: RequestHooks, method: string, url: string): HTTPRequest {\n return new HTTPRequest(hooks, method, url);\n },\n};\n\nexport default HTTP;\n","import xdrHooks from './http_xdomain_request';\nimport HTTP from 'isomorphic/http/http';\n\nHTTP.createXDR = function (method, url) {\n return this.createRequest(xdrHooks, method, url);\n};\n\nexport default HTTP;\n","import Browser from './browser';\nimport { Dependencies, DependenciesReceivers } from './dom/dependencies';\nimport { AuthTransport, AuthTransports } from 'core/auth/auth_transports';\nimport xhrAuth from 'isomorphic/auth/xhr_auth';\nimport jsonpAuth from './auth/jsonp_auth';\nimport TimelineTransport from 'core/timeline/timeline_transport';\nimport TimelineSender from 'core/timeline/timeline_sender';\nimport ScriptRequest from './dom/script_request';\nimport JSONPRequest from './dom/jsonp_request';\nimport * as Collections from 'core/utils/collections';\nimport { ScriptReceivers } from './dom/script_receiver_factory';\nimport jsonpTimeline from './timeline/jsonp_timeline';\nimport Transports from './transports/transports';\nimport Ajax from 'core/http/ajax';\nimport { Network } from './net_info';\nimport getDefaultStrategy from './default_strategy';\nimport transportConnectionInitializer from './transports/transport_connection_initializer';\nimport HTTPFactory from './http/http';\nimport HTTPRequest from 'core/http/http_request';\n\nvar Runtime: Browser = {\n // for jsonp auth\n nextAuthCallbackID: 1,\n auth_callbacks: {},\n ScriptReceivers,\n DependenciesReceivers,\n getDefaultStrategy,\n Transports,\n transportConnectionInitializer,\n HTTPFactory,\n\n TimelineTransport: jsonpTimeline,\n\n getXHRAPI() {\n return window.XMLHttpRequest;\n },\n\n getWebSocketAPI() {\n return window.WebSocket || window.MozWebSocket;\n },\n\n setup(PusherClass): void {\n (<any>window).Pusher = PusherClass; // JSONp requires Pusher to be in the global scope.\n var initializeOnDocumentBody = () => {\n this.onDocumentBody(PusherClass.ready);\n };\n if (!(<any>window).JSON) {\n Dependencies.load('json2', {}, initializeOnDocumentBody);\n } else {\n initializeOnDocumentBody();\n }\n },\n\n getDocument(): Document {\n return document;\n },\n\n getProtocol(): string {\n return this.getDocument().location.protocol;\n },\n\n getAuthorizers(): AuthTransports {\n return { ajax: xhrAuth, jsonp: jsonpAuth };\n },\n\n onDocumentBody(callback: Function) {\n if (document.body) {\n callback();\n } else {\n setTimeout(() => {\n this.onDocumentBody(callback);\n }, 0);\n }\n },\n\n createJSONPRequest(url: string, data: any): JSONPRequest {\n return new JSONPRequest(url, data);\n },\n\n createScriptRequest(src: string): ScriptRequest {\n return new ScriptRequest(src);\n },\n\n getLocalStorage() {\n try {\n return window.localStorage;\n } catch (e) {\n return undefined;\n }\n },\n\n createXHR(): Ajax {\n if (this.getXHRAPI()) {\n return this.createXMLHttpRequest();\n } else {\n return this.createMicrosoftXHR();\n }\n },\n\n createXMLHttpRequest(): Ajax {\n var Constructor = this.getXHRAPI();\n return new Constructor();\n },\n\n createMicrosoftXHR(): Ajax {\n return new ActiveXObject('Microsoft.XMLHTTP');\n },\n\n getNetwork() {\n return Network;\n },\n\n createWebSocket(url: string): any {\n var Constructor = this.getWebSocketAPI();\n return new Constructor(url);\n },\n\n createSocketRequest(method: string, url: string): HTTPRequest {\n if (this.isXHRSupported()) {\n return this.HTTPFactory.createXHR(method, url);\n } else if (this.isXDRSupported(url.indexOf('https:') === 0)) {\n return this.HTTPFactory.createXDR(method, url);\n } else {\n throw 'Cross-origin HTTP requests are not supported';\n }\n },\n\n isXHRSupported(): boolean {\n var Constructor = this.getXHRAPI();\n return (\n Boolean(Constructor) && new Constructor().withCredentials !== undefined\n );\n },\n\n isXDRSupported(useTLS?: boolean): boolean {\n var protocol = useTLS ? 'https:' : 'http:';\n var documentProtocol = this.getProtocol();\n return (\n Boolean(<any>window['XDomainRequest']) && documentProtocol === protocol\n );\n },\n\n addUnloadListener(listener: any) {\n if (window.addEventListener !== undefined) {\n window.addEventListener('unload', listener, false);\n } else if (window.attachEvent !== undefined) {\n window.attachEvent('onunload', listener);\n }\n },\n\n removeUnloadListener(listener: any) {\n if (window.addEventListener !== undefined) {\n window.removeEventListener('unload', listener, false);\n } else if (window.detachEvent !== undefined) {\n window.detachEvent('onunload', listener);\n }\n },\n\n randomInt(max: number): number {\n /**\n * Return values in the range of [0, 1[\n */\n const random = function () {\n const crypto = window.crypto || window['msCrypto'];\n const random = crypto.getRandomValues(new Uint32Array(1))[0];\n\n return random / 2 ** 32;\n };\n\n return Math.floor(random() * max);\n },\n};\n\nexport default Runtime;\n","enum TimelineLevel {\n ERROR = 3,\n INFO = 6,\n DEBUG = 7,\n}\n\nexport default TimelineLevel;\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 ConnectionManager from './connection/connection_manager';\nimport {\n ChannelAuthorizationOptions,\n UserAuthenticationOptions,\n} from './auth/options';\nimport {\n ChannelAuthorizerGenerator,\n DeprecatedAuthOptions,\n} from './auth/deprecated_channel_authorizer';\nimport { AuthTransport, Transport } from './config';\nimport * as nacl from 'tweetnacl';\nimport Logger from './logger';\nimport { DeltaOptions } from './delta/types';\n\nexport interface Options {\n activityTimeout?: number;\n\n auth?: DeprecatedAuthOptions; // DEPRECATED use channelAuthorization instead\n authEndpoint?: string; // DEPRECATED use channelAuthorization instead\n authTransport?: AuthTransport; // DEPRECATED use channelAuthorization instead\n authorizer?: ChannelAuthorizerGenerator; // DEPRECATED use channelAuthorization instead\n\n channelAuthorization?: ChannelAuthorizationOptions;\n userAuthentication?: UserAuthenticationOptions;\n\n cluster: string;\n deltaCompression?: DeltaOptions;\n enableStats?: boolean;\n disableStats?: boolean;\n disabledTransports?: Transport[];\n enabledTransports?: Transport[];\n forceTLS?: boolean;\n httpHost?: string;\n httpPath?: string;\n httpPort?: number;\n httpsPort?: number;\n ignoreNullOrigin?: boolean;\n nacl?: nacl;\n pongTimeout?: number;\n statsHost?: string;\n timelineParams?: any;\n unavailableTimeout?: number;\n wsHost?: string;\n wsPath?: string;\n wsPort?: number;\n wssPort?: number;\n}\n\nexport function validateOptions(options) {\n if (options == null) {\n throw 'You must pass an options object';\n }\n if (options.cluster == null) {\n throw 'Options object must provide a cluster';\n }\n if ('disableStats' in options) {\n Logger.warn(\n 'The disableStats option is deprecated in favor of enableStats',\n );\n }\n}\n","import {\n UserAuthenticationCallback,\n InternalAuthOptions,\n UserAuthenticationHandler,\n UserAuthenticationRequestParams,\n AuthRequestType,\n} from './options';\n\nimport Runtime from 'runtime';\n\nconst composeChannelQuery = (\n params: UserAuthenticationRequestParams,\n authOptions: InternalAuthOptions,\n) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n\n return query;\n};\n\nconst UserAuthenticator = (\n authOptions: InternalAuthOptions,\n): UserAuthenticationHandler => {\n if (typeof Runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n\n return (\n params: UserAuthenticationRequestParams,\n callback: UserAuthenticationCallback,\n ) => {\n const query = composeChannelQuery(params, authOptions);\n\n Runtime.getAuthorizers()[authOptions.transport](\n Runtime,\n query,\n authOptions,\n AuthRequestType.UserAuthentication,\n callback,\n );\n };\n};\n\nexport default UserAuthenticator;\n","import {\n AuthRequestType,\n InternalAuthOptions,\n ChannelAuthorizationHandler,\n ChannelAuthorizationRequestParams,\n ChannelAuthorizationCallback,\n} from './options';\n\nimport Runtime from 'runtime';\n\nconst composeChannelQuery = (\n params: ChannelAuthorizationRequestParams,\n authOptions: InternalAuthOptions,\n) => {\n var query = 'socket_id=' + encodeURIComponent(params.socketId);\n\n query += '&channel_name=' + encodeURIComponent(params.channelName);\n\n for (var key in authOptions.params) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(authOptions.params[key]);\n }\n\n if (authOptions.paramsProvider != null) {\n let dynamicParams = authOptions.paramsProvider();\n for (var key in dynamicParams) {\n query +=\n '&' +\n encodeURIComponent(key) +\n '=' +\n encodeURIComponent(dynamicParams[key]);\n }\n }\n\n return query;\n};\n\nconst ChannelAuthorizer = (\n authOptions: InternalAuthOptions,\n): ChannelAuthorizationHandler => {\n if (typeof Runtime.getAuthorizers()[authOptions.transport] === 'undefined') {\n throw `'${authOptions.transport}' is not a recognized auth transport`;\n }\n\n return (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback,\n ) => {\n const query = composeChannelQuery(params, authOptions);\n\n Runtime.getAuthorizers()[authOptions.transport](\n Runtime,\n query,\n authOptions,\n AuthRequestType.ChannelAuthorization,\n callback,\n );\n };\n};\n\nexport default ChannelAuthorizer;\n","import Channel from '../channels/channel';\nimport {\n ChannelAuthorizationCallback,\n ChannelAuthorizationHandler,\n ChannelAuthorizationRequestParams,\n InternalAuthOptions,\n} from './options';\n\nexport interface DeprecatedChannelAuthorizer {\n authorize(socketId: string, callback: ChannelAuthorizationCallback): void;\n}\n\nexport interface ChannelAuthorizerGenerator {\n (\n channel: Channel,\n options: DeprecatedAuthorizerOptions,\n ): DeprecatedChannelAuthorizer;\n}\n\nexport interface DeprecatedAuthOptions {\n params?: any;\n headers?: any;\n}\n\nexport interface DeprecatedAuthorizerOptions {\n authTransport: 'ajax' | 'jsonp';\n authEndpoint: string;\n auth?: DeprecatedAuthOptions;\n}\n\nexport const ChannelAuthorizerProxy = (\n pusher,\n authOptions: InternalAuthOptions,\n channelAuthorizerGenerator: ChannelAuthorizerGenerator,\n): ChannelAuthorizationHandler => {\n const deprecatedAuthorizerOptions: DeprecatedAuthorizerOptions = {\n authTransport: authOptions.transport,\n authEndpoint: authOptions.endpoint,\n auth: {\n params: authOptions.params,\n headers: authOptions.headers,\n },\n };\n return (\n params: ChannelAuthorizationRequestParams,\n callback: ChannelAuthorizationCallback,\n ) => {\n const channel = pusher.channel(params.channelName);\n // This line creates a new channel authorizer every time.\n // In the past, this was only done once per channel and reused.\n // We can do that again if we want to keep this behavior intact.\n const channelAuthorizer: DeprecatedChannelAuthorizer =\n channelAuthorizerGenerator(channel, deprecatedAuthorizerOptions);\n channelAuthorizer.authorize(params.socketId, callback);\n };\n};\n","import { Options } from './options';\nimport Defaults from './defaults';\nimport {\n ChannelAuthorizationHandler,\n UserAuthenticationHandler,\n ChannelAuthorizationOptions,\n} from './auth/options';\nimport UserAuthenticator from './auth/user_authenticator';\nimport ChannelAuthorizer from './auth/channel_authorizer';\nimport { ChannelAuthorizerProxy } from './auth/deprecated_channel_authorizer';\nimport Runtime from 'runtime';\nimport * as nacl from 'tweetnacl';\n\nexport type AuthTransport = 'ajax' | 'jsonp';\nexport type Transport =\n | 'ws'\n | 'wss'\n | 'xhr_streaming'\n | 'xhr_polling'\n | 'sockjs';\n\nexport interface Config {\n // these are all 'required' config parameters, it's not necessary for the user\n // to set them, but they have configured defaults.\n activityTimeout: number;\n enableStats: boolean;\n httpHost: string;\n httpPath: string;\n httpPort: number;\n httpsPort: number;\n pongTimeout: number;\n statsHost: string;\n unavailableTimeout: number;\n useTLS: boolean;\n wsHost: string;\n wsPath: string;\n wsPort: number;\n wssPort: number;\n userAuthenticator: UserAuthenticationHandler;\n channelAuthorizer: ChannelAuthorizationHandler;\n\n // these are all optional parameters or overrrides. The customer can set these\n // but it's not strictly necessary\n forceTLS?: boolean;\n cluster?: string;\n disabledTransports?: Transport[];\n enabledTransports?: Transport[];\n ignoreNullOrigin?: boolean;\n nacl?: nacl;\n timelineParams?: any;\n}\n\n// getConfig mainly sets the defaults for the options that are not provided\nexport function getConfig(opts: Options, pusher): Config {\n let config: Config = {\n activityTimeout: opts.activityTimeout || Defaults.activityTimeout,\n cluster: opts.cluster,\n httpPath: opts.httpPath || Defaults.httpPath,\n httpPort: opts.httpPort || Defaults.httpPort,\n httpsPort: opts.httpsPort || Defaults.httpsPort,\n pongTimeout: opts.pongTimeout || Defaults.pongTimeout,\n statsHost: opts.statsHost || Defaults.stats_host,\n unavailableTimeout: opts.unavailableTimeout || Defaults.unavailableTimeout,\n wsPath: opts.wsPath || Defaults.wsPath,\n wsPort: opts.wsPort || Defaults.wsPort,\n wssPort: opts.wssPort || Defaults.wssPort,\n\n enableStats: getEnableStatsConfig(opts),\n httpHost: getHttpHost(opts),\n useTLS: shouldUseTLS(opts),\n wsHost: getWebsocketHost(opts),\n\n userAuthenticator: buildUserAuthenticator(opts),\n channelAuthorizer: buildChannelAuthorizer(opts, pusher),\n };\n\n if ('disabledTransports' in opts)\n config.disabledTransports = opts.disabledTransports;\n if ('enabledTransports' in opts)\n config.enabledTransports = opts.enabledTransports;\n if ('ignoreNullOrigin' in opts)\n config.ignoreNullOrigin = opts.ignoreNullOrigin;\n if ('timelineParams' in opts) config.timelineParams = opts.timelineParams;\n if ('nacl' in opts) {\n config.nacl = opts.nacl;\n }\n\n return config;\n}\n\nfunction getHttpHost(opts: Options): string {\n if (opts.httpHost) {\n return opts.httpHost;\n }\n if (opts.cluster) {\n return `sockjs-${opts.cluster}.pusher.com`;\n }\n return Defaults.httpHost;\n}\n\nfunction getWebsocketHost(opts: Options): string {\n if (opts.wsHost) {\n return opts.wsHost;\n }\n return getWebsocketHostFromCluster(opts.cluster);\n}\n\nfunction getWebsocketHostFromCluster(cluster: string): string {\n return `ws-${cluster}.pusher.com`;\n}\n\nfunction shouldUseTLS(opts: Options): boolean {\n if (Runtime.getProtocol() === 'https:') {\n return true;\n } else if (opts.forceTLS === false) {\n return false;\n }\n return true;\n}\n\n// if enableStats is set take the value\n// if disableStats is set take the inverse\n// otherwise default to false\nfunction getEnableStatsConfig(opts: Options): boolean {\n if ('enableStats' in opts) {\n return opts.enableStats;\n }\n if ('disableStats' in opts) {\n return !opts.disableStats;\n }\n return false;\n}\n\nfunction buildUserAuthenticator(opts: Options): UserAuthenticationHandler {\n const userAuthentication = {\n ...Defaults.userAuthentication,\n ...opts.userAuthentication,\n };\n if (\n 'customHandler' in userAuthentication &&\n userAuthentication['customHandler'] != null\n ) {\n return userAuthentication['customHandler'];\n }\n\n return UserAuthenticator(userAuthentication);\n}\n\nfunction buildChannelAuth(opts: Options, pusher): ChannelAuthorizationOptions {\n let channelAuthorization: ChannelAuthorizationOptions;\n if ('channelAuthorization' in opts) {\n channelAuthorization = {\n ...Defaults.channelAuthorization,\n ...opts.channelAuthorization,\n };\n } else {\n channelAuthorization = {\n transport: opts.authTransport || Defaults.authTransport,\n endpoint: opts.authEndpoint || Defaults.authEndpoint,\n };\n if ('auth' in opts) {\n if ('params' in opts.auth) channelAuthorization.params = opts.auth.params;\n if ('headers' in opts.auth)\n channelAuthorization.headers = opts.auth.headers;\n }\n if ('authorizer' in opts)\n channelAuthorization.customHandler = ChannelAuthorizerProxy(\n pusher,\n channelAuthorization,\n opts.authorizer,\n );\n }\n return channelAuthorization;\n}\n\nfunction buildChannelAuthorizer(\n opts: Options,\n pusher,\n): ChannelAuthorizationHandler {\n const channelAuthorization = buildChannelAuth(opts, pusher);\n if (\n 'customHandler' in channelAuthorization &&\n channelAuthorization['customHandler'] != null\n ) {\n return channelAuthorization['customHandler'];\n }\n\n return ChannelAuthorizer(channelAuthorization);\n}\n","import Logger from './logger';\nimport Pusher from './pusher';\nimport EventsDispatcher from './events/dispatcher';\n\nexport default class WatchlistFacade extends EventsDispatcher {\n private pusher: Pusher;\n\n public constructor(pusher: Pusher) {\n super(function (eventName, data) {\n Logger.debug(`No callbacks on watchlist events for ${eventName}`);\n });\n\n this.pusher = pusher;\n this.bindWatchlistInternalEvent();\n }\n\n handleEvent(pusherEvent) {\n pusherEvent.data.events.forEach((watchlistEvent) => {\n this.emit(watchlistEvent.name, watchlistEvent);\n });\n }\n\n private bindWatchlistInternalEvent() {\n this.pusher.connection.bind('message', (pusherEvent) => {\n var eventName = pusherEvent.event;\n if (eventName === 'pusher_internal:watchlist_events') {\n this.handleEvent(pusherEvent);\n }\n });\n }\n}\n","function flatPromise() {\n let resolve, reject;\n const promise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n return { promise, resolve, reject };\n}\n\nexport default flatPromise;\n","import Pusher from './pusher';\nimport Logger from './logger';\nimport {\n UserAuthenticationData,\n UserAuthenticationCallback,\n} from './auth/options';\nimport Channel from './channels/channel';\nimport WatchlistFacade from './watchlist';\nimport EventsDispatcher from './events/dispatcher';\nimport flatPromise from './utils/flat_promise';\n\nexport default class UserFacade extends EventsDispatcher {\n pusher: Pusher;\n signin_requested: boolean = false;\n user_data: any = null;\n serverToUserChannel: Channel = null;\n signinDonePromise: Promise<any> = null;\n watchlist: WatchlistFacade;\n private _signinDoneResolve: Function = null;\n\n public constructor(pusher: Pusher) {\n super(function (eventName, data) {\n Logger.debug('No callbacks on user for ' + eventName);\n });\n this.pusher = pusher;\n this.pusher.connection.bind('state_change', ({ previous, current }) => {\n if (previous !== 'connected' && current === 'connected') {\n this._signin();\n }\n if (previous === 'connected' && current !== 'connected') {\n this._cleanup();\n this._newSigninPromiseIfNeeded();\n }\n });\n\n this.watchlist = new WatchlistFacade(pusher);\n\n this.pusher.connection.bind('message', (event) => {\n var eventName = event.event;\n if (eventName === 'pusher:signin_success') {\n this._onSigninSuccess(event.data);\n }\n if (\n this.serverToUserChannel &&\n this.serverToUserChannel.name === event.channel\n ) {\n this.serverToUserChannel.handleEvent(event);\n }\n });\n }\n\n public signin() {\n if (this.signin_requested) {\n return;\n }\n\n this.signin_requested = true;\n this._signin();\n }\n\n private _signin() {\n if (!this.signin_requested) {\n return;\n }\n\n this._newSigninPromiseIfNeeded();\n\n if (this.pusher.connection.state !== 'connected') {\n // Signin will be attempted when the connection is connected\n return;\n }\n\n this.pusher.config.userAuthenticator(\n {\n socketId: this.pusher.connection.socket_id,\n },\n this._onAuthorize,\n );\n }\n\n private _onAuthorize: UserAuthenticationCallback = (\n err,\n authData: UserAuthenticationData,\n ) => {\n if (err) {\n Logger.warn(`Error during signin: ${err}`);\n this._cleanup();\n return;\n }\n\n this.pusher.send_event('pusher:signin', {\n auth: authData.auth,\n user_data: authData.user_data,\n });\n\n // Later when we get pusher:singin_success event, the user will be marked as signed in\n };\n\n private _onSigninSuccess(data: any) {\n try {\n this.user_data = JSON.parse(data.user_data);\n } catch (e) {\n Logger.error(`Failed parsing user data after signin: ${data.user_data}`);\n this._cleanup();\n return;\n }\n\n if (typeof this.user_data.id !== 'string' || this.user_data.id === '') {\n Logger.error(\n `user_data doesn't contain an id. user_data: ${this.user_data}`,\n );\n this._cleanup();\n return;\n }\n\n // Signin succeeded\n this._signinDoneResolve();\n this._subscribeChannels();\n }\n\n private _subscribeChannels() {\n const ensure_subscribed = (channel) => {\n if (channel.subscriptionPending && channel.subscriptionCancelled) {\n channel.reinstateSubscription();\n } else if (\n !channel.subscriptionPending &&\n this.pusher.connection.state === 'connected'\n ) {\n channel.subscribe();\n }\n };\n\n this.serverToUserChannel = new Channel(\n `#server-to-user-${this.user_data.id}`,\n this.pusher,\n );\n this.serverToUserChannel.bind_global((eventName, data) => {\n if (\n eventName.indexOf('pusher_internal:') === 0 ||\n eventName.indexOf('pusher:') === 0\n ) {\n // ignore internal events\n return;\n }\n this.emit(eventName, data);\n });\n ensure_subscribed(this.serverToUserChannel);\n }\n\n private _cleanup() {\n this.user_data = null;\n if (this.serverToUserChannel) {\n this.serverToUserChannel.unbind_all();\n this.serverToUserChannel.disconnect();\n this.serverToUserChannel = null;\n }\n\n if (this.signin_requested) {\n // If signin is in progress and cleanup is called,\n // Mark the current signin process as done.\n this._signinDoneResolve();\n }\n }\n\n private _newSigninPromiseIfNeeded() {\n if (!this.signin_requested) {\n return;\n }\n\n // If there is a promise and it is not resolved, return without creating a new one.\n if (this.signinDonePromise && !(this.signinDonePromise as any).done) {\n return;\n }\n\n // This promise is never rejected.\n // It gets resolved when the signin process is done whether it failed or succeeded\n const { promise, resolve, reject: _ } = flatPromise();\n (promise as any).done = false;\n const setDone = () => {\n (promise as any).done = true;\n };\n promise.then(setDone).catch(setDone);\n this.signinDonePromise = promise;\n this._signinDoneResolve = resolve;\n }\n}\n","/**\n * Per-channel delta state tracking with conflation key support\n */\n\nimport { CachedMessage, CacheSyncData, ChannelDeltaStats } from './types';\n\nexport default class ChannelState {\n channelName: string;\n conflationKey: string | null;\n maxMessagesPerKey: number;\n conflationCaches: Map<string, CachedMessage[]>;\n\n // Legacy single-base tracking (for non-conflation channels)\n baseMessage: string | null;\n baseSequence: number | null;\n lastSequence: number | null;\n\n // Statistics\n deltaCount: number;\n fullMessageCount: number;\n\n constructor(channelName: string) {\n this.channelName = channelName;\n this.conflationKey = null;\n this.maxMessagesPerKey = 10;\n this.conflationCaches = new Map();\n\n this.baseMessage = null;\n this.baseSequence = null;\n this.lastSequence = null;\n\n this.deltaCount = 0;\n this.fullMessageCount = 0;\n }\n\n /**\n * Initialize cache from server sync\n */\n initializeFromCacheSync(data: CacheSyncData): void {\n this.conflationKey = data.conflation_key || null;\n this.maxMessagesPerKey = data.max_messages_per_key || 10;\n this.conflationCaches.clear();\n\n if (data.states) {\n for (const [key, messages] of Object.entries(data.states)) {\n const cache = messages.map((msg) => ({\n content: msg.content,\n sequence: msg.seq,\n }));\n this.conflationCaches.set(key, cache);\n }\n }\n }\n\n /**\n * Set new base message (legacy - for non-conflation channels)\n */\n setBase(message: string, sequence: number): void {\n this.baseMessage = message;\n this.baseSequence = sequence;\n this.lastSequence = sequence;\n }\n\n /**\n * Get base message for a conflation key at specific index\n * Note: baseIndex is the sequence number, not array index\n */\n getBaseMessage(\n conflationKeyValue?: string,\n baseIndex?: number,\n ): string | null {\n if (!this.conflationKey) {\n // Legacy mode: return single base\n return this.baseMessage;\n }\n\n const key = conflationKeyValue || '';\n const cache = this.conflationCaches.get(key);\n\n if (!cache || baseIndex === undefined) {\n console.error('[ChannelState] No cache or baseIndex undefined', {\n hasCache: !!cache,\n baseIndex,\n key,\n allCacheKeys: Array.from(this.conflationCaches.keys()),\n });\n return null;\n }\n\n // baseIndex is actually a sequence number, not an array index\n // Find the message with matching sequence number\n const message = cache.find((msg) => msg.sequence === baseIndex);\n\n if (!message) {\n console.error('[ChannelState] Could not find message with sequence', {\n searchingFor: baseIndex,\n cacheSize: cache.length,\n cacheSequences: cache.map((m) => m.sequence),\n key: conflationKeyValue,\n });\n return null;\n }\n\n return message.content;\n }\n\n /**\n * Add or update message in conflation cache\n */\n updateConflationCache(\n conflationKeyValue: string | undefined,\n message: string,\n sequence: number,\n ): void {\n const key = conflationKeyValue || '';\n let cache = this.conflationCaches.get(key);\n\n if (!cache) {\n cache = [];\n this.conflationCaches.set(key, cache);\n }\n\n // If sequence is not greater than the last cache item, clear the cache entirely\n if (cache.length > 0) {\n const lastCacheItem = cache[cache.length - 1];\n if (sequence <= lastCacheItem.sequence) {\n cache.length = 0;\n }\n }\n\n // Add message to cache\n cache.push({ content: message, sequence });\n\n // Enforce max size (FIFO eviction)\n while (cache.length > this.maxMessagesPerKey) {\n cache.shift();\n }\n }\n\n /**\n * Check if we have a valid base\n */\n hasBase(): boolean {\n if (this.conflationKey) {\n return this.conflationCaches.size > 0;\n }\n return this.baseMessage !== null && this.baseSequence !== null;\n }\n\n /**\n * Validate sequence number\n */\n isValidSequence(sequence: number): boolean {\n if (this.lastSequence === null) {\n return true; // First message\n }\n return sequence > this.lastSequence;\n }\n\n /**\n * Update sequence after processing a message\n */\n updateSequence(sequence: number): void {\n this.lastSequence = sequence;\n }\n\n /**\n * Record delta received\n */\n recordDelta(): void {\n this.deltaCount++;\n }\n\n /**\n * Record full message received\n */\n recordFullMessage(): void {\n this.fullMessageCount++;\n }\n\n /**\n * Get statistics\n */\n getStats(): ChannelDeltaStats {\n return {\n channelName: this.channelName,\n conflationKey: this.conflationKey,\n conflationGroupCount: this.conflationCaches.size,\n deltaCount: this.deltaCount,\n fullMessageCount: this.fullMessageCount,\n totalMessages: this.deltaCount + this.fullMessageCount,\n };\n }\n}\n","/*! (c) Dmitry Chestnykh, D. Richard Hipp | BSD License | https://github.com/dchest/fossil-delta-js/ */\n// Hash window width in bytes. Must be a power of two.\nconst NHASH = 16;\nclass RollingHash {\n a = 0; // hash (16-bit unsigned)\n b = 0; // values (16-bit unsigned)\n i = 0; // start of the hash window (16-bit unsigned)\n z = new Array(NHASH); // the values that have been hashed.\n // Initialize the rolling hash using the first NHASH bytes of\n // z at the given position.\n init(z, pos) {\n let a = 0, b = 0;\n for (let i = 0; i < NHASH; i++) {\n const x = z[pos + i];\n a = (a + x) & 0xffff;\n b = (b + (NHASH - i) * x) & 0xffff;\n this.z[i] = x;\n }\n this.a = a & 0xffff;\n this.b = b & 0xffff;\n this.i = 0;\n }\n // Advance the rolling hash by a single byte \"c\".\n next(c) {\n const old = this.z[this.i];\n this.z[this.i] = c;\n this.i = (this.i + 1) & (NHASH - 1);\n this.a = (this.a - old + c) & 0xffff;\n this.b = (this.b - NHASH * old + this.a) & 0xffff;\n }\n // Return a 32-bit hash value.\n value() {\n return ((this.a & 0xffff) | ((this.b & 0xffff) << 16)) >>> 0;\n }\n}\nconst zDigits = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~\"\n .split(\"\")\n .map(function (x) {\n return x.charCodeAt(0);\n});\nconst zValue = [\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1,\n -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, 36, -1, 37,\n 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,\n 57, 58, 59, 60, 61, 62, -1, -1, -1, 63, -1,\n];\n// Reader reads bytes, chars, ints from array.\nclass Reader {\n a;\n pos;\n constructor(array) {\n this.a = array; // source array\n this.pos = 0; // current position in array\n }\n haveBytes() {\n return this.pos < this.a.length;\n }\n getByte() {\n const b = this.a[this.pos];\n this.pos++;\n if (this.pos > this.a.length)\n throw new RangeError(\"out of bounds\");\n return b;\n }\n getChar() {\n return String.fromCharCode(this.getByte());\n }\n // Read base64-encoded unsigned integer.\n getInt() {\n let v = 0;\n let c;\n while (this.haveBytes() && (c = zValue[0x7f & this.getByte()]) >= 0) {\n v = (v << 6) + c;\n }\n this.pos--;\n return v >>> 0;\n }\n}\n// Write writes an array.\nclass Writer {\n a = [];\n toByteArray(sourceType) {\n if (Array.isArray(sourceType)) {\n return this.a;\n }\n return new Uint8Array(this.a);\n }\n putByte(b) {\n this.a.push(b & 0xff);\n }\n // Write an ASCII character (s is a one-char string).\n putChar(s) {\n this.putByte(s.charCodeAt(0));\n }\n // Write a base64 unsigned integer.\n putInt(v) {\n const zBuf = [];\n if (v === 0) {\n this.putChar(\"0\");\n return;\n }\n let i = 0;\n for (; v > 0; i++, v >>>= 6) {\n zBuf.push(zDigits[v & 0x3f]);\n }\n for (let j = i - 1; j >= 0; j--) {\n this.putByte(zBuf[j]);\n }\n }\n // Copy from array at start to end.\n putArray(a, start, end) {\n // TODO: optimize\n for (let i = start; i < end; i++)\n this.a.push(a[i]);\n }\n}\n// Return the number digits in the base64 representation of a positive integer.\nfunction digitCount(v) {\n let i, x;\n for (i = 1, x = 64; v >= x; i++, x <<= 6) {\n /* nothing */\n }\n return i;\n}\n// Return a 32-bit checksum of the array.\nfunction checksum(arr) {\n let sum0 = 0, sum1 = 0, sum2 = 0, sum3 = 0, z = 0, N = arr.length;\n //TODO measure if this unrolling is helpful.\n while (N >= 16) {\n sum0 = (sum0 + arr[z + 0]) | 0;\n sum1 = (sum1 + arr[z + 1]) | 0;\n sum2 = (sum2 + arr[z + 2]) | 0;\n sum3 = (sum3 + arr[z + 3]) | 0;\n sum0 = (sum0 + arr[z + 4]) | 0;\n sum1 = (sum1 + arr[z + 5]) | 0;\n sum2 = (sum2 + arr[z + 6]) | 0;\n sum3 = (sum3 + arr[z + 7]) | 0;\n sum0 = (sum0 + arr[z + 8]) | 0;\n sum1 = (sum1 + arr[z + 9]) | 0;\n sum2 = (sum2 + arr[z + 10]) | 0;\n sum3 = (sum3 + arr[z + 11]) | 0;\n sum0 = (sum0 + arr[z + 12]) | 0;\n sum1 = (sum1 + arr[z + 13]) | 0;\n sum2 = (sum2 + arr[z + 14]) | 0;\n sum3 = (sum3 + arr[z + 15]) | 0;\n z += 16;\n N -= 16;\n }\n while (N >= 4) {\n sum0 = (sum0 + arr[z + 0]) | 0;\n sum1 = (sum1 + arr[z + 1]) | 0;\n sum2 = (sum2 + arr[z + 2]) | 0;\n sum3 = (sum3 + arr[z + 3]) | 0;\n z += 4;\n N -= 4;\n }\n sum3 = (((((sum3 + (sum2 << 8)) | 0) + (sum1 << 16)) | 0) + (sum0 << 24)) | 0;\n switch (N) {\n case 3:\n sum3 = (sum3 + (arr[z + 2] << 8)) | 0; /* falls through */\n case 2:\n sum3 = (sum3 + (arr[z + 1] << 16)) | 0; /* falls through */\n case 1:\n sum3 = (sum3 + (arr[z + 0] << 24)) | 0; /* falls through */\n }\n return sum3 >>> 0;\n}\n/**\n * Create a new delta array of bytes from source byte array to target byte array.\n */\nexport function createDelta(source, target) {\n const zDelta = new Writer();\n const lenOut = target.length;\n const lenSrc = source.length;\n let lastRead = -1;\n zDelta.putInt(lenOut);\n zDelta.putChar(\"\\n\");\n // If the source is very small, it means that we have no\n // chance of ever doing a copy command. Just output a single\n // literal segment for the entire target and exit.\n if (lenSrc <= NHASH) {\n zDelta.putInt(lenOut);\n zDelta.putChar(\":\");\n zDelta.putArray(target, 0, lenOut);\n zDelta.putInt(checksum(target));\n zDelta.putChar(\";\");\n return zDelta.toByteArray(source);\n }\n // Compute the hash table used to locate matching sections in the source.\n const nHash = Math.ceil(lenSrc / NHASH);\n const collide = new Array(nHash);\n const landmark = new Array(nHash);\n for (let i = 0; i < collide.length; i++) {\n collide[i] = -1;\n }\n for (let i = 0; i < landmark.length; i++) {\n landmark[i] = -1;\n }\n let hv;\n const h = new RollingHash();\n for (let i = 0; i < lenSrc - NHASH; i += NHASH) {\n h.init(source, i);\n hv = h.value() % nHash;\n collide[i / NHASH] = landmark[hv];\n landmark[hv] = i / NHASH;\n }\n let base = 0;\n let iSrc, iBlock, bestCnt, bestOfst, bestLitsz;\n while (base + NHASH < lenOut) {\n bestOfst = 0;\n bestLitsz = 0;\n h.init(target, base);\n let i = 0; // Trying to match a landmark against zOut[base+i]\n bestCnt = 0;\n while (1) {\n let limit = 250;\n hv = h.value() % nHash;\n iBlock = landmark[hv];\n while (iBlock >= 0 && limit-- > 0) {\n //\n // The hash window has identified a potential match against\n // landmark block iBlock. But we need to investigate further.\n //\n // Look for a region in zOut that matches zSrc. Anchor the search\n // at zSrc[iSrc] and zOut[base+i]. Do not include anything prior to\n // zOut[base] or after zOut[outLen] nor anything after zSrc[srcLen].\n //\n // Set cnt equal to the length of the match and set ofst so that\n // zSrc[ofst] is the first element of the match. litsz is the number\n // of characters between zOut[base] and the beginning of the match.\n // sz will be the overhead (in bytes) needed to encode the copy\n // command. Only generate copy command if the overhead of the\n // copy command is less than the amount of literal text to be copied.\n //\n let cnt, ofst, litsz;\n let j, k, x, y;\n let sz;\n // Beginning at iSrc, match forwards as far as we can.\n // j counts the number of characters that match.\n iSrc = iBlock * NHASH;\n for (j = 0, x = iSrc, y = base + i; x < lenSrc && y < lenOut; j++, x++, y++) {\n if (source[x] !== target[y])\n break;\n }\n j--;\n // Beginning at iSrc-1, match backwards as far as we can.\n // k counts the number of characters that match.\n for (k = 1; k < iSrc && k <= i; k++) {\n if (source[iSrc - k] !== target[base + i - k])\n break;\n }\n k--;\n // Compute the offset and size of the matching region.\n ofst = iSrc - k;\n cnt = j + k + 1;\n litsz = i - k; // Number of bytes of literal text before the copy\n // sz will hold the number of bytes needed to encode the \"insert\"\n // command and the copy command, not counting the \"insert\" text.\n sz = digitCount(i - k) + digitCount(cnt) + digitCount(ofst) + 3;\n if (cnt >= sz && cnt > bestCnt) {\n // Remember this match only if it is the best so far and it\n // does not increase the file size.\n bestCnt = cnt;\n bestOfst = iSrc - k;\n bestLitsz = litsz;\n }\n // Check the next matching block\n iBlock = collide[iBlock];\n }\n // We have a copy command that does not cause the delta to be larger\n // than a literal insert. So add the copy command to the delta.\n if (bestCnt > 0) {\n if (bestLitsz > 0) {\n // Add an insert command before the copy.\n zDelta.putInt(bestLitsz);\n zDelta.putChar(\":\");\n zDelta.putArray(target, base, base + bestLitsz);\n base += bestLitsz;\n }\n base += bestCnt;\n zDelta.putInt(bestCnt);\n zDelta.putChar(\"@\");\n zDelta.putInt(bestOfst);\n zDelta.putChar(\",\");\n if (bestOfst + bestCnt - 1 > lastRead) {\n lastRead = bestOfst + bestCnt - 1;\n }\n bestCnt = 0;\n break;\n }\n // If we reach this point, it means no match is found so far\n if (base + i + NHASH >= lenOut) {\n // We have reached the end and have not found any\n // matches. Do an \"insert\" for everything that does not match\n zDelta.putInt(lenOut - base);\n zDelta.putChar(\":\");\n zDelta.putArray(target, base, base + lenOut - base);\n base = lenOut;\n break;\n }\n // Advance the hash by one character. Keep looking for a match.\n h.next(target[base + i + NHASH]);\n i++;\n }\n }\n // Output a final \"insert\" record to get all the text at the end of\n // the file that does not match anything in the source.\n if (base < lenOut) {\n zDelta.putInt(lenOut - base);\n zDelta.putChar(\":\");\n zDelta.putArray(target, base, base + lenOut - base);\n }\n // Output the final checksum record.\n zDelta.putInt(checksum(target));\n zDelta.putChar(\";\");\n return zDelta.toByteArray(source);\n}\n/**\n * Return the size (in bytes) of the target from applying a delta.\n */\nexport function getDeltaTargetSize(delta) {\n const zDelta = new Reader(delta);\n const size = zDelta.getInt();\n if (zDelta.getChar() !== \"\\n\") {\n throw new Error(\"size integer not terminated by '\\\\n'\");\n }\n return size;\n}\n/**\n * Apply a delta byte array to a source byte array, returning the target byte array.\n */\nexport function applyDelta(source, delta, opts) {\n let limit, total = 0;\n const zDelta = new Reader(delta);\n const lenSrc = source.length;\n const lenDelta = delta.length;\n limit = zDelta.getInt();\n if (zDelta.getChar() !== \"\\n\")\n throw new Error(\"size integer not terminated by '\\\\n'\");\n const zOut = new Writer();\n while (zDelta.haveBytes()) {\n let cnt = zDelta.getInt();\n let ofst;\n switch (zDelta.getChar()) {\n case \"@\":\n ofst = zDelta.getInt();\n if (zDelta.haveBytes() && zDelta.getChar() !== \",\")\n throw new Error(\"copy command not terminated by ','\");\n total += cnt;\n if (total > limit)\n throw new Error(\"copy exceeds output file size\");\n if (ofst + cnt > lenSrc)\n throw new Error(\"copy extends past end of input\");\n zOut.putArray(source, ofst, ofst + cnt);\n break;\n case \":\":\n total += cnt;\n if (total > limit)\n throw new Error(\"insert command gives an output larger than predicted\");\n if (cnt > lenDelta)\n throw new Error(\"insert count exceeds size of delta\");\n zOut.putArray(zDelta.a, zDelta.pos, zDelta.pos + cnt);\n zDelta.pos += cnt;\n break;\n case \";\":\n const out = zOut.toByteArray(source);\n if ((!opts || opts.verifyChecksum !== false) && cnt !== checksum(out))\n throw new Error(\"bad checksum\");\n if (total !== limit)\n throw new Error(\"generated size does not match predicted size\");\n return out;\n default:\n throw new Error(\"unknown delta operator\");\n }\n }\n throw new Error(\"unterminated delta\");\n}\n/**\n * Create a new string delta from a source string to a target string.\n */\nexport function createStringDelta(source, target) {\n const deltaArray = createDelta(new TextEncoder().encode(source), new TextEncoder().encode(target));\n return new TextDecoder().decode(new Uint8Array(deltaArray));\n}\n/**\n * Apply a string delta to a source string, returning the target string.\n */\nexport function applyStringDelta(source, delta, opts) {\n const deltaArray = applyDelta(new TextEncoder().encode(source), new TextEncoder().encode(delta), opts);\n return new TextDecoder().decode(new Uint8Array(deltaArray));\n}\n/**\n * Return the size (in bytes) of the target from applying a delta string.\n * Note that the returned size is in UTF-8 encoded bytes, not string length.\n */\nexport function getStringDeltaTargetSize(delta) {\n const lineEnd = delta.indexOf(\"\\n\");\n if (lineEnd === -1) {\n throw new Error(\"size integer not terminated by '\\\\n'\");\n }\n const sizeLine = delta.slice(0, lineEnd + 1);\n const zDelta = new Reader(new TextEncoder().encode(sizeLine));\n const size = zDelta.getInt();\n if (zDelta.getChar() !== \"\\n\") {\n // This can happen if getInt didn't read the full line.\n throw new Error(\"size integer not terminated by '\\\\n'\");\n }\n return size;\n}\n","'use strict';\n/**\n * Takes in array of names of errors and returns an object mapping those names to error functions that take in one parameter that is used as the message for the error\n * @param names {[]}\n * @returns {{name1: function(message),...}}\n * @constructor\n */\nfunction CustomErrors(names) {\n let errors = {};\n names.forEach(name => {\n let CustomError = function CustomError(message) {\n var temp = Error.apply(this, arguments);\n temp.name = this.name = name;\n this.stack = temp.stack;\n this.message = temp.message;\n this.name = name;\n this.message = message;\n };\n CustomError.prototype = Object.create(Error.prototype, {\n constructor: {\n value: CustomError,\n writable: true,\n configurable: true\n }\n });\n errors[name] = CustomError;\n });\n return errors;\n}\n\nexport default /* @__PURE__ */ CustomErrors(['NotImplemented', 'InvalidDelta']);\n","'use strict';\n\nexport function uint8ArrayToString(uintArray) {\n let encodedString = String.fromCharCode.apply(null, uintArray);\n let decodedString = decodeURIComponent(escape(encodedString));\n return decodedString;\n}\n\nexport function stringToUint8Array(str) {\n var buf = new Uint8Array(str.length);\n for (var i=0, strLen=str.length; i < strLen; i++) {\n buf[i] = str.charCodeAt(i);\n }\n return buf;\n}\n\nexport function equal(typedArray1, typedArray2) {\n if (typedArray1.length !== typedArray2.length) {\n return false;\n }\n for (let i = 0; i < typedArray1.length; i++) {\n if (typedArray1[i] !== typedArray2[i]) {\n return false;\n }\n }\n return true;\n}\n\nexport class TypedArrayList {\n constructor() {\n this.typedArrays = [];\n this.startIndexes = [];\n this.length = 0;\n }\n\n add(typedArray) {\n let typedArrayTypes = [Int8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array,\n Int32Array, Uint32Array, Float32Array, Float64Array];\n\n let matchingTypedArrayTypes = typedArrayTypes.filter(typedArrayType => typedArray instanceof typedArrayType);\n if (matchingTypedArrayTypes.length < 1) {\n throw Error('Given ' + typeof typedArray + ' when expected a TypedArray');\n }\n\n let startIndex;\n if (this.typedArrays.length === 0) {\n startIndex = 0;\n }\n else {\n let lastIndex = this.startIndexes.length - 1;\n let lastStartIndex = this.startIndexes[lastIndex];\n let lastLength = this.typedArrays[lastIndex].length;\n startIndex = lastStartIndex + lastLength;\n }\n\n this.startIndexes.push(startIndex);\n this.typedArrays.push(typedArray);\n this.length += startIndex + typedArray.length;\n };\n\n get(index) {\n let listIndex = getIndex(this.startIndexes, index);\n let typedArray = index - this.startIndexes[listIndex];\n return this.typedArrays[listIndex][typedArray];\n };\n\n set(index, value) {\n if (typeof index !== 'number' || isNaN(index)) {\n throw new Error('Given non-number index: ' + index);\n }\n //console.log(index);\n\n let listIndex = getIndex(this.startIndexes, index);\n let typedArrayIndex = index - this.startIndexes[listIndex];\n this.typedArrays[listIndex][typedArrayIndex] = value;\n };\n}\n\nfunction getIndex(arr, element) {\n // Performance optimization for most common case\n if (arr.length === 2) {\n return element < arr[1] ? 0 : 1;\n }\n\n let low = 0;\n let high = arr.length - 1;\n\n while (low < high) {\n let mid = Math.floor((low + high) / 2);\n\n if (arr[mid] === element) {\n return mid;\n }\n else if (arr[mid] < element) {\n low = mid + 1;\n }\n else {\n high = mid - 1;\n }\n }\n if (arr[high] > element) {\n return high - 1;\n }\n else {\n return high;\n }\n}\n","'use strict';\n\n/**\n * Converts RFC 3284 definition of integer in buffer to decimal\n * Also returns the index of the byte after the integer\n * @param buffer {Uint8Array}\n * @param position {Number}\n * @returns {{position: {Number}, value: {Number}}}\n */\nexport default function integer(buffer, position) {\n const result = { position, value: 0 };\n\n do {\n /* Shift the existing value left for 7 bits (base127 conversion)\n and merge it with the next value without its highest bit */\n result.value = (result.value << 7) | (buffer[result.position] & 127);\n\n /* Avoid Number overflows */\n if (result.value < 0) {\n throw new Error('RFC 3284 Integer conversion: Buffer overflow');\n }\n } while (buffer[result.position++] & 128);\n\n return result;\n}\n","'use strict';\n\nimport deserializeInteger from './deserialize/integer';\nimport * as TypedArray from './typed_array_util';\n\nclass ADD {\n constructor(size) {\n this.size = size;\n }\n\n name = 'ADD';\n\n execute(delta) {\n for (let i = 0; i < this.size; i++) {\n delta.U.set(delta.UTargetPosition + i, delta.data[delta.dataPosition + i]);\n }\n delta.dataPosition += this.size;\n delta.UTargetPosition += this.size;\n };\n}\n\nclass COPY {\n constructor(size, mode) {\n this.size = size;\n this.mode = mode;\n }\n\n name = 'COPY';\n\n execute(delta) {\n let address, m, next, method;\n\n if (this.mode === 0) {\n address = delta.getNextAddressInteger();\n }\n else if (this.mode === 1) {\n next = delta.getNextAddressInteger();\n address = delta.UTargetPosition - next;\n }\n else if ((m = this.mode - 2) >= 0 && (m < delta.nearCache.size)) {\n next = delta.getNextAddressInteger();\n address = delta.nearCache.get(m, next);\n method = 'near';\n }\n // same cache\n else {\n m = this.mode - (2 + delta.nearCache.size);\n next = delta.getNextAddressByte();\n address = delta.sameCache.get(m, next);\n method = 'same';\n }\n\n delta.nearCache.update(address);\n delta.sameCache.update(address);\n\n for (let i = 0; i < this.size; i++) {\n delta.U.set(delta.UTargetPosition + i, delta.U.get(address + i));\n }\n\n delta.UTargetPosition += this.size;\n }\n};\n\nclass RUN {\n constructor(size) {\n this.size = size;\n }\n\n name = 'RUN';\n\n execute(delta) {\n for (let i = 0; i < this.size; i++) {\n // repeat single byte\n delta.U.set(delta.UTargetPosition + i, delta.data[delta.dataPosition]);\n }\n // increment to next byte\n delta.dataPosition++;\n delta.UTargetPosition += this.size;\n };\n}\n\nlet instructions = {\n ADD,\n COPY,\n RUN\n};\n\nexport default instructions;\n","'use strict';\n\nimport instructions from './instructions';\nimport deserializeInteger from './deserialize/integer';\n\nexport default function tokenizeInstructions(instructionsBuffer) {\n let deserializedInstructions = [];\n\n let instructionsPosition = 0;\n\n while (instructionsPosition < instructionsBuffer.length) {\n let index = instructionsBuffer[instructionsPosition++];\n\n let addSize, copySize, size;\n\n if (index === 0) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.RUN(size));\n }\n else if (index === 1) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.ADD(size));\n }\n else if (index < 19) {\n deserializedInstructions.push(new instructions.ADD(index - 1));\n }\n else if (index === 19) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 0));\n }\n else if (index < 35) {\n deserializedInstructions.push(new instructions.COPY(index - 16, 0));\n }\n else if (index === 35) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 1));\n }\n else if (index < 51) {\n deserializedInstructions.push(new instructions.COPY(index - 32, 1));\n }\n else if (index === 51) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 2));\n }\n else if (index < 67) {\n deserializedInstructions.push(new instructions.COPY(index - 48, 2));\n }\n else if (index === 67) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 3));\n }\n else if (index < 83) {\n deserializedInstructions.push(new instructions.COPY(index - 64, 3));\n }\n else if (index === 83) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 4));\n }\n else if (index < 99) {\n deserializedInstructions.push(new instructions.COPY(index - 80, 4));\n }\n else if (index === 99) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 5));\n }\n else if (index < 115) {\n deserializedInstructions.push(new instructions.COPY(index - 96, 5));\n }\n else if (index === 115) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 6));\n }\n else if (index < 131) {\n deserializedInstructions.push(new instructions.COPY(index - 112, 6));\n }\n else if (index === 131) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 7));\n }\n else if (index < 147) {\n deserializedInstructions.push(new instructions.COPY(index - 128, 7));\n }\n else if (index === 147) {\n ({ value: size, position: instructionsPosition } = deserializeInteger(instructionsBuffer, instructionsPosition));\n deserializedInstructions.push(new instructions.COPY(size, 8));\n }\n else if (index < 163) {\n deserializedInstructions.push(new instructions.COPY(index - 144, 8));\n }\n else if (index < 175) {\n ({addSize, copySize} = ADD_COPY(index, 163));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 0));\n }\n else if (index < 187) {\n ({addSize, copySize} = ADD_COPY(index, 175));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 1));\n }\n else if (index < 199) {\n ({addSize, copySize} = ADD_COPY(index, 187));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 2));\n }\n else if (index < 211) {\n ({addSize, copySize} = ADD_COPY(index, 199));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 3));\n }\n else if (index < 223) {\n ({addSize, copySize} = ADD_COPY(index, 211));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 4));\n }\n else if (index < 235) {\n ({addSize, copySize} = ADD_COPY(index, 223));\n\n deserializedInstructions.push(new instructions.ADD(addSize));\n deserializedInstructions.push(new instructions.COPY(copySize, 5));\n }\n else if (index < 239) {\n deserializedInstructions.push(new instructions.ADD(index - 235 + 1));\n deserializedInstructions.push(new instructions.COPY(4, 6));\n }\n else if (index < 243) {\n deserializedInstructions.push(new instructions.ADD(index - 239 + 1));\n deserializedInstructions.push(new instructions.COPY(4, 7));\n }\n else if (index < 247) {\n deserializedInstructions.push(new instructions.ADD(index - 243 + 1));\n deserializedInstructions.push(new instructions.COPY(4, 8));\n }\n else if (index < 256) {\n deserializedInstructions.push(new instructions.COPY(4, index - 247));\n deserializedInstructions.push(new instructions.ADD(1));\n }\n else {\n throw new Error('Should not get here');\n }\n }\n\n return deserializedInstructions;\n}\n\nfunction ADD_COPY(index, baseIndex) {\n let zeroBased = index - baseIndex;\n\n // 0,1,2 -> 0 3,4,5 -> 1 etc.\n let addSizeIndex = Math.floor(zeroBased / 3);\n // offset so size starts at 1\n let addSize = addSizeIndex + 1;\n\n // rotate through 0, 1, and 2\n let copySizeIndex = zeroBased % 3;\n // offset so size starts at 4\n let copySize = copySizeIndex + 4;\n\n return {addSize, copySize};\n}\n","'use strict';\n\nimport errors from '../errors';\nimport deserializeInteger from './integer';\nimport tokenizeInstructions from '../tokenize_instructions';\n\nexport default function delta(delta, position) {\n\n let targetWindowLength, dataLength, instructionsLength, addressesLength;\n\n // parentheses are needed for assignment destructuring\n ({ value: targetWindowLength, position } = deserializeInteger(delta, position));\n\n // Delta_Indicator byte\n if (delta[position] !== 0) {\n throw new errors.NotImplemented(\n 'VCD_DECOMPRESS is not supported, Delta_Indicator must be zero at byte ' + position + ' and not ' + delta[position]\n );\n }\n position++;\n\n ({ value: dataLength, position } = deserializeInteger(delta, position));\n ({ value: instructionsLength, position } = deserializeInteger(delta, position));\n ({ value: addressesLength, position } = deserializeInteger(delta, position));\n\n let dataNextPosition = position + dataLength;\n let data = delta.slice(position, dataNextPosition);\n\n let instructionsNextPosition = dataNextPosition + instructionsLength;\n let instructions = delta.slice(dataNextPosition, instructionsNextPosition);\n let deserializedInstructions = tokenizeInstructions(instructions);\n\n let addressesNextPosition = instructionsNextPosition + addressesLength;\n let addresses = delta.slice(instructionsNextPosition, addressesNextPosition);\n\n position = addressesNextPosition;\n\n let window = {\n targetWindowLength,\n position,\n data,\n instructions: deserializedInstructions,\n addresses\n };\n\n return window;\n}\n","'use strict';\n\nexport default class NearCache {\n constructor(size) {\n this.size = size;\n this.near = new Array(this.size).fill(0);\n this.nextSlot = 0;\n }\n\n update(address) {\n if (this.near.length > 0) {\n this.near[this.nextSlot] = address;\n this.nextSlot = (this.nextSlot + 1) % this.near.length;\n }\n }\n\n get(m, offset) {\n let address = this.near[m] + offset;\n return address;\n };\n}\n","'use strict';\n\nexport default class SameCache {\n constructor(size) {\n this.size = size;\n this.same = new Array(this.size * 256).fill(0);\n }\n\n update(address) {\n if (this.same.length > 0) {\n this.same[address % (this.size * 256)] = address;\n }\n };\n\n get(m, offset) {\n let address = this.same[m * 256 + offset];\n return address;\n };\n}\n","'use strict';\n\nimport errors from './errors';\nimport * as TypedArray from './typed_array_util';\nimport deserializeInteger from './deserialize/integer';\nimport deserializeDelta from './deserialize/delta';\nimport NearCache from './address_caches/near';\nimport SameCache from './address_caches/same';\n\n/**\n *\n * @param delta {Uint8Array}\n * @param source {Uint8Array}\n * @constructor\n */\nexport default class VCDiff {\n constructor(delta, source) {\n this.delta = delta;\n this.position = 0;\n this.source = source;\n this.targetWindows = new TypedArray.TypedArrayList();\n }\n\n decode() {\n this._consumeHeader();\n while (this._consumeWindow()) {}\n\n let targetLength = this.targetWindows.typedArrays.reduce((sum, uint8Array) => uint8Array.length + sum, 0);\n let target = new Uint8Array(targetLength);\n let position = 0;\n\n // concat all uint8arrays\n for (let arrayNum = 0; arrayNum < this.targetWindows.typedArrays.length; arrayNum++) {\n let array = this.targetWindows.typedArrays[arrayNum];\n let length = array.length;\n target.set(array, position);\n position += length;\n }\n\n return target;\n };\n\n _consumeHeader() {\n\n let hasVCDiffHeader = this.delta[0] === 214 && // V\n this.delta[1] === 195 && // C\n this.delta[2] === 196 && // D\n this.delta[3] === 0; // \\0\n\n if (!hasVCDiffHeader) {\n throw new errors.InvalidDelta('first 3 bytes not VCD');\n }\n\n let hdrIndicator = this.delta[4];\n // extract least significant bit\n let vcdDecompress = 1 & hdrIndicator;\n // extract second least significant bit\n let vcdCodetable = 1 & (hdrIndicator >> 1);\n\n // verify not using Hdr_Indicator\n if (vcdDecompress || vcdCodetable) {\n throw new errors.NotImplemented(\n 'non-zero Hdr_Indicator (VCD_DECOMPRESS or VCD_CODETABLE bit is set)'\n );\n }\n\n this.position += 5;\n };\n\n _consumeWindow() {\n let winIndicator = this.delta[this.position++];\n\n // extract least significant bit\n let vcdSource = 1 & winIndicator;\n // extract second least significant bit\n let vcdTarget = 1 & (winIndicator >> 1);\n\n if (vcdSource && vcdTarget) {\n throw new errors.InvalidDelta(\n 'VCD_SOURCE and VCD_TARGET cannot both be set in Win_Indicator'\n )\n }\n else if (vcdSource) {\n let sourceSegmentLength, sourceSegmentPosition, deltaLength;\n ({ value: sourceSegmentLength, position: this.position } = deserializeInteger(this.delta, this.position));\n ({ value: sourceSegmentPosition, position: this.position } = deserializeInteger(this.delta, this.position));\n ({ value: deltaLength, position: this.position } = deserializeInteger(this.delta, this.position));\n\n let sourceSegment = this.source.slice(sourceSegmentPosition, sourceSegmentPosition + sourceSegmentLength);\n this._buildTargetWindow(this.position, sourceSegment);\n this.position += deltaLength;\n }\n else if (vcdTarget) {\n throw new errors.NotImplemented(\n 'non-zero VCD_TARGET in Win_Indicator'\n )\n }\n else {\n let deltaLength;\n ({ value: deltaLength, position: this.position } = deserializeInteger(this.delta, this.position));\n\n this._buildTargetWindow(this.position);\n this.position += deltaLength;\n }\n\n return this.position < this.delta.length;\n };\n\n // first integer is target window length\n _buildTargetWindow(position, sourceSegment) {\n let window = deserializeDelta(this.delta, position);\n\n let T = new Uint8Array(window.targetWindowLength);\n\n let U = new TypedArray.TypedArrayList();\n let uTargetPosition = 0;\n if (sourceSegment) {\n U.add(sourceSegment);\n uTargetPosition = sourceSegment.length;\n }\n U.add(T);\n\n let targetPosition = this.source.length;\n let dataPosition = 0;\n\n let delta = new Delta(U, uTargetPosition, window.data, window.addresses);\n window.instructions.forEach(instruction => {\n instruction.execute(delta);\n });\n\n this.targetWindows.add(T);\n };\n}\n\nclass Delta {\n constructor(U, UTargetPosition, data, addresses) {\n this.U = U;\n this.UTargetPosition = UTargetPosition;\n this.data = data;\n this.dataPosition = 0;\n this.addresses = addresses;\n this.addressesPosition = 0;\n this.nearCache = new NearCache(4);\n this.sameCache = new SameCache(3);\n }\n\n getNextAddressInteger() {\n let value;\n // get next address and increase the address position for the next address\n ({value, position: this.addressesPosition } = deserializeInteger(this.addresses, this.addressesPosition));\n return value;\n };\n\n getNextAddressByte() {\n // get next address and increase the address position for the next address\n let value = this.addresses[this.addressesPosition++];\n return value;\n };\n}\n","'use strict';\n\nimport VCDiff from './vcdiff';\n\n/**\n * Vcdiff decode, applying delta to source and returning the result.\n * \n * @param delta {Uint8Array} The Vcdiff format diff/patch to apply to source.\n * @param source {Uint8Array} The source to apply the delta diff/patch to.\n * @returns {Uint8Array} The result of applying delta to source.\n */\nexport function decode(delta, source) {\n let vcdiff = new VCDiff(delta, source);\n return vcdiff.decode();\n}\n","/**\n * Delta Decoders for Fossil and Xdelta3 algorithms\n */\n\nimport { applyDelta as fossilApplyDelta } from 'fossil-delta';\nimport { decode as vcdiffDecode } from '@ably/vcdiff-decoder';\n\n// Also check for globals (for browser builds without bundler)\nconst fossilDeltaGlobal =\n typeof window !== 'undefined' ? (window as any).fossilDelta : undefined;\nconst vcdiffGlobal =\n typeof window !== 'undefined' ? (window as any).vcdiff : undefined;\n\n/**\n * Base64 decode a string to Uint8Array\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Convert Uint8Array to string\n */\nfunction bytesToString(bytes: Uint8Array | number[]): string {\n // Handle array-like objects that might not be proper Uint8Array\n if (Array.isArray(bytes) || !(bytes instanceof Uint8Array)) {\n bytes = new Uint8Array(bytes);\n }\n return new TextDecoder().decode(bytes);\n}\n\n/**\n * Convert string to Uint8Array\n */\nfunction stringToBytes(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/**\n * Fossil Delta decoder\n */\nexport class FossilDeltaDecoder {\n static isAvailable(): boolean {\n return (\n typeof fossilApplyDelta !== 'undefined' ||\n (typeof fossilDeltaGlobal !== 'undefined' && fossilDeltaGlobal.apply)\n );\n }\n\n static apply(base: string | Uint8Array, delta: string | Uint8Array): string {\n if (!this.isAvailable()) {\n throw new Error('Fossil Delta library not loaded');\n }\n\n const baseBytes = typeof base === 'string' ? stringToBytes(base) : base;\n const deltaBytes = typeof delta === 'string' ? stringToBytes(delta) : delta;\n\n try {\n let result: Uint8Array;\n\n // Try ES6 import first\n if (typeof fossilApplyDelta !== 'undefined') {\n result = fossilApplyDelta(baseBytes, deltaBytes);\n }\n // Fall back to global\n else if (fossilDeltaGlobal && fossilDeltaGlobal.apply) {\n result = fossilDeltaGlobal.apply(baseBytes, deltaBytes);\n } else {\n throw new Error('No fossil-delta implementation found');\n }\n\n return bytesToString(result);\n } catch (error) {\n throw new Error(\n `Fossil delta decode failed: ${(error as Error).message} (base=${baseBytes.length}B delta=${deltaBytes.length}B)`,\n );\n }\n }\n}\n\n/**\n * Xdelta3 (VCDIFF) decoder\n */\nexport class Xdelta3Decoder {\n static isAvailable(): boolean {\n return (\n typeof vcdiffDecode !== 'undefined' ||\n (typeof vcdiffGlobal !== 'undefined' && vcdiffGlobal.decode)\n );\n }\n\n static apply(base: string | Uint8Array, delta: string | Uint8Array): string {\n if (!this.isAvailable()) {\n throw new Error('Xdelta3/VCDIFF library not loaded');\n }\n\n const baseBytes = typeof base === 'string' ? stringToBytes(base) : base;\n const deltaBytes = typeof delta === 'string' ? stringToBytes(delta) : delta;\n\n try {\n let result: Uint8Array;\n\n // Try ES6 import first\n if (typeof vcdiffDecode !== 'undefined') {\n // @ably/vcdiff-decoder API: decode(delta, source)\n result = vcdiffDecode(deltaBytes, baseBytes);\n }\n // Fall back to global\n else if (vcdiffGlobal && vcdiffGlobal.decode) {\n result = vcdiffGlobal.decode(deltaBytes, baseBytes);\n } else {\n throw new Error('No VCDIFF decoder implementation found');\n }\n\n return bytesToString(result);\n } catch (error) {\n throw new Error(\n `Xdelta3 decode failed: ${(error as Error).message} (base=${baseBytes.length}B delta=${deltaBytes.length}B)`,\n );\n }\n }\n}\n\nexport { base64ToBytes, bytesToString, stringToBytes };\n","/**\n * Delta Compression Manager\n *\n * Handles delta compression for Pusher messages with support for:\n * - Multiple delta algorithms (Fossil, Xdelta3)\n * - Conflation keys for efficient per-entity caching\n * - Bandwidth statistics tracking\n */\n\nimport Logger from '../logger';\nimport { PusherEvent } from '../connection/protocol/message-types';\nimport ChannelState from './channel_state';\nimport { FossilDeltaDecoder, Xdelta3Decoder, base64ToBytes } from './decoders';\nimport {\n DeltaOptions,\n DeltaStats,\n DeltaMessage,\n DeltaAlgorithm,\n CacheSyncData,\n} from './types';\n\nexport default class DeltaCompressionManager {\n private options: Required<DeltaOptions>;\n private enabled: boolean;\n private channelStates: Map<string, ChannelState>;\n private stats: {\n totalMessages: number;\n deltaMessages: number;\n fullMessages: number;\n totalBytesWithoutCompression: number;\n totalBytesWithCompression: number;\n errors: number;\n };\n private availableAlgorithms: DeltaAlgorithm[];\n private sendEventCallback: (event: string, data: any) => boolean;\n\n constructor(\n options: DeltaOptions = {},\n sendEventCallback: (event: string, data: any) => boolean,\n ) {\n this.options = {\n enabled: options.enabled !== false,\n algorithms: options.algorithms || ['fossil', 'xdelta3'],\n debug: options.debug || false,\n onStats: options.onStats || null,\n onError: options.onError || null,\n };\n\n this.enabled = false;\n this.channelStates = new Map();\n this.stats = {\n totalMessages: 0,\n deltaMessages: 0,\n fullMessages: 0,\n totalBytesWithoutCompression: 0,\n totalBytesWithCompression: 0,\n errors: 0,\n };\n\n this.sendEventCallback = sendEventCallback;\n this.availableAlgorithms = this.detectAvailableAlgorithms();\n\n if (this.availableAlgorithms.length === 0) {\n Logger.warn(\n '[DeltaCompression] No delta algorithms available. ' +\n 'Please include fossil-delta or vcdiff-decoder libraries.',\n );\n }\n }\n\n /**\n * Detect which algorithm libraries are loaded\n */\n private detectAvailableAlgorithms(): DeltaAlgorithm[] {\n const available: DeltaAlgorithm[] = [];\n\n if (FossilDeltaDecoder.isAvailable()) {\n available.push('fossil');\n this.log('Fossil Delta decoder available');\n }\n\n if (Xdelta3Decoder.isAvailable()) {\n available.push('xdelta3');\n this.log('Xdelta3 decoder available');\n }\n\n return available;\n }\n\n /**\n * Enable delta compression\n */\n enable(): void {\n if (this.enabled || !this.options.enabled) {\n return;\n }\n\n if (this.availableAlgorithms.length === 0) {\n this.log('No delta algorithms available, cannot enable');\n return;\n }\n\n // Filter to only algorithms we support AND want to use\n const supportedAlgorithms = this.availableAlgorithms.filter((algo) =>\n this.options.algorithms.includes(algo),\n );\n\n if (supportedAlgorithms.length === 0) {\n this.log('No mutually supported algorithms');\n return;\n }\n\n // Send enable request\n this.log('Sending enable request', supportedAlgorithms);\n this.sendEventCallback('pusher:enable_delta_compression', {\n algorithms: supportedAlgorithms,\n });\n }\n\n /**\n * Disable delta compression\n * Note: We intentionally do NOT clear channelStates here.\n * This allows state to be preserved across enable/disable cycles,\n * which is important for reconnection scenarios and user toggling.\n * Use clearChannelState() if you need to explicitly clear state.\n */\n disable(): void {\n this.enabled = false;\n }\n\n /**\n * Handle delta compression enabled confirmation\n */\n handleEnabled(data: any): void {\n this.enabled = data.enabled || true;\n this.log('Delta compression enabled', data);\n }\n\n /**\n * Handle cache sync message (conflation keys)\n */\n handleCacheSync(channel: string, data: CacheSyncData): void {\n this.log('Received cache sync', {\n channel,\n conflationKey: data.conflation_key,\n groupCount: Object.keys(data.states || {}).length,\n });\n\n let channelState = this.channelStates.get(channel);\n if (!channelState) {\n channelState = new ChannelState(channel);\n this.channelStates.set(channel, channelState);\n }\n\n channelState.initializeFromCacheSync(data);\n this.log('Cache initialized', channelState.getStats());\n }\n\n /**\n * Handle delta-compressed message\n */\n handleDeltaMessage(\n channel: string,\n deltaData: DeltaMessage,\n ): PusherEvent | null {\n let deltaBytes: Uint8Array | null = null;\n\n try {\n const event = deltaData.event;\n const delta = deltaData.delta;\n const sequence = deltaData.seq;\n const algorithm = deltaData.algorithm || 'fossil';\n const conflationKey = deltaData.conflation_key;\n const baseIndex = deltaData.base_index;\n\n this.log('Received delta message', {\n channel,\n event,\n sequence,\n algorithm,\n conflationKey,\n baseIndex,\n deltaSize: delta.length,\n });\n\n // Get channel state\n let channelState = this.channelStates.get(channel);\n if (!channelState) {\n // Silently ignore - this is likely an in-flight delta message for an unsubscribed channel\n // No need to log errors or request resync since the channel is gone\n this.log(`Ignoring delta for unsubscribed channel: ${channel}`);\n return null;\n }\n\n // Get base message\n let baseMessage: string | null;\n if (channelState.conflationKey) {\n baseMessage = channelState.getBaseMessage(conflationKey, baseIndex);\n if (!baseMessage) {\n this.error(\n `No base message (conflation path) for channel ${channel}`,\n {\n path: 'conflation',\n channel,\n deltaConflationKey: conflationKey,\n deltaBaseIndex: baseIndex,\n deltaSeq: sequence,\n channelStateConflationKey: channelState.conflationKey,\n channelStateBaseMessage: channelState.baseMessage ? 'exists' : null,\n channelStateBaseSequence: channelState.baseSequence,\n channelStateLastSequence: channelState.lastSequence,\n conflationCacheKeys: Array.from(channelState.conflationCaches.keys()),\n conflationCacheSizes: Array.from(\n channelState.conflationCaches.entries(),\n ).map(([key, cache]) => ({ key, size: cache.length })),\n },\n );\n this.requestResync(channel);\n return null;\n }\n } else {\n baseMessage = channelState.baseMessage;\n if (!baseMessage) {\n this.error(\n `No base message (legacy path) for channel ${channel}`,\n {\n path: 'legacy',\n channel,\n deltaConflationKey: conflationKey,\n deltaBaseIndex: baseIndex,\n deltaSeq: sequence,\n channelStateConflationKey: channelState.conflationKey,\n channelStateBaseMessage: null,\n channelStateBaseSequence: channelState.baseSequence,\n channelStateLastSequence: channelState.lastSequence,\n },\n );\n this.requestResync(channel);\n return null;\n }\n }\n\n // Decode base64 delta\n deltaBytes = base64ToBytes(delta);\n\n // Apply delta based on algorithm\n let reconstructedMessage: string;\n try {\n if (algorithm === 'fossil') {\n reconstructedMessage = FossilDeltaDecoder.apply(\n baseMessage,\n deltaBytes,\n );\n } else if (algorithm === 'xdelta3') {\n reconstructedMessage = Xdelta3Decoder.apply(baseMessage, deltaBytes);\n } else {\n throw Error(`Unknown algorithm: ${algorithm}`);\n }\n } catch (decodeError) {\n throw decodeError;\n }\n\n // Update conflation cache with reconstructed message\n if (channelState.conflationKey) {\n channelState.updateConflationCache(\n conflationKey,\n reconstructedMessage,\n sequence,\n );\n } else {\n // Update base for non-conflation channels\n channelState.setBase(reconstructedMessage, sequence);\n }\n\n // Update state\n channelState.updateSequence(sequence);\n channelState.recordDelta();\n\n // Update stats\n this.stats.totalMessages++;\n this.stats.deltaMessages++;\n this.stats.totalBytesWithCompression += deltaBytes.length;\n this.stats.totalBytesWithoutCompression += reconstructedMessage.length;\n this.updateStats();\n\n this.log('Delta applied successfully', {\n channel,\n event,\n conflationKey,\n originalSize: reconstructedMessage.length,\n deltaSize: deltaBytes.length,\n compressionRatio:\n ((deltaBytes.length / reconstructedMessage.length) * 100).toFixed(1) +\n '%',\n });\n\n // Parse and return the reconstructed event\n try {\n const parsedMessage = JSON.parse(reconstructedMessage);\n let data = parsedMessage.data || parsedMessage;\n // Try to parse data if it's a string (Pusher protocol double-encodes data)\n // This matches the behavior in protocol.ts decodeMessage\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) {\n // Keep as string if not valid JSON\n }\n }\n return {\n event: event,\n channel: channel,\n data: data,\n };\n } catch (e) {\n // If not JSON, return as-is\n return {\n event: event,\n channel: channel,\n data: reconstructedMessage,\n };\n }\n } catch (error) {\n this.error('Delta decode failed', {\n channel,\n event: deltaData.event,\n sequence: deltaData.seq,\n algorithm: deltaData.algorithm,\n conflationKey: deltaData.conflation_key,\n baseIndex: deltaData.base_index,\n deltaSize: deltaData.delta?.length,\n decodedDeltaBytes: deltaBytes ? deltaBytes.length : 'n/a',\n message: (error as Error).message,\n });\n this.stats.errors++;\n return null;\n }\n }\n\n /**\n * Handle regular (full) message with delta sequence markers\n */\n handleFullMessage(\n channel: string,\n rawMessage: string,\n sequence?: number,\n conflationKey?: string,\n ): void {\n if (!sequence && sequence !== 0) {\n // Attempt to extract __delta_seq from payload when not provided separately\n try {\n const parsed = JSON.parse(rawMessage);\n const candidate =\n typeof parsed.data === 'string'\n ? (JSON.parse(parsed.data).__delta_seq ?? parsed.__delta_seq)\n : (parsed.data?.__delta_seq ?? parsed.__delta_seq);\n if (candidate === 0 || candidate) {\n sequence = candidate;\n } else {\n this.log('handleFullMessage missing sequence, skipping', {\n channel,\n hasSequence: false,\n });\n return;\n }\n } catch (e) {\n this.log('handleFullMessage missing sequence and parse failed', {\n channel,\n hasSequence: false,\n });\n return;\n }\n }\n\n const messageSize = rawMessage.length;\n\n let channelState = this.channelStates.get(channel);\n if (!channelState) {\n channelState = new ChannelState(channel);\n this.channelStates.set(channel, channelState);\n }\n\n // The rawMessage is already stripped of __delta_seq and __conflation_key by pusher.ts\n // We use it directly as the base - NO re-parsing/re-stringifying to preserve exact bytes\n // (JSON.parse/stringify can change float representations which breaks delta checksums)\n\n // Use the provided conflationKey parameter (already extracted by pusher.ts from original message)\n const finalConflationKey = conflationKey;\n\n // Initialize conflation if we have a conflation key\n if (finalConflationKey !== undefined && !channelState.conflationKey) {\n channelState.conflationKey = 'enabled';\n }\n\n if (channelState.conflationKey && finalConflationKey !== undefined) {\n channelState.updateConflationCache(\n finalConflationKey,\n rawMessage, // Store raw message directly\n sequence,\n );\n this.log('Stored full message (conflation)', {\n channel,\n conflationKey: finalConflationKey,\n sequence,\n size: messageSize,\n });\n } else {\n channelState.setBase(rawMessage, sequence); // Store raw message directly\n this.log('Stored full message', {\n channel,\n sequence,\n size: messageSize,\n });\n }\n\n channelState.recordFullMessage();\n\n // Update stats\n this.stats.totalMessages++;\n this.stats.fullMessages++;\n this.stats.totalBytesWithoutCompression += messageSize;\n this.stats.totalBytesWithCompression += messageSize;\n this.updateStats();\n }\n\n /**\n * Request resync for a channel\n */\n private requestResync(channel: string): void {\n this.log('Requesting resync for channel', channel);\n this.sendEventCallback('pusher:delta_sync_error', { channel });\n this.channelStates.delete(channel);\n }\n\n /**\n * Update and emit stats\n */\n private updateStats(): void {\n if (this.options.onStats) {\n this.options.onStats(this.getStats());\n }\n }\n\n /**\n * Get current statistics\n */\n getStats(): DeltaStats {\n const bandwidthSaved =\n this.stats.totalBytesWithoutCompression -\n this.stats.totalBytesWithCompression;\n const bandwidthSavedPercent =\n this.stats.totalBytesWithoutCompression > 0\n ? (bandwidthSaved / this.stats.totalBytesWithoutCompression) * 100\n : 0;\n\n const channelStats = Array.from(this.channelStates.values()).map((state) =>\n state.getStats(),\n );\n\n return {\n ...this.stats,\n bandwidthSaved,\n bandwidthSavedPercent,\n channelCount: this.channelStates.size,\n channels: channelStats,\n };\n }\n\n /**\n * Reset statistics\n */\n resetStats(): void {\n this.stats = {\n totalMessages: 0,\n deltaMessages: 0,\n fullMessages: 0,\n totalBytesWithoutCompression: 0,\n totalBytesWithCompression: 0,\n errors: 0,\n };\n this.updateStats();\n }\n\n /**\n * Clear channel state\n */\n clearChannelState(channel?: string): void {\n if (channel) {\n this.channelStates.delete(channel);\n } else {\n this.channelStates.clear();\n }\n }\n\n /**\n * Check if delta compression is enabled\n */\n isEnabled(): boolean {\n return this.enabled;\n }\n\n /**\n * Get available algorithms\n */\n getAvailableAlgorithms(): DeltaAlgorithm[] {\n return this.availableAlgorithms;\n }\n\n /**\n * Log message (if debug enabled)\n */\n private log(...args: any[]): void {\n if (this.options.debug) {\n Logger.debug('[DeltaCompression]', ...args);\n }\n }\n\n /**\n * Log error\n */\n private error(...args: any[]): void {\n Logger.error('[DeltaCompression]', ...args);\n if (this.options.onError) {\n this.options.onError(args);\n }\n }\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, { setLoggerConfig } from './logger';\nimport Factory from './utils/factory';\nimport UrlStore from 'core/utils/url_store';\nimport { Options, validateOptions } from './options';\nimport { Config, getConfig } from './config';\nimport StrategyOptions from './strategies/strategy_options';\nimport UserFacade from './user';\nimport DeltaCompressionManager from './delta/manager';\nimport { DeltaStats } from './delta/types';\nimport { Filter, validateFilter, FilterExamples } from './channels/filter';\nimport type { FilterNode } from './channels/filter';\n\n// Re-export filter types and utilities for easy access\nexport { Filter, validateFilter, FilterExamples };\nexport type { FilterNode };\n\nexport default class Pusher {\n /* STATIC PROPERTIES */\n static instances: Pusher[] = [];\n static isReady: boolean = false;\n\n private static _logToConsole: boolean = false;\n private static _log: ((message: any) => void) | undefined;\n\n static get logToConsole(): boolean {\n return this._logToConsole;\n }\n\n static set logToConsole(value: boolean) {\n this._logToConsole = value;\n setLoggerConfig({ logToConsole: value, log: this._log });\n }\n\n static get log(): ((message: any) => void) | undefined {\n return this._log;\n }\n\n static set log(fn: ((message: any) => void) | undefined) {\n this._log = fn;\n setLoggerConfig({ logToConsole: this._logToConsole, log: fn });\n }\n\n // for jsonp\n static Runtime: AbstractRuntime = Runtime;\n static ScriptReceivers: any = (<any>Runtime).ScriptReceivers;\n static DependenciesReceivers: any = (<any>Runtime).DependenciesReceivers;\n static auth_callbacks: any = (<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 private static getClientFeatures(): string[] {\n return Collections.keys(\n Collections.filterObject({ ws: Runtime.Transports.ws }, function (t) {\n return t.isSupported({});\n }),\n );\n }\n\n /* INSTANCE PROPERTIES */\n key: string;\n config: Config;\n channels: Channels;\n global_emitter: EventsDispatcher;\n sessionID: number;\n timeline: Timeline;\n timelineSender: TimelineSender;\n connection: ConnectionManager;\n timelineSenderTimer: PeriodicTimer;\n user: UserFacade;\n deltaCompression: DeltaCompressionManager;\n constructor(app_key: string, options: Options) {\n checkAppKey(app_key);\n validateOptions(options);\n this.key = app_key;\n this.config = getConfig(options, this);\n\n this.channels = Factory.createChannels();\n this.global_emitter = new EventsDispatcher();\n this.sessionID = Runtime.randomInt(1000000000);\n\n this.timeline = new Timeline(this.key, this.sessionID, {\n cluster: this.config.cluster,\n features: Pusher.getClientFeatures(),\n params: this.config.timelineParams || {},\n limit: 50,\n level: TimelineLevel.INFO,\n version: Defaults.VERSION,\n });\n if (this.config.enableStats) {\n this.timelineSender = Factory.createTimelineSender(this.timeline, {\n host: this.config.statsHost,\n path: '/timeline/v2/' + Runtime.TimelineTransport.name,\n });\n }\n\n var getStrategy = (options: StrategyOptions) => {\n return Runtime.getDefaultStrategy(this.config, options, defineTransport);\n };\n\n this.connection = Factory.createConnectionManager(this.key, {\n getStrategy: getStrategy,\n timeline: this.timeline,\n activityTimeout: this.config.activityTimeout,\n pongTimeout: this.config.pongTimeout,\n unavailableTimeout: this.config.unavailableTimeout,\n useTLS: Boolean(this.config.useTLS),\n });\n\n // Initialize delta compression manager if configured\n // Note: We always create the manager if deltaCompression option is present,\n // but only enable it automatically if enabled: true\n if (options.deltaCompression !== undefined) {\n this.deltaCompression = new DeltaCompressionManager(\n options.deltaCompression || {},\n (event: string, data: any) => this.send_event(event, data),\n );\n }\n\n this.connection.bind('connected', () => {\n this.subscribeAll();\n if (this.timelineSender) {\n this.timelineSender.send(this.connection.isUsingTLS());\n }\n // Enable delta compression after connection only if explicitly enabled\n if (this.deltaCompression && options.deltaCompression?.enabled === true) {\n this.deltaCompression.enable();\n }\n });\n\n this.connection.bind('message', (event) => {\n var eventName = event.event;\n var internal = eventName.indexOf('pusher_internal:') === 0;\n\n // Handle delta compression protocol events\n if (this.deltaCompression) {\n if (eventName === 'pusher:delta_compression_enabled') {\n this.deltaCompression.handleEnabled(event.data);\n // Don't return - let it emit to global listeners\n } else if (eventName === 'pusher:delta_cache_sync' && event.channel) {\n this.deltaCompression.handleCacheSync(event.channel, event.data);\n return;\n } else if (eventName === 'pusher:delta' && event.channel) {\n // Check if channel still exists before processing delta\n // This prevents errors from in-flight delta messages after unsubscribe\n var channel = this.channel(event.channel);\n if (!channel) {\n // Channel was unsubscribed, silently ignore delta message\n return;\n }\n\n // Decode delta and emit reconstructed event\n const reconstructedEvent = this.deltaCompression.handleDeltaMessage(\n event.channel,\n event.data,\n );\n if (reconstructedEvent) {\n // Route to channel\n if (channel) {\n channel.handleEvent(reconstructedEvent);\n }\n // Emit globally\n this.global_emitter.emit(\n reconstructedEvent.event,\n reconstructedEvent.data,\n );\n }\n return;\n }\n }\n\n if (event.channel) {\n var channel = this.channel(event.channel);\n if (channel) {\n channel.handleEvent(event);\n }\n\n // Store full messages for delta compression\n if (\n this.deltaCompression &&\n event.event &&\n !event.event.startsWith('pusher:') &&\n !event.event.startsWith('pusher_internal:')\n ) {\n // Extract sequence number from message level (not from data)\n let sequence: number | undefined;\n if (typeof (event as any).sequence === 'number') {\n sequence = (event as any).sequence;\n }\n\n // Extract conflation_key before we delete it\n let conflationKey: string | undefined;\n if (typeof (event as any).conflation_key === 'string') {\n conflationKey = (event as any).conflation_key;\n }\n\n // Use RAW message and strip metadata fields using REGEX\n // This preserves exact byte representation (including float precision)\n // We MUST NOT use JSON.parse/stringify as it can change float representations\n let fullMessage = event.rawMessage || '';\n\n if (fullMessage && sequence !== undefined) {\n // Strip metadata fields using regex to preserve exact bytes\n // Pattern matches: ,\"__delta_seq\":NUMBER or \"__delta_seq\":NUMBER, at start\n fullMessage = fullMessage.replace(/,\"__delta_seq\":\\d+/g, '');\n fullMessage = fullMessage.replace(/\"__delta_seq\":\\d+,/g, '');\n // Pattern matches: ,\"__conflation_key\":\"...\" or \"__conflation_key\":\"...\", at start\n fullMessage = fullMessage.replace(\n /,\"__conflation_key\":\"[^\"]*\"/g,\n '',\n );\n fullMessage = fullMessage.replace(\n /\"__conflation_key\":\"[^\"]*\",/g,\n '',\n );\n }\n\n this.deltaCompression.handleFullMessage(\n event.channel,\n fullMessage,\n sequence,\n conflationKey,\n );\n }\n }\n // Emit globally [deprecated]\n if (!internal) {\n this.global_emitter.emit(event.event, event.data);\n }\n });\n this.connection.bind('connecting', () => {\n this.channels.disconnect();\n });\n this.connection.bind('disconnected', () => {\n this.channels.disconnect();\n });\n this.connection.bind('error', (err) => {\n Logger.warn(err);\n });\n\n Pusher.instances.push(this);\n this.timeline.info({ instances: Pusher.instances.length });\n\n this.user = new UserFacade(this);\n\n if (Pusher.isReady) {\n this.connect();\n }\n }\n\n channel(name: string): Channel {\n return this.channels.find(name);\n }\n\n allChannels(): Channel[] {\n return this.channels.all();\n }\n\n connect() {\n this.connection.connect();\n\n if (this.timelineSender) {\n if (!this.timelineSenderTimer) {\n var usingTLS = this.connection.isUsingTLS();\n var timelineSender = this.timelineSender;\n this.timelineSenderTimer = new PeriodicTimer(60000, function () {\n timelineSender.send(usingTLS);\n });\n }\n }\n }\n\n disconnect() {\n this.connection.disconnect();\n\n if (this.timelineSenderTimer) {\n this.timelineSenderTimer.ensureAborted();\n this.timelineSenderTimer = null;\n }\n }\n\n bind(event_name: string, callback: Function, context?: any): Pusher {\n this.global_emitter.bind(event_name, callback, context);\n return this;\n }\n\n unbind(event_name?: string, callback?: Function, context?: any): Pusher {\n this.global_emitter.unbind(event_name, callback, context);\n return this;\n }\n\n bind_global(callback: Function): Pusher {\n this.global_emitter.bind_global(callback);\n return this;\n }\n\n unbind_global(callback?: Function): Pusher {\n this.global_emitter.unbind_global(callback);\n return this;\n }\n\n unbind_all(callback?: Function): Pusher {\n this.global_emitter.unbind_all();\n return this;\n }\n\n subscribeAll() {\n var channelName;\n for (channelName in this.channels.channels) {\n if (this.channels.channels.hasOwnProperty(channelName)) {\n this.subscribe(channelName);\n }\n }\n }\n\n subscribe(channel_name: string, tagsFilter?: any) {\n var channel = this.channels.add(channel_name, this);\n\n // Set tags filter if provided\n if (tagsFilter) {\n channel.tagsFilter = tagsFilter;\n }\n\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 // Clear delta compression state for this channel to prevent stale base messages\n // on resubscribe. The server also clears its state, so both sides start fresh.\n if (this.deltaCompression) {\n this.deltaCompression.clearChannelState(channel_name);\n }\n }\n\n send_event(event_name: string, data: any, channel?: string) {\n return this.connection.send_event(event_name, data, channel);\n }\n\n shouldUseTLS(): boolean {\n return this.config.useTLS;\n }\n\n signin() {\n this.user.signin();\n }\n\n /**\n * Get delta compression statistics\n * @returns {DeltaStats} Statistics about delta compression bandwidth savings\n */\n getDeltaStats(): DeltaStats | null {\n if (!this.deltaCompression) {\n return null;\n }\n return this.deltaCompression.getStats();\n }\n\n /**\n * Reset delta compression statistics\n */\n resetDeltaStats(): void {\n if (this.deltaCompression) {\n this.deltaCompression.resetStats();\n }\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"],"names":["prefix","AuthRequestType","UrlStore","keys","values","base64encode","jsonp","Logger","document","Collections.buildQueryString","Browser","Collections.keys","Collections.apply","Collections.filter","EventsDispatcher","hooks","Collections.extend","URLSchemes.ws","URLSchemes.http","Transports","URLSchemes.sockjs","Collections.objectApply","Errors.BadEventName","encode","decode","this","d","b","Coder","URLSafeCoder","nacl","decodeBase64","Errors.UnsupportedFeature","encodeUTF8","Network","Timer","Collections.values","urlStore","Errors.BadChannelName","Collections.any","Collections.map","Collections.all","Collections.safeJSONStringify","config","defineTransport","Errors.RequestTimedOut","State","streamingHooks","pollingHooks","xhrHooks","xdrHooks","HTTPFactory","jsonpTimeline","jsonpAuth","random","TimelineLevel","Level","Errors.UnsupportedStrategy","Errors.TransportPriorityTooLow","Errors.TransportClosed","Errors.UnsupportedTransport","Collections.arrayIndexOf","UnsupportedStrategy","composeChannelQuery","delta","errors","CustomError","deserializeInteger","instructions","window","TypedArray.TypedArrayList","deserializeDelta","base64","fossilApplyDelta","vcdiffDecode","Collections.filterObject","options"],"mappings":"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","x_google_ignoreList":[35,36,73,74,75,76,77,78,79,80,81,82,83]}