hyper-resource 1.0.0.lap34

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.
@@ -0,0 +1,63 @@
1
+ class Hyperloop::Resource::MethodsController < ApplicationController
2
+ include Hyperloop::Resource::SecurityGuards
3
+
4
+ def index
5
+ # used for introspection
6
+ record_class = guarded_record_class_from_param(record_class_param)
7
+ if record_class
8
+ @methods = record_class.rest_methods
9
+ @record_name = record_class.to_s.underscore.to_sym
10
+ end
11
+ respond_to { |format| format.json { render(json: {}, status: :unprocessable_entity) if record_class.nil? }}
12
+ end
13
+
14
+ def show
15
+ @record, id = guarded_record_from_params(params)
16
+ method_name = params[:id].to_sym
17
+ result = { error: 'A error occured, wrong method?' }
18
+ error = true
19
+ if @record.class.rest_methods.has_key?(method_name)
20
+ begin
21
+ result = @record.send(method_name)
22
+ error = false
23
+ rescue Exception => e
24
+ Rails.logger.debug e.message
25
+ result = { error: e.message }
26
+ error = true
27
+ end
28
+ end
29
+ respond_to do |format|
30
+ format.json do
31
+ render(json: { result: result }, status: (error ? :unprocessable_entity : 200))
32
+ end
33
+ end
34
+ end
35
+
36
+ def update
37
+ @record, id = guarded_record_from_params(params)
38
+ method_name = params[:id].to_sym
39
+ result = { error: 'A error occured, wrong method?' }
40
+ error = true
41
+ if @record.class.rest_methods.has_key?(method_name)
42
+ begin
43
+ result = @record.send(method_name, params[:params])
44
+ error = false
45
+ rescue Exception => e
46
+ Rails.logger.debug e.message
47
+ result = { error: e.message }
48
+ error = true
49
+ end
50
+ end
51
+ respond_to do |format|
52
+ format.json do
53
+ render(json: { result: result }, status: (error ? :unprocessable_entity : 200))
54
+ end
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def record_class_param
61
+ params.require(:record_class)
62
+ end
63
+ end
@@ -0,0 +1,21 @@
1
+ class Hyperloop::Resource::PropertiesController < ApplicationController
2
+ include Hyperloop::Resource::SecurityGuards
3
+
4
+ def index
5
+ # introspect available class scopes
6
+ record_class = guarded_record_class_from_param(record_class_param)
7
+ if record_class
8
+ @properties = record_class.declared_properties.registered_properties.transform_values do |property_hash|
9
+ { type: property_hash[:type] }
10
+ end
11
+ @record_name = record_class.to_s.underscore.to_sym
12
+ end
13
+ respond_to { |format| format.json { render(json: {}, status: :unprocessable_entity) if record_class.nil? }}
14
+ end
15
+
16
+ private
17
+
18
+ def record_class_param
19
+ params.require(:record_class)
20
+ end
21
+ end
@@ -0,0 +1,123 @@
1
+ class Hyperloop::Resource::RelationsController < ApplicationController
2
+
3
+ def index
4
+ # introspect available relations
5
+ record_class = guarded_record_class_from_param(record_class_param)
6
+ if record_class
7
+ @collections = record_class.reflections.transform_values { |collection| {
8
+ type: collection.type,
9
+ association: collection.association.type,
10
+ direction: collection.association.direction
11
+ }}
12
+ @record_name = record_class.to_s.underscore.to_sym
13
+ end
14
+ respond_to { |format| format.json { render(status: :unprocessable_entity) if record_class.nil? }}
15
+ end
16
+
17
+ def create
18
+ @record, left_id = guarded_record_from_params(params)
19
+ @right_record = nil
20
+ @collection_name = params[:id].to_sym
21
+ @collection = nil
22
+ if @record && @record.class.reflections.has_key?(@collection_name) # guard, :id is the collection name
23
+ right_class_param = if @record.class.reflections[@collection_name].association.type == :has_many
24
+ params[:id].chop # remove the s at the end if its there
25
+ else
26
+ params[:id]
27
+ end
28
+ right_model = guarded_record_class_from_param(right_class_param)
29
+ @right_record = if collection_params(right_model)[:id]
30
+ right_model.find(collection_params(right_model)[:id])
31
+ else
32
+ right_model.create(collection_params(right_model))
33
+ end
34
+ if @right_record
35
+ if @record.class.reflections[@collection_name].association.type == :has_one
36
+ @record.send("#{@collection_name}=", @right_record)
37
+ else
38
+ @collection = @record.send(@collection_name) # send is guarded above
39
+ @collection << @right_record
40
+ end
41
+ end
42
+ end
43
+ respond_to do |format|
44
+ if @record && @right_record
45
+ @right_record.touch
46
+ @record.touch
47
+ hyper_pub_sub_collection(@collection, @record, @collection_name, @right_record)
48
+ hyper_pub_sub_item(@right_record)
49
+ hyper_pub_sub_item(@record)
50
+ format.json { render status: :created }
51
+ else
52
+ format.json { render json: @right_record ? @right_record.errors : {}, status: :unprocessable_entity }
53
+ end
54
+ end
55
+ end
56
+
57
+ def show
58
+ @record, @id = guarded_record_from_params(params)
59
+ # collection result may be nil, so we need have_collection to make sure the collection is valid
60
+ @collection = nil
61
+ have_collection = false
62
+ @collection_name = params[:id].to_sym
63
+ if @record
64
+ # guard, :id is the collection name
65
+ have_collection = @record.class.reflections.has_key?(@collection_name) # for neo4j, key is a symbol
66
+ have_collection = @record.class.reflections.has_key?(params[:id]) unless have_collection # for AR, key is a string
67
+ @collection = @record.send(@collection_name) if have_collection
68
+ end
69
+ respond_to do |format|
70
+ if @record && have_collection
71
+ hyper_sub_collection(@collection, @record, @collection_name)
72
+ hyper_sub_item(@record)
73
+ format.json
74
+ else
75
+ format.json { render json: {}, status: :unprocessable_entity }
76
+ end
77
+ end
78
+ end
79
+
80
+ def destroy
81
+ @record, left_id = guarded_record_from_params(params)
82
+ @right_record = nil
83
+ @collection_name = params[:id].to_sym
84
+ @collection = nil
85
+ if @record && @record.class.reflections.has_key?(@collection_name) # guard, :id is the collection name
86
+ right_class_param = params[:id].chop # remove the s at the end
87
+ right_model = guarded_record_class_from_param(right_class_param)
88
+ @right_record = right_model.find(params[:record_id])
89
+
90
+ if @right_record
91
+ @collection = @record.send(@collection_name) # send is guarded above
92
+ @collection.delete(@right_record)
93
+ end
94
+ end
95
+ respond_to do |format|
96
+ if @record && @collection
97
+ @right_record.touch
98
+ @record.touch
99
+ hyper_pub_sub_collection(@collection, @record, @collection_name, @right_record)
100
+ hyper_pub_sub_item(@right_record)
101
+ hyper_pub_sub_item(@record)
102
+ format.json { render json: { status: :success } }
103
+ else
104
+ format.json { render json: {}, status: :unprocessable_entity }
105
+ end
106
+ end
107
+ end
108
+
109
+ private
110
+
111
+ def record_class_param
112
+ params.require(:record_class)
113
+ end
114
+
115
+ def collection_params(record_class)
116
+ permitted_keys = record_class.declared_properties.registered_properties.keys
117
+ %i[created_at updated_at color fixed font scaling shadow].each do |key|
118
+ permitted_keys.delete(key)
119
+ end
120
+ permitted_keys.concat([:id, color: {}, fixed: {}, font: {}, scaling: {}, shadow: {}])
121
+ params.require(:data).permit(permitted_keys)
122
+ end
123
+ end
@@ -0,0 +1,37 @@
1
+ class Hyperloop::Resource::ScopesController < ApplicationController
2
+ # introspect available class scopes, like Plan.all or Plan.resolved
3
+ def index
4
+ record_class = guarded_record_class_from_param(record_class_param)
5
+
6
+ # TODO security, authorize record_class
7
+ if record_class
8
+ @scopes = record_class.scopes.transform_values { |method| {params: method.arity} }
9
+ @record_name = record_class.to_s.underscore.to_sym
10
+ end
11
+ respond_to { |format| format.json { render(json: {}, status: :unprocessable_entity) if record_class.nil? }}
12
+ end
13
+
14
+ def show
15
+ mc_param = record_class_param
16
+ mc_param = mc_param.chop if mc_param.end_with?('s')
17
+ @record_class = guarded_record_class_from_param(mc_param)
18
+ @scope_name = params[:id].to_sym # :id is the scope name
19
+ @collection = nil
20
+ if @record_class && @record_class.scopes.has_key?(@scope_name) # guard
21
+ @collection = @record_class.send(@scope_name)
22
+ end
23
+ respond_to do |format|
24
+ if @record_class && @collection
25
+ format.json
26
+ else
27
+ format.json { render json: {}, status: :unprocessable_entity }
28
+ end
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def record_class_param
35
+ params.require(:record_class)
36
+ end
37
+ end
@@ -0,0 +1,37 @@
1
+ module Hyperloop
2
+ module Resource
3
+ class SecurityError < StandardError
4
+ end
5
+
6
+ module SecurityGuards
7
+ def self.included(base)
8
+ base.extend(Hyperloop::Resource::SecurityGuards::ClassMethods)
9
+ end
10
+
11
+ module ClassMethods
12
+ def valid_record_class_params
13
+ @valid_record_class_params = Hyperloop.valid_record_class_params.freeze
14
+ end
15
+
16
+ def valid_record_id_params
17
+ @valid_record_id_params ||= Hyperloop.valid_record_class_params.map { |m| m + '_id' }.freeze
18
+ end
19
+ end
20
+
21
+ def guarded_record_from_params(params)
22
+ self.class.valid_record_id_params.each do |record_id|
23
+ if params.has_key?(record_id)
24
+ record_class = record_id[0..-3].camelize.constantize
25
+ return [record_class.find(params[record_id]), params[record_id]]
26
+ end
27
+ end
28
+ raise Hyperloop::Resource::SecurityError
29
+ end
30
+
31
+ def guarded_record_class_from_param(record_class_param)
32
+ raise Hyperloop::Resource::SecurityError unless self.class.valid_record_class_params.include?(record_class_param) # guard
33
+ record_class_param.camelize.constantize
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ module Hyperloop
2
+ module Resource
3
+ VERSION = '1.0.0.lap34'
4
+ end
5
+ end
@@ -0,0 +1,4183 @@
1
+ /*!
2
+ * Pusher JavaScript Library v4.2.2
3
+ * https://pusher.com/
4
+ *
5
+ * Copyright 2017, Pusher
6
+ * Released under the MIT licence.
7
+ */
8
+
9
+ (function webpackUniversalModuleDefinition(root, factory) {
10
+ if(typeof exports === 'object' && typeof module === 'object')
11
+ module.exports = factory();
12
+ else if(typeof define === 'function' && define.amd)
13
+ define([], factory);
14
+ else if(typeof exports === 'object')
15
+ exports["Pusher"] = factory();
16
+ else
17
+ root["Pusher"] = factory();
18
+ })(this, function() {
19
+ return /******/ (function(modules) { // webpackBootstrap
20
+ /******/ // The module cache
21
+ /******/ var installedModules = {};
22
+
23
+ /******/ // The require function
24
+ /******/ function __webpack_require__(moduleId) {
25
+
26
+ /******/ // Check if module is in cache
27
+ /******/ if(installedModules[moduleId])
28
+ /******/ return installedModules[moduleId].exports;
29
+
30
+ /******/ // Create a new module (and put it into the cache)
31
+ /******/ var module = installedModules[moduleId] = {
32
+ /******/ exports: {},
33
+ /******/ id: moduleId,
34
+ /******/ loaded: false
35
+ /******/ };
36
+
37
+ /******/ // Execute the module function
38
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
39
+
40
+ /******/ // Flag the module as loaded
41
+ /******/ module.loaded = true;
42
+
43
+ /******/ // Return the exports of the module
44
+ /******/ return module.exports;
45
+ /******/ }
46
+
47
+
48
+ /******/ // expose the modules object (__webpack_modules__)
49
+ /******/ __webpack_require__.m = modules;
50
+
51
+ /******/ // expose the module cache
52
+ /******/ __webpack_require__.c = installedModules;
53
+
54
+ /******/ // __webpack_public_path__
55
+ /******/ __webpack_require__.p = "";
56
+
57
+ /******/ // Load entry module and return exports
58
+ /******/ return __webpack_require__(0);
59
+ /******/ })
60
+ /************************************************************************/
61
+ /******/ ([
62
+ /* 0 */
63
+ /***/ (function(module, exports, __webpack_require__) {
64
+
65
+ "use strict";
66
+ var pusher_1 = __webpack_require__(1);
67
+ module.exports = pusher_1["default"];
68
+
69
+
70
+ /***/ }),
71
+ /* 1 */
72
+ /***/ (function(module, exports, __webpack_require__) {
73
+
74
+ "use strict";
75
+ var runtime_1 = __webpack_require__(2);
76
+ var Collections = __webpack_require__(9);
77
+ var dispatcher_1 = __webpack_require__(24);
78
+ var timeline_1 = __webpack_require__(39);
79
+ var level_1 = __webpack_require__(40);
80
+ var StrategyBuilder = __webpack_require__(41);
81
+ var timers_1 = __webpack_require__(12);
82
+ var defaults_1 = __webpack_require__(5);
83
+ var DefaultConfig = __webpack_require__(63);
84
+ var logger_1 = __webpack_require__(8);
85
+ var factory_1 = __webpack_require__(43);
86
+ var url_store_1 = __webpack_require__(14);
87
+ var Pusher = (function () {
88
+ function Pusher(app_key, options) {
89
+ var _this = this;
90
+ checkAppKey(app_key);
91
+ options = options || {};
92
+ if (!options.cluster && !(options.wsHost || options.httpHost)) {
93
+ var suffix = url_store_1["default"].buildLogSuffix("javascriptQuickStart");
94
+ logger_1["default"].warn("You should always specify a cluster when connecting. " + suffix);
95
+ }
96
+ this.key = app_key;
97
+ this.config = Collections.extend(DefaultConfig.getGlobalConfig(), options.cluster ? DefaultConfig.getClusterConfig(options.cluster) : {}, options);
98
+ this.channels = factory_1["default"].createChannels();
99
+ this.global_emitter = new dispatcher_1["default"]();
100
+ this.sessionID = Math.floor(Math.random() * 1000000000);
101
+ this.timeline = new timeline_1["default"](this.key, this.sessionID, {
102
+ cluster: this.config.cluster,
103
+ features: Pusher.getClientFeatures(),
104
+ params: this.config.timelineParams || {},
105
+ limit: 50,
106
+ level: level_1["default"].INFO,
107
+ version: defaults_1["default"].VERSION
108
+ });
109
+ if (!this.config.disableStats) {
110
+ this.timelineSender = factory_1["default"].createTimelineSender(this.timeline, {
111
+ host: this.config.statsHost,
112
+ path: "/timeline/v2/" + runtime_1["default"].TimelineTransport.name
113
+ });
114
+ }
115
+ var getStrategy = function (options) {
116
+ var config = Collections.extend({}, _this.config, options);
117
+ return StrategyBuilder.build(runtime_1["default"].getDefaultStrategy(config), config);
118
+ };
119
+ this.connection = factory_1["default"].createConnectionManager(this.key, Collections.extend({ getStrategy: getStrategy,
120
+ timeline: this.timeline,
121
+ activityTimeout: this.config.activity_timeout,
122
+ pongTimeout: this.config.pong_timeout,
123
+ unavailableTimeout: this.config.unavailable_timeout
124
+ }, this.config, { encrypted: this.isEncrypted() }));
125
+ this.connection.bind('connected', function () {
126
+ _this.subscribeAll();
127
+ if (_this.timelineSender) {
128
+ _this.timelineSender.send(_this.connection.isEncrypted());
129
+ }
130
+ });
131
+ this.connection.bind('message', function (params) {
132
+ var internal = (params.event.indexOf('pusher_internal:') === 0);
133
+ if (params.channel) {
134
+ var channel = _this.channel(params.channel);
135
+ if (channel) {
136
+ channel.handleEvent(params.event, params.data);
137
+ }
138
+ }
139
+ if (!internal) {
140
+ _this.global_emitter.emit(params.event, params.data);
141
+ }
142
+ });
143
+ this.connection.bind('connecting', function () {
144
+ _this.channels.disconnect();
145
+ });
146
+ this.connection.bind('disconnected', function () {
147
+ _this.channels.disconnect();
148
+ });
149
+ this.connection.bind('error', function (err) {
150
+ logger_1["default"].warn('Error', err);
151
+ });
152
+ Pusher.instances.push(this);
153
+ this.timeline.info({ instances: Pusher.instances.length });
154
+ if (Pusher.isReady) {
155
+ this.connect();
156
+ }
157
+ }
158
+ Pusher.ready = function () {
159
+ Pusher.isReady = true;
160
+ for (var i = 0, l = Pusher.instances.length; i < l; i++) {
161
+ Pusher.instances[i].connect();
162
+ }
163
+ };
164
+ Pusher.log = function (message) {
165
+ if (Pusher.logToConsole && (window).console && (window).console.log) {
166
+ (window).console.log(message);
167
+ }
168
+ };
169
+ Pusher.getClientFeatures = function () {
170
+ return Collections.keys(Collections.filterObject({ "ws": runtime_1["default"].Transports.ws }, function (t) { return t.isSupported({}); }));
171
+ };
172
+ Pusher.prototype.channel = function (name) {
173
+ return this.channels.find(name);
174
+ };
175
+ Pusher.prototype.allChannels = function () {
176
+ return this.channels.all();
177
+ };
178
+ Pusher.prototype.connect = function () {
179
+ this.connection.connect();
180
+ if (this.timelineSender) {
181
+ if (!this.timelineSenderTimer) {
182
+ var encrypted = this.connection.isEncrypted();
183
+ var timelineSender = this.timelineSender;
184
+ this.timelineSenderTimer = new timers_1.PeriodicTimer(60000, function () {
185
+ timelineSender.send(encrypted);
186
+ });
187
+ }
188
+ }
189
+ };
190
+ Pusher.prototype.disconnect = function () {
191
+ this.connection.disconnect();
192
+ if (this.timelineSenderTimer) {
193
+ this.timelineSenderTimer.ensureAborted();
194
+ this.timelineSenderTimer = null;
195
+ }
196
+ };
197
+ Pusher.prototype.bind = function (event_name, callback, context) {
198
+ this.global_emitter.bind(event_name, callback, context);
199
+ return this;
200
+ };
201
+ Pusher.prototype.unbind = function (event_name, callback, context) {
202
+ this.global_emitter.unbind(event_name, callback, context);
203
+ return this;
204
+ };
205
+ Pusher.prototype.bind_global = function (callback) {
206
+ this.global_emitter.bind_global(callback);
207
+ return this;
208
+ };
209
+ Pusher.prototype.unbind_global = function (callback) {
210
+ this.global_emitter.unbind_global(callback);
211
+ return this;
212
+ };
213
+ Pusher.prototype.unbind_all = function (callback) {
214
+ this.global_emitter.unbind_all();
215
+ return this;
216
+ };
217
+ Pusher.prototype.subscribeAll = function () {
218
+ var channelName;
219
+ for (channelName in this.channels.channels) {
220
+ if (this.channels.channels.hasOwnProperty(channelName)) {
221
+ this.subscribe(channelName);
222
+ }
223
+ }
224
+ };
225
+ Pusher.prototype.subscribe = function (channel_name) {
226
+ var channel = this.channels.add(channel_name, this);
227
+ if (channel.subscriptionPending && channel.subscriptionCancelled) {
228
+ channel.reinstateSubscription();
229
+ }
230
+ else if (!channel.subscriptionPending && this.connection.state === "connected") {
231
+ channel.subscribe();
232
+ }
233
+ return channel;
234
+ };
235
+ Pusher.prototype.unsubscribe = function (channel_name) {
236
+ var channel = this.channels.find(channel_name);
237
+ if (channel && channel.subscriptionPending) {
238
+ channel.cancelSubscription();
239
+ }
240
+ else {
241
+ channel = this.channels.remove(channel_name);
242
+ if (channel && this.connection.state === "connected") {
243
+ channel.unsubscribe();
244
+ }
245
+ }
246
+ };
247
+ Pusher.prototype.send_event = function (event_name, data, channel) {
248
+ return this.connection.send_event(event_name, data, channel);
249
+ };
250
+ Pusher.prototype.isEncrypted = function () {
251
+ if (runtime_1["default"].getProtocol() === "https:") {
252
+ return true;
253
+ }
254
+ else {
255
+ return Boolean(this.config.encrypted);
256
+ }
257
+ };
258
+ Pusher.instances = [];
259
+ Pusher.isReady = false;
260
+ Pusher.logToConsole = false;
261
+ Pusher.Runtime = runtime_1["default"];
262
+ Pusher.ScriptReceivers = runtime_1["default"].ScriptReceivers;
263
+ Pusher.DependenciesReceivers = runtime_1["default"].DependenciesReceivers;
264
+ Pusher.auth_callbacks = runtime_1["default"].auth_callbacks;
265
+ return Pusher;
266
+ }());
267
+ exports.__esModule = true;
268
+ exports["default"] = Pusher;
269
+ function checkAppKey(key) {
270
+ if (key === null || key === undefined) {
271
+ throw "You must pass your app key when you instantiate Pusher.";
272
+ }
273
+ }
274
+ runtime_1["default"].setup(Pusher);
275
+
276
+
277
+ /***/ }),
278
+ /* 2 */
279
+ /***/ (function(module, exports, __webpack_require__) {
280
+
281
+ "use strict";
282
+ var dependencies_1 = __webpack_require__(3);
283
+ var xhr_auth_1 = __webpack_require__(7);
284
+ var jsonp_auth_1 = __webpack_require__(15);
285
+ var script_request_1 = __webpack_require__(16);
286
+ var jsonp_request_1 = __webpack_require__(17);
287
+ var script_receiver_factory_1 = __webpack_require__(4);
288
+ var jsonp_timeline_1 = __webpack_require__(18);
289
+ var transports_1 = __webpack_require__(19);
290
+ var net_info_1 = __webpack_require__(26);
291
+ var default_strategy_1 = __webpack_require__(27);
292
+ var transport_connection_initializer_1 = __webpack_require__(28);
293
+ var http_1 = __webpack_require__(29);
294
+ var Runtime = {
295
+ nextAuthCallbackID: 1,
296
+ auth_callbacks: {},
297
+ ScriptReceivers: script_receiver_factory_1.ScriptReceivers,
298
+ DependenciesReceivers: dependencies_1.DependenciesReceivers,
299
+ getDefaultStrategy: default_strategy_1["default"],
300
+ Transports: transports_1["default"],
301
+ transportConnectionInitializer: transport_connection_initializer_1["default"],
302
+ HTTPFactory: http_1["default"],
303
+ TimelineTransport: jsonp_timeline_1["default"],
304
+ getXHRAPI: function () {
305
+ return window.XMLHttpRequest;
306
+ },
307
+ getWebSocketAPI: function () {
308
+ return window.WebSocket || window.MozWebSocket;
309
+ },
310
+ setup: function (PusherClass) {
311
+ var _this = this;
312
+ window.Pusher = PusherClass;
313
+ var initializeOnDocumentBody = function () {
314
+ _this.onDocumentBody(PusherClass.ready);
315
+ };
316
+ if (!window.JSON) {
317
+ dependencies_1.Dependencies.load("json2", {}, initializeOnDocumentBody);
318
+ }
319
+ else {
320
+ initializeOnDocumentBody();
321
+ }
322
+ },
323
+ getDocument: function () {
324
+ return document;
325
+ },
326
+ getProtocol: function () {
327
+ return this.getDocument().location.protocol;
328
+ },
329
+ getAuthorizers: function () {
330
+ return { ajax: xhr_auth_1["default"], jsonp: jsonp_auth_1["default"] };
331
+ },
332
+ onDocumentBody: function (callback) {
333
+ var _this = this;
334
+ if (document.body) {
335
+ callback();
336
+ }
337
+ else {
338
+ setTimeout(function () {
339
+ _this.onDocumentBody(callback);
340
+ }, 0);
341
+ }
342
+ },
343
+ createJSONPRequest: function (url, data) {
344
+ return new jsonp_request_1["default"](url, data);
345
+ },
346
+ createScriptRequest: function (src) {
347
+ return new script_request_1["default"](src);
348
+ },
349
+ getLocalStorage: function () {
350
+ try {
351
+ return window.localStorage;
352
+ }
353
+ catch (e) {
354
+ return undefined;
355
+ }
356
+ },
357
+ createXHR: function () {
358
+ if (this.getXHRAPI()) {
359
+ return this.createXMLHttpRequest();
360
+ }
361
+ else {
362
+ return this.createMicrosoftXHR();
363
+ }
364
+ },
365
+ createXMLHttpRequest: function () {
366
+ var Constructor = this.getXHRAPI();
367
+ return new Constructor();
368
+ },
369
+ createMicrosoftXHR: function () {
370
+ return new ActiveXObject("Microsoft.XMLHTTP");
371
+ },
372
+ getNetwork: function () {
373
+ return net_info_1.Network;
374
+ },
375
+ createWebSocket: function (url) {
376
+ var Constructor = this.getWebSocketAPI();
377
+ return new Constructor(url);
378
+ },
379
+ createSocketRequest: function (method, url) {
380
+ if (this.isXHRSupported()) {
381
+ return this.HTTPFactory.createXHR(method, url);
382
+ }
383
+ else if (this.isXDRSupported(url.indexOf("https:") === 0)) {
384
+ return this.HTTPFactory.createXDR(method, url);
385
+ }
386
+ else {
387
+ throw "Cross-origin HTTP requests are not supported";
388
+ }
389
+ },
390
+ isXHRSupported: function () {
391
+ var Constructor = this.getXHRAPI();
392
+ return Boolean(Constructor) && (new Constructor()).withCredentials !== undefined;
393
+ },
394
+ isXDRSupported: function (encrypted) {
395
+ var protocol = encrypted ? "https:" : "http:";
396
+ var documentProtocol = this.getProtocol();
397
+ return Boolean((window['XDomainRequest'])) && documentProtocol === protocol;
398
+ },
399
+ addUnloadListener: function (listener) {
400
+ if (window.addEventListener !== undefined) {
401
+ window.addEventListener("unload", listener, false);
402
+ }
403
+ else if (window.attachEvent !== undefined) {
404
+ window.attachEvent("onunload", listener);
405
+ }
406
+ },
407
+ removeUnloadListener: function (listener) {
408
+ if (window.addEventListener !== undefined) {
409
+ window.removeEventListener("unload", listener, false);
410
+ }
411
+ else if (window.detachEvent !== undefined) {
412
+ window.detachEvent("onunload", listener);
413
+ }
414
+ }
415
+ };
416
+ exports.__esModule = true;
417
+ exports["default"] = Runtime;
418
+
419
+
420
+ /***/ }),
421
+ /* 3 */
422
+ /***/ (function(module, exports, __webpack_require__) {
423
+
424
+ "use strict";
425
+ var script_receiver_factory_1 = __webpack_require__(4);
426
+ var defaults_1 = __webpack_require__(5);
427
+ var dependency_loader_1 = __webpack_require__(6);
428
+ exports.DependenciesReceivers = new script_receiver_factory_1.ScriptReceiverFactory("_pusher_dependencies", "Pusher.DependenciesReceivers");
429
+ exports.Dependencies = new dependency_loader_1["default"]({
430
+ cdn_http: defaults_1["default"].cdn_http,
431
+ cdn_https: defaults_1["default"].cdn_https,
432
+ version: defaults_1["default"].VERSION,
433
+ suffix: defaults_1["default"].dependency_suffix,
434
+ receivers: exports.DependenciesReceivers
435
+ });
436
+
437
+
438
+ /***/ }),
439
+ /* 4 */
440
+ /***/ (function(module, exports) {
441
+
442
+ "use strict";
443
+ var ScriptReceiverFactory = (function () {
444
+ function ScriptReceiverFactory(prefix, name) {
445
+ this.lastId = 0;
446
+ this.prefix = prefix;
447
+ this.name = name;
448
+ }
449
+ ScriptReceiverFactory.prototype.create = function (callback) {
450
+ this.lastId++;
451
+ var number = this.lastId;
452
+ var id = this.prefix + number;
453
+ var name = this.name + "[" + number + "]";
454
+ var called = false;
455
+ var callbackWrapper = function () {
456
+ if (!called) {
457
+ callback.apply(null, arguments);
458
+ called = true;
459
+ }
460
+ };
461
+ this[number] = callbackWrapper;
462
+ return { number: number, id: id, name: name, callback: callbackWrapper };
463
+ };
464
+ ScriptReceiverFactory.prototype.remove = function (receiver) {
465
+ delete this[receiver.number];
466
+ };
467
+ return ScriptReceiverFactory;
468
+ }());
469
+ exports.ScriptReceiverFactory = ScriptReceiverFactory;
470
+ exports.ScriptReceivers = new ScriptReceiverFactory("_pusher_script_", "Pusher.ScriptReceivers");
471
+
472
+
473
+ /***/ }),
474
+ /* 5 */
475
+ /***/ (function(module, exports) {
476
+
477
+ "use strict";
478
+ var Defaults = {
479
+ VERSION: "4.2.2",
480
+ PROTOCOL: 7,
481
+ host: 'ws.pusherapp.com',
482
+ ws_port: 80,
483
+ wss_port: 443,
484
+ ws_path: '',
485
+ sockjs_host: 'sockjs.pusher.com',
486
+ sockjs_http_port: 80,
487
+ sockjs_https_port: 443,
488
+ sockjs_path: "/pusher",
489
+ stats_host: 'stats.pusher.com',
490
+ channel_auth_endpoint: '/pusher/auth',
491
+ channel_auth_transport: 'ajax',
492
+ activity_timeout: 120000,
493
+ pong_timeout: 30000,
494
+ unavailable_timeout: 10000,
495
+ cdn_http: 'http://js.pusher.com',
496
+ cdn_https: 'https://js.pusher.com',
497
+ dependency_suffix: ''
498
+ };
499
+ exports.__esModule = true;
500
+ exports["default"] = Defaults;
501
+
502
+
503
+ /***/ }),
504
+ /* 6 */
505
+ /***/ (function(module, exports, __webpack_require__) {
506
+
507
+ "use strict";
508
+ var script_receiver_factory_1 = __webpack_require__(4);
509
+ var runtime_1 = __webpack_require__(2);
510
+ var DependencyLoader = (function () {
511
+ function DependencyLoader(options) {
512
+ this.options = options;
513
+ this.receivers = options.receivers || script_receiver_factory_1.ScriptReceivers;
514
+ this.loading = {};
515
+ }
516
+ DependencyLoader.prototype.load = function (name, options, callback) {
517
+ var self = this;
518
+ if (self.loading[name] && self.loading[name].length > 0) {
519
+ self.loading[name].push(callback);
520
+ }
521
+ else {
522
+ self.loading[name] = [callback];
523
+ var request = runtime_1["default"].createScriptRequest(self.getPath(name, options));
524
+ var receiver = self.receivers.create(function (error) {
525
+ self.receivers.remove(receiver);
526
+ if (self.loading[name]) {
527
+ var callbacks = self.loading[name];
528
+ delete self.loading[name];
529
+ var successCallback = function (wasSuccessful) {
530
+ if (!wasSuccessful) {
531
+ request.cleanup();
532
+ }
533
+ };
534
+ for (var i = 0; i < callbacks.length; i++) {
535
+ callbacks[i](error, successCallback);
536
+ }
537
+ }
538
+ });
539
+ request.send(receiver);
540
+ }
541
+ };
542
+ DependencyLoader.prototype.getRoot = function (options) {
543
+ var cdn;
544
+ var protocol = runtime_1["default"].getDocument().location.protocol;
545
+ if ((options && options.encrypted) || protocol === "https:") {
546
+ cdn = this.options.cdn_https;
547
+ }
548
+ else {
549
+ cdn = this.options.cdn_http;
550
+ }
551
+ return cdn.replace(/\/*$/, "") + "/" + this.options.version;
552
+ };
553
+ DependencyLoader.prototype.getPath = function (name, options) {
554
+ return this.getRoot(options) + '/' + name + this.options.suffix + '.js';
555
+ };
556
+ ;
557
+ return DependencyLoader;
558
+ }());
559
+ exports.__esModule = true;
560
+ exports["default"] = DependencyLoader;
561
+
562
+
563
+ /***/ }),
564
+ /* 7 */
565
+ /***/ (function(module, exports, __webpack_require__) {
566
+
567
+ "use strict";
568
+ var logger_1 = __webpack_require__(8);
569
+ var runtime_1 = __webpack_require__(2);
570
+ var url_store_1 = __webpack_require__(14);
571
+ var ajax = function (context, socketId, callback) {
572
+ var self = this, xhr;
573
+ xhr = runtime_1["default"].createXHR();
574
+ xhr.open("POST", self.options.authEndpoint, true);
575
+ xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
576
+ for (var headerName in this.authOptions.headers) {
577
+ xhr.setRequestHeader(headerName, this.authOptions.headers[headerName]);
578
+ }
579
+ xhr.onreadystatechange = function () {
580
+ if (xhr.readyState === 4) {
581
+ if (xhr.status === 200) {
582
+ var data, parsed = false;
583
+ try {
584
+ data = JSON.parse(xhr.responseText);
585
+ parsed = true;
586
+ }
587
+ catch (e) {
588
+ callback(true, 'JSON returned from webapp was invalid, yet status code was 200. Data was: ' + xhr.responseText);
589
+ }
590
+ if (parsed) {
591
+ callback(false, data);
592
+ }
593
+ }
594
+ else {
595
+ var suffix = url_store_1["default"].buildLogSuffix("authenticationEndpoint");
596
+ logger_1["default"].warn(("Couldn't retrieve authentication info. " + xhr.status) +
597
+ ("Clients must be authenticated to join private or presence channels. " + suffix));
598
+ callback(true, xhr.status);
599
+ }
600
+ }
601
+ };
602
+ xhr.send(this.composeQuery(socketId));
603
+ return xhr;
604
+ };
605
+ exports.__esModule = true;
606
+ exports["default"] = ajax;
607
+
608
+
609
+ /***/ }),
610
+ /* 8 */
611
+ /***/ (function(module, exports, __webpack_require__) {
612
+
613
+ "use strict";
614
+ var collections_1 = __webpack_require__(9);
615
+ var pusher_1 = __webpack_require__(1);
616
+ var Logger = {
617
+ debug: function () {
618
+ var args = [];
619
+ for (var _i = 0; _i < arguments.length; _i++) {
620
+ args[_i - 0] = arguments[_i];
621
+ }
622
+ if (!pusher_1["default"].log) {
623
+ return;
624
+ }
625
+ pusher_1["default"].log(collections_1.stringify.apply(this, arguments));
626
+ },
627
+ warn: function () {
628
+ var args = [];
629
+ for (var _i = 0; _i < arguments.length; _i++) {
630
+ args[_i - 0] = arguments[_i];
631
+ }
632
+ var message = collections_1.stringify.apply(this, arguments);
633
+ if (pusher_1["default"].log) {
634
+ pusher_1["default"].log(message);
635
+ }
636
+ else if ((window).console) {
637
+ if ((window).console.warn) {
638
+ (window).console.warn(message);
639
+ }
640
+ else if ((window).console.log) {
641
+ (window).console.log(message);
642
+ }
643
+ }
644
+ }
645
+ };
646
+ exports.__esModule = true;
647
+ exports["default"] = Logger;
648
+
649
+
650
+ /***/ }),
651
+ /* 9 */
652
+ /***/ (function(module, exports, __webpack_require__) {
653
+
654
+ "use strict";
655
+ var base64_1 = __webpack_require__(10);
656
+ var util_1 = __webpack_require__(11);
657
+ function extend(target) {
658
+ var sources = [];
659
+ for (var _i = 1; _i < arguments.length; _i++) {
660
+ sources[_i - 1] = arguments[_i];
661
+ }
662
+ for (var i = 0; i < sources.length; i++) {
663
+ var extensions = sources[i];
664
+ for (var property in extensions) {
665
+ if (extensions[property] && extensions[property].constructor &&
666
+ extensions[property].constructor === Object) {
667
+ target[property] = extend(target[property] || {}, extensions[property]);
668
+ }
669
+ else {
670
+ target[property] = extensions[property];
671
+ }
672
+ }
673
+ }
674
+ return target;
675
+ }
676
+ exports.extend = extend;
677
+ function stringify() {
678
+ var m = ["Pusher"];
679
+ for (var i = 0; i < arguments.length; i++) {
680
+ if (typeof arguments[i] === "string") {
681
+ m.push(arguments[i]);
682
+ }
683
+ else {
684
+ m.push(safeJSONStringify(arguments[i]));
685
+ }
686
+ }
687
+ return m.join(" : ");
688
+ }
689
+ exports.stringify = stringify;
690
+ function arrayIndexOf(array, item) {
691
+ var nativeIndexOf = Array.prototype.indexOf;
692
+ if (array === null) {
693
+ return -1;
694
+ }
695
+ if (nativeIndexOf && array.indexOf === nativeIndexOf) {
696
+ return array.indexOf(item);
697
+ }
698
+ for (var i = 0, l = array.length; i < l; i++) {
699
+ if (array[i] === item) {
700
+ return i;
701
+ }
702
+ }
703
+ return -1;
704
+ }
705
+ exports.arrayIndexOf = arrayIndexOf;
706
+ function objectApply(object, f) {
707
+ for (var key in object) {
708
+ if (Object.prototype.hasOwnProperty.call(object, key)) {
709
+ f(object[key], key, object);
710
+ }
711
+ }
712
+ }
713
+ exports.objectApply = objectApply;
714
+ function keys(object) {
715
+ var keys = [];
716
+ objectApply(object, function (_, key) {
717
+ keys.push(key);
718
+ });
719
+ return keys;
720
+ }
721
+ exports.keys = keys;
722
+ function values(object) {
723
+ var values = [];
724
+ objectApply(object, function (value) {
725
+ values.push(value);
726
+ });
727
+ return values;
728
+ }
729
+ exports.values = values;
730
+ function apply(array, f, context) {
731
+ for (var i = 0; i < array.length; i++) {
732
+ f.call(context || (window), array[i], i, array);
733
+ }
734
+ }
735
+ exports.apply = apply;
736
+ function map(array, f) {
737
+ var result = [];
738
+ for (var i = 0; i < array.length; i++) {
739
+ result.push(f(array[i], i, array, result));
740
+ }
741
+ return result;
742
+ }
743
+ exports.map = map;
744
+ function mapObject(object, f) {
745
+ var result = {};
746
+ objectApply(object, function (value, key) {
747
+ result[key] = f(value);
748
+ });
749
+ return result;
750
+ }
751
+ exports.mapObject = mapObject;
752
+ function filter(array, test) {
753
+ test = test || function (value) { return !!value; };
754
+ var result = [];
755
+ for (var i = 0; i < array.length; i++) {
756
+ if (test(array[i], i, array, result)) {
757
+ result.push(array[i]);
758
+ }
759
+ }
760
+ return result;
761
+ }
762
+ exports.filter = filter;
763
+ function filterObject(object, test) {
764
+ var result = {};
765
+ objectApply(object, function (value, key) {
766
+ if ((test && test(value, key, object, result)) || Boolean(value)) {
767
+ result[key] = value;
768
+ }
769
+ });
770
+ return result;
771
+ }
772
+ exports.filterObject = filterObject;
773
+ function flatten(object) {
774
+ var result = [];
775
+ objectApply(object, function (value, key) {
776
+ result.push([key, value]);
777
+ });
778
+ return result;
779
+ }
780
+ exports.flatten = flatten;
781
+ function any(array, test) {
782
+ for (var i = 0; i < array.length; i++) {
783
+ if (test(array[i], i, array)) {
784
+ return true;
785
+ }
786
+ }
787
+ return false;
788
+ }
789
+ exports.any = any;
790
+ function all(array, test) {
791
+ for (var i = 0; i < array.length; i++) {
792
+ if (!test(array[i], i, array)) {
793
+ return false;
794
+ }
795
+ }
796
+ return true;
797
+ }
798
+ exports.all = all;
799
+ function encodeParamsObject(data) {
800
+ return mapObject(data, function (value) {
801
+ if (typeof value === "object") {
802
+ value = safeJSONStringify(value);
803
+ }
804
+ return encodeURIComponent(base64_1["default"](value.toString()));
805
+ });
806
+ }
807
+ exports.encodeParamsObject = encodeParamsObject;
808
+ function buildQueryString(data) {
809
+ var params = filterObject(data, function (value) {
810
+ return value !== undefined;
811
+ });
812
+ var query = map(flatten(encodeParamsObject(params)), util_1["default"].method("join", "=")).join("&");
813
+ return query;
814
+ }
815
+ exports.buildQueryString = buildQueryString;
816
+ function decycleObject(object) {
817
+ var objects = [], paths = [];
818
+ return (function derez(value, path) {
819
+ var i, name, nu;
820
+ switch (typeof value) {
821
+ case 'object':
822
+ if (!value) {
823
+ return null;
824
+ }
825
+ for (i = 0; i < objects.length; i += 1) {
826
+ if (objects[i] === value) {
827
+ return { $ref: paths[i] };
828
+ }
829
+ }
830
+ objects.push(value);
831
+ paths.push(path);
832
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
833
+ nu = [];
834
+ for (i = 0; i < value.length; i += 1) {
835
+ nu[i] = derez(value[i], path + '[' + i + ']');
836
+ }
837
+ }
838
+ else {
839
+ nu = {};
840
+ for (name in value) {
841
+ if (Object.prototype.hasOwnProperty.call(value, name)) {
842
+ nu[name] = derez(value[name], path + '[' + JSON.stringify(name) + ']');
843
+ }
844
+ }
845
+ }
846
+ return nu;
847
+ case 'number':
848
+ case 'string':
849
+ case 'boolean':
850
+ return value;
851
+ }
852
+ }(object, '$'));
853
+ }
854
+ exports.decycleObject = decycleObject;
855
+ function safeJSONStringify(source) {
856
+ try {
857
+ return JSON.stringify(source);
858
+ }
859
+ catch (e) {
860
+ return JSON.stringify(decycleObject(source));
861
+ }
862
+ }
863
+ exports.safeJSONStringify = safeJSONStringify;
864
+
865
+
866
+ /***/ }),
867
+ /* 10 */
868
+ /***/ (function(module, exports, __webpack_require__) {
869
+
870
+ "use strict";
871
+ function encode(s) {
872
+ return btoa(utob(s));
873
+ }
874
+ exports.__esModule = true;
875
+ exports["default"] = encode;
876
+ var fromCharCode = String.fromCharCode;
877
+ var b64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
878
+ var b64tab = {};
879
+ for (var i = 0, l = b64chars.length; i < l; i++) {
880
+ b64tab[b64chars.charAt(i)] = i;
881
+ }
882
+ var cb_utob = function (c) {
883
+ var cc = c.charCodeAt(0);
884
+ return cc < 0x80 ? c
885
+ : cc < 0x800 ? fromCharCode(0xc0 | (cc >>> 6)) +
886
+ fromCharCode(0x80 | (cc & 0x3f))
887
+ : fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) +
888
+ fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) +
889
+ fromCharCode(0x80 | (cc & 0x3f));
890
+ };
891
+ var utob = function (u) {
892
+ return u.replace(/[^\x00-\x7F]/g, cb_utob);
893
+ };
894
+ var cb_encode = function (ccc) {
895
+ var padlen = [0, 2, 1][ccc.length % 3];
896
+ var ord = ccc.charCodeAt(0) << 16
897
+ | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)
898
+ | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0));
899
+ var chars = [
900
+ b64chars.charAt(ord >>> 18),
901
+ b64chars.charAt((ord >>> 12) & 63),
902
+ padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),
903
+ padlen >= 1 ? '=' : b64chars.charAt(ord & 63)
904
+ ];
905
+ return chars.join('');
906
+ };
907
+ var btoa = (window).btoa || function (b) {
908
+ return b.replace(/[\s\S]{1,3}/g, cb_encode);
909
+ };
910
+
911
+
912
+ /***/ }),
913
+ /* 11 */
914
+ /***/ (function(module, exports, __webpack_require__) {
915
+
916
+ "use strict";
917
+ var timers_1 = __webpack_require__(12);
918
+ var Util = {
919
+ now: function () {
920
+ if (Date.now) {
921
+ return Date.now();
922
+ }
923
+ else {
924
+ return new Date().valueOf();
925
+ }
926
+ },
927
+ defer: function (callback) {
928
+ return new timers_1.OneOffTimer(0, callback);
929
+ },
930
+ method: function (name) {
931
+ var args = [];
932
+ for (var _i = 1; _i < arguments.length; _i++) {
933
+ args[_i - 1] = arguments[_i];
934
+ }
935
+ var boundArguments = Array.prototype.slice.call(arguments, 1);
936
+ return function (object) {
937
+ return object[name].apply(object, boundArguments.concat(arguments));
938
+ };
939
+ }
940
+ };
941
+ exports.__esModule = true;
942
+ exports["default"] = Util;
943
+
944
+
945
+ /***/ }),
946
+ /* 12 */
947
+ /***/ (function(module, exports, __webpack_require__) {
948
+
949
+ "use strict";
950
+ var __extends = (this && this.__extends) || function (d, b) {
951
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
952
+ function __() { this.constructor = d; }
953
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
954
+ };
955
+ var abstract_timer_1 = __webpack_require__(13);
956
+ function clearTimeout(timer) {
957
+ (window).clearTimeout(timer);
958
+ }
959
+ function clearInterval(timer) {
960
+ (window).clearInterval(timer);
961
+ }
962
+ var OneOffTimer = (function (_super) {
963
+ __extends(OneOffTimer, _super);
964
+ function OneOffTimer(delay, callback) {
965
+ _super.call(this, setTimeout, clearTimeout, delay, function (timer) {
966
+ callback();
967
+ return null;
968
+ });
969
+ }
970
+ return OneOffTimer;
971
+ }(abstract_timer_1["default"]));
972
+ exports.OneOffTimer = OneOffTimer;
973
+ var PeriodicTimer = (function (_super) {
974
+ __extends(PeriodicTimer, _super);
975
+ function PeriodicTimer(delay, callback) {
976
+ _super.call(this, setInterval, clearInterval, delay, function (timer) {
977
+ callback();
978
+ return timer;
979
+ });
980
+ }
981
+ return PeriodicTimer;
982
+ }(abstract_timer_1["default"]));
983
+ exports.PeriodicTimer = PeriodicTimer;
984
+
985
+
986
+ /***/ }),
987
+ /* 13 */
988
+ /***/ (function(module, exports) {
989
+
990
+ "use strict";
991
+ var Timer = (function () {
992
+ function Timer(set, clear, delay, callback) {
993
+ var _this = this;
994
+ this.clear = clear;
995
+ this.timer = set(function () {
996
+ if (_this.timer) {
997
+ _this.timer = callback(_this.timer);
998
+ }
999
+ }, delay);
1000
+ }
1001
+ Timer.prototype.isRunning = function () {
1002
+ return this.timer !== null;
1003
+ };
1004
+ Timer.prototype.ensureAborted = function () {
1005
+ if (this.timer) {
1006
+ this.clear(this.timer);
1007
+ this.timer = null;
1008
+ }
1009
+ };
1010
+ return Timer;
1011
+ }());
1012
+ exports.__esModule = true;
1013
+ exports["default"] = Timer;
1014
+
1015
+
1016
+ /***/ }),
1017
+ /* 14 */
1018
+ /***/ (function(module, exports) {
1019
+
1020
+ "use strict";
1021
+ var urlStore = {
1022
+ baseUrl: "https://pusher.com",
1023
+ urls: {
1024
+ authenticationEndpoint: {
1025
+ path: "/docs/authenticating_users"
1026
+ },
1027
+ javascriptQuickStart: {
1028
+ path: "/docs/javascript_quick_start"
1029
+ }
1030
+ }
1031
+ };
1032
+ var buildLogSuffix = function (key) {
1033
+ var urlPrefix = "See:";
1034
+ var urlObj = urlStore.urls[key];
1035
+ if (!urlObj)
1036
+ return "";
1037
+ var url;
1038
+ if (urlObj.fullUrl) {
1039
+ url = urlObj.fullUrl;
1040
+ }
1041
+ else if (urlObj.path) {
1042
+ url = urlStore.baseUrl + urlObj.path;
1043
+ }
1044
+ if (!url)
1045
+ return "";
1046
+ return urlPrefix + " " + url;
1047
+ };
1048
+ exports.__esModule = true;
1049
+ exports["default"] = { buildLogSuffix: buildLogSuffix };
1050
+
1051
+
1052
+ /***/ }),
1053
+ /* 15 */
1054
+ /***/ (function(module, exports, __webpack_require__) {
1055
+
1056
+ "use strict";
1057
+ var logger_1 = __webpack_require__(8);
1058
+ var jsonp = function (context, socketId, callback) {
1059
+ if (this.authOptions.headers !== undefined) {
1060
+ logger_1["default"].warn("Warn", "To send headers with the auth request, you must use AJAX, rather than JSONP.");
1061
+ }
1062
+ var callbackName = context.nextAuthCallbackID.toString();
1063
+ context.nextAuthCallbackID++;
1064
+ var document = context.getDocument();
1065
+ var script = document.createElement("script");
1066
+ context.auth_callbacks[callbackName] = function (data) {
1067
+ callback(false, data);
1068
+ };
1069
+ var callback_name = "Pusher.auth_callbacks['" + callbackName + "']";
1070
+ script.src = this.options.authEndpoint +
1071
+ '?callback=' +
1072
+ encodeURIComponent(callback_name) +
1073
+ '&' +
1074
+ this.composeQuery(socketId);
1075
+ var head = document.getElementsByTagName("head")[0] || document.documentElement;
1076
+ head.insertBefore(script, head.firstChild);
1077
+ };
1078
+ exports.__esModule = true;
1079
+ exports["default"] = jsonp;
1080
+
1081
+
1082
+ /***/ }),
1083
+ /* 16 */
1084
+ /***/ (function(module, exports) {
1085
+
1086
+ "use strict";
1087
+ var ScriptRequest = (function () {
1088
+ function ScriptRequest(src) {
1089
+ this.src = src;
1090
+ }
1091
+ ScriptRequest.prototype.send = function (receiver) {
1092
+ var self = this;
1093
+ var errorString = "Error loading " + self.src;
1094
+ self.script = document.createElement("script");
1095
+ self.script.id = receiver.id;
1096
+ self.script.src = self.src;
1097
+ self.script.type = "text/javascript";
1098
+ self.script.charset = "UTF-8";
1099
+ if (self.script.addEventListener) {
1100
+ self.script.onerror = function () {
1101
+ receiver.callback(errorString);
1102
+ };
1103
+ self.script.onload = function () {
1104
+ receiver.callback(null);
1105
+ };
1106
+ }
1107
+ else {
1108
+ self.script.onreadystatechange = function () {
1109
+ if (self.script.readyState === 'loaded' ||
1110
+ self.script.readyState === 'complete') {
1111
+ receiver.callback(null);
1112
+ }
1113
+ };
1114
+ }
1115
+ if (self.script.async === undefined && document.attachEvent &&
1116
+ /opera/i.test(navigator.userAgent)) {
1117
+ self.errorScript = document.createElement("script");
1118
+ self.errorScript.id = receiver.id + "_error";
1119
+ self.errorScript.text = receiver.name + "('" + errorString + "');";
1120
+ self.script.async = self.errorScript.async = false;
1121
+ }
1122
+ else {
1123
+ self.script.async = true;
1124
+ }
1125
+ var head = document.getElementsByTagName('head')[0];
1126
+ head.insertBefore(self.script, head.firstChild);
1127
+ if (self.errorScript) {
1128
+ head.insertBefore(self.errorScript, self.script.nextSibling);
1129
+ }
1130
+ };
1131
+ ScriptRequest.prototype.cleanup = function () {
1132
+ if (this.script) {
1133
+ this.script.onload = this.script.onerror = null;
1134
+ this.script.onreadystatechange = null;
1135
+ }
1136
+ if (this.script && this.script.parentNode) {
1137
+ this.script.parentNode.removeChild(this.script);
1138
+ }
1139
+ if (this.errorScript && this.errorScript.parentNode) {
1140
+ this.errorScript.parentNode.removeChild(this.errorScript);
1141
+ }
1142
+ this.script = null;
1143
+ this.errorScript = null;
1144
+ };
1145
+ return ScriptRequest;
1146
+ }());
1147
+ exports.__esModule = true;
1148
+ exports["default"] = ScriptRequest;
1149
+
1150
+
1151
+ /***/ }),
1152
+ /* 17 */
1153
+ /***/ (function(module, exports, __webpack_require__) {
1154
+
1155
+ "use strict";
1156
+ var Collections = __webpack_require__(9);
1157
+ var runtime_1 = __webpack_require__(2);
1158
+ var JSONPRequest = (function () {
1159
+ function JSONPRequest(url, data) {
1160
+ this.url = url;
1161
+ this.data = data;
1162
+ }
1163
+ JSONPRequest.prototype.send = function (receiver) {
1164
+ if (this.request) {
1165
+ return;
1166
+ }
1167
+ var query = Collections.buildQueryString(this.data);
1168
+ var url = this.url + "/" + receiver.number + "?" + query;
1169
+ this.request = runtime_1["default"].createScriptRequest(url);
1170
+ this.request.send(receiver);
1171
+ };
1172
+ JSONPRequest.prototype.cleanup = function () {
1173
+ if (this.request) {
1174
+ this.request.cleanup();
1175
+ }
1176
+ };
1177
+ return JSONPRequest;
1178
+ }());
1179
+ exports.__esModule = true;
1180
+ exports["default"] = JSONPRequest;
1181
+
1182
+
1183
+ /***/ }),
1184
+ /* 18 */
1185
+ /***/ (function(module, exports, __webpack_require__) {
1186
+
1187
+ "use strict";
1188
+ var runtime_1 = __webpack_require__(2);
1189
+ var script_receiver_factory_1 = __webpack_require__(4);
1190
+ var getAgent = function (sender, encrypted) {
1191
+ return function (data, callback) {
1192
+ var scheme = "http" + (encrypted ? "s" : "") + "://";
1193
+ var url = scheme + (sender.host || sender.options.host) + sender.options.path;
1194
+ var request = runtime_1["default"].createJSONPRequest(url, data);
1195
+ var receiver = runtime_1["default"].ScriptReceivers.create(function (error, result) {
1196
+ script_receiver_factory_1.ScriptReceivers.remove(receiver);
1197
+ request.cleanup();
1198
+ if (result && result.host) {
1199
+ sender.host = result.host;
1200
+ }
1201
+ if (callback) {
1202
+ callback(error, result);
1203
+ }
1204
+ });
1205
+ request.send(receiver);
1206
+ };
1207
+ };
1208
+ var jsonp = {
1209
+ name: 'jsonp',
1210
+ getAgent: getAgent
1211
+ };
1212
+ exports.__esModule = true;
1213
+ exports["default"] = jsonp;
1214
+
1215
+
1216
+ /***/ }),
1217
+ /* 19 */
1218
+ /***/ (function(module, exports, __webpack_require__) {
1219
+
1220
+ "use strict";
1221
+ var transports_1 = __webpack_require__(20);
1222
+ var transport_1 = __webpack_require__(22);
1223
+ var URLSchemes = __webpack_require__(21);
1224
+ var runtime_1 = __webpack_require__(2);
1225
+ var dependencies_1 = __webpack_require__(3);
1226
+ var Collections = __webpack_require__(9);
1227
+ var SockJSTransport = new transport_1["default"]({
1228
+ file: "sockjs",
1229
+ urls: URLSchemes.sockjs,
1230
+ handlesActivityChecks: true,
1231
+ supportsPing: false,
1232
+ isSupported: function () {
1233
+ return true;
1234
+ },
1235
+ isInitialized: function () {
1236
+ return window.SockJS !== undefined;
1237
+ },
1238
+ getSocket: function (url, options) {
1239
+ return new window.SockJS(url, null, {
1240
+ js_path: dependencies_1.Dependencies.getPath("sockjs", {
1241
+ encrypted: options.encrypted
1242
+ }),
1243
+ ignore_null_origin: options.ignoreNullOrigin
1244
+ });
1245
+ },
1246
+ beforeOpen: function (socket, path) {
1247
+ socket.send(JSON.stringify({
1248
+ path: path
1249
+ }));
1250
+ }
1251
+ });
1252
+ var xdrConfiguration = {
1253
+ isSupported: function (environment) {
1254
+ var yes = runtime_1["default"].isXDRSupported(environment.encrypted);
1255
+ return yes;
1256
+ }
1257
+ };
1258
+ var XDRStreamingTransport = new transport_1["default"](Collections.extend({}, transports_1.streamingConfiguration, xdrConfiguration));
1259
+ var XDRPollingTransport = new transport_1["default"](Collections.extend({}, transports_1.pollingConfiguration, xdrConfiguration));
1260
+ transports_1["default"].xdr_streaming = XDRStreamingTransport;
1261
+ transports_1["default"].xdr_polling = XDRPollingTransport;
1262
+ transports_1["default"].sockjs = SockJSTransport;
1263
+ exports.__esModule = true;
1264
+ exports["default"] = transports_1["default"];
1265
+
1266
+
1267
+ /***/ }),
1268
+ /* 20 */
1269
+ /***/ (function(module, exports, __webpack_require__) {
1270
+
1271
+ "use strict";
1272
+ var URLSchemes = __webpack_require__(21);
1273
+ var transport_1 = __webpack_require__(22);
1274
+ var Collections = __webpack_require__(9);
1275
+ var runtime_1 = __webpack_require__(2);
1276
+ var WSTransport = new transport_1["default"]({
1277
+ urls: URLSchemes.ws,
1278
+ handlesActivityChecks: false,
1279
+ supportsPing: false,
1280
+ isInitialized: function () {
1281
+ return Boolean(runtime_1["default"].getWebSocketAPI());
1282
+ },
1283
+ isSupported: function () {
1284
+ return Boolean(runtime_1["default"].getWebSocketAPI());
1285
+ },
1286
+ getSocket: function (url) {
1287
+ return runtime_1["default"].createWebSocket(url);
1288
+ }
1289
+ });
1290
+ var httpConfiguration = {
1291
+ urls: URLSchemes.http,
1292
+ handlesActivityChecks: false,
1293
+ supportsPing: true,
1294
+ isInitialized: function () {
1295
+ return true;
1296
+ }
1297
+ };
1298
+ exports.streamingConfiguration = Collections.extend({ getSocket: function (url) {
1299
+ return runtime_1["default"].HTTPFactory.createStreamingSocket(url);
1300
+ }
1301
+ }, httpConfiguration);
1302
+ exports.pollingConfiguration = Collections.extend({ getSocket: function (url) {
1303
+ return runtime_1["default"].HTTPFactory.createPollingSocket(url);
1304
+ }
1305
+ }, httpConfiguration);
1306
+ var xhrConfiguration = {
1307
+ isSupported: function () {
1308
+ return runtime_1["default"].isXHRSupported();
1309
+ }
1310
+ };
1311
+ var XHRStreamingTransport = new transport_1["default"](Collections.extend({}, exports.streamingConfiguration, xhrConfiguration));
1312
+ var XHRPollingTransport = new transport_1["default"](Collections.extend({}, exports.pollingConfiguration, xhrConfiguration));
1313
+ var Transports = {
1314
+ ws: WSTransport,
1315
+ xhr_streaming: XHRStreamingTransport,
1316
+ xhr_polling: XHRPollingTransport
1317
+ };
1318
+ exports.__esModule = true;
1319
+ exports["default"] = Transports;
1320
+
1321
+
1322
+ /***/ }),
1323
+ /* 21 */
1324
+ /***/ (function(module, exports, __webpack_require__) {
1325
+
1326
+ "use strict";
1327
+ var defaults_1 = __webpack_require__(5);
1328
+ function getGenericURL(baseScheme, params, path) {
1329
+ var scheme = baseScheme + (params.encrypted ? "s" : "");
1330
+ var host = params.encrypted ? params.hostEncrypted : params.hostUnencrypted;
1331
+ return scheme + "://" + host + path;
1332
+ }
1333
+ function getGenericPath(key, queryString) {
1334
+ var path = "/app/" + key;
1335
+ var query = "?protocol=" + defaults_1["default"].PROTOCOL +
1336
+ "&client=js" +
1337
+ "&version=" + defaults_1["default"].VERSION +
1338
+ (queryString ? ("&" + queryString) : "");
1339
+ return path + query;
1340
+ }
1341
+ exports.ws = {
1342
+ getInitial: function (key, params) {
1343
+ var path = (params.httpPath || "") + getGenericPath(key, "flash=false");
1344
+ return getGenericURL("ws", params, path);
1345
+ }
1346
+ };
1347
+ exports.http = {
1348
+ getInitial: function (key, params) {
1349
+ var path = (params.httpPath || "/pusher") + getGenericPath(key);
1350
+ return getGenericURL("http", params, path);
1351
+ }
1352
+ };
1353
+ exports.sockjs = {
1354
+ getInitial: function (key, params) {
1355
+ return getGenericURL("http", params, params.httpPath || "/pusher");
1356
+ },
1357
+ getPath: function (key, params) {
1358
+ return getGenericPath(key);
1359
+ }
1360
+ };
1361
+
1362
+
1363
+ /***/ }),
1364
+ /* 22 */
1365
+ /***/ (function(module, exports, __webpack_require__) {
1366
+
1367
+ "use strict";
1368
+ var transport_connection_1 = __webpack_require__(23);
1369
+ var Transport = (function () {
1370
+ function Transport(hooks) {
1371
+ this.hooks = hooks;
1372
+ }
1373
+ Transport.prototype.isSupported = function (environment) {
1374
+ return this.hooks.isSupported(environment);
1375
+ };
1376
+ Transport.prototype.createConnection = function (name, priority, key, options) {
1377
+ return new transport_connection_1["default"](this.hooks, name, priority, key, options);
1378
+ };
1379
+ return Transport;
1380
+ }());
1381
+ exports.__esModule = true;
1382
+ exports["default"] = Transport;
1383
+
1384
+
1385
+ /***/ }),
1386
+ /* 23 */
1387
+ /***/ (function(module, exports, __webpack_require__) {
1388
+
1389
+ "use strict";
1390
+ var __extends = (this && this.__extends) || function (d, b) {
1391
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
1392
+ function __() { this.constructor = d; }
1393
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1394
+ };
1395
+ var util_1 = __webpack_require__(11);
1396
+ var Collections = __webpack_require__(9);
1397
+ var dispatcher_1 = __webpack_require__(24);
1398
+ var logger_1 = __webpack_require__(8);
1399
+ var runtime_1 = __webpack_require__(2);
1400
+ var TransportConnection = (function (_super) {
1401
+ __extends(TransportConnection, _super);
1402
+ function TransportConnection(hooks, name, priority, key, options) {
1403
+ _super.call(this);
1404
+ this.initialize = runtime_1["default"].transportConnectionInitializer;
1405
+ this.hooks = hooks;
1406
+ this.name = name;
1407
+ this.priority = priority;
1408
+ this.key = key;
1409
+ this.options = options;
1410
+ this.state = "new";
1411
+ this.timeline = options.timeline;
1412
+ this.activityTimeout = options.activityTimeout;
1413
+ this.id = this.timeline.generateUniqueID();
1414
+ }
1415
+ TransportConnection.prototype.handlesActivityChecks = function () {
1416
+ return Boolean(this.hooks.handlesActivityChecks);
1417
+ };
1418
+ TransportConnection.prototype.supportsPing = function () {
1419
+ return Boolean(this.hooks.supportsPing);
1420
+ };
1421
+ TransportConnection.prototype.connect = function () {
1422
+ var _this = this;
1423
+ if (this.socket || this.state !== "initialized") {
1424
+ return false;
1425
+ }
1426
+ var url = this.hooks.urls.getInitial(this.key, this.options);
1427
+ try {
1428
+ this.socket = this.hooks.getSocket(url, this.options);
1429
+ }
1430
+ catch (e) {
1431
+ util_1["default"].defer(function () {
1432
+ _this.onError(e);
1433
+ _this.changeState("closed");
1434
+ });
1435
+ return false;
1436
+ }
1437
+ this.bindListeners();
1438
+ logger_1["default"].debug("Connecting", { transport: this.name, url: url });
1439
+ this.changeState("connecting");
1440
+ return true;
1441
+ };
1442
+ TransportConnection.prototype.close = function () {
1443
+ if (this.socket) {
1444
+ this.socket.close();
1445
+ return true;
1446
+ }
1447
+ else {
1448
+ return false;
1449
+ }
1450
+ };
1451
+ TransportConnection.prototype.send = function (data) {
1452
+ var _this = this;
1453
+ if (this.state === "open") {
1454
+ util_1["default"].defer(function () {
1455
+ if (_this.socket) {
1456
+ _this.socket.send(data);
1457
+ }
1458
+ });
1459
+ return true;
1460
+ }
1461
+ else {
1462
+ return false;
1463
+ }
1464
+ };
1465
+ TransportConnection.prototype.ping = function () {
1466
+ if (this.state === "open" && this.supportsPing()) {
1467
+ this.socket.ping();
1468
+ }
1469
+ };
1470
+ TransportConnection.prototype.onOpen = function () {
1471
+ if (this.hooks.beforeOpen) {
1472
+ this.hooks.beforeOpen(this.socket, this.hooks.urls.getPath(this.key, this.options));
1473
+ }
1474
+ this.changeState("open");
1475
+ this.socket.onopen = undefined;
1476
+ };
1477
+ TransportConnection.prototype.onError = function (error) {
1478
+ this.emit("error", { type: 'WebSocketError', error: error });
1479
+ this.timeline.error(this.buildTimelineMessage({ error: error.toString() }));
1480
+ };
1481
+ TransportConnection.prototype.onClose = function (closeEvent) {
1482
+ if (closeEvent) {
1483
+ this.changeState("closed", {
1484
+ code: closeEvent.code,
1485
+ reason: closeEvent.reason,
1486
+ wasClean: closeEvent.wasClean
1487
+ });
1488
+ }
1489
+ else {
1490
+ this.changeState("closed");
1491
+ }
1492
+ this.unbindListeners();
1493
+ this.socket = undefined;
1494
+ };
1495
+ TransportConnection.prototype.onMessage = function (message) {
1496
+ this.emit("message", message);
1497
+ };
1498
+ TransportConnection.prototype.onActivity = function () {
1499
+ this.emit("activity");
1500
+ };
1501
+ TransportConnection.prototype.bindListeners = function () {
1502
+ var _this = this;
1503
+ this.socket.onopen = function () {
1504
+ _this.onOpen();
1505
+ };
1506
+ this.socket.onerror = function (error) {
1507
+ _this.onError(error);
1508
+ };
1509
+ this.socket.onclose = function (closeEvent) {
1510
+ _this.onClose(closeEvent);
1511
+ };
1512
+ this.socket.onmessage = function (message) {
1513
+ _this.onMessage(message);
1514
+ };
1515
+ if (this.supportsPing()) {
1516
+ this.socket.onactivity = function () { _this.onActivity(); };
1517
+ }
1518
+ };
1519
+ TransportConnection.prototype.unbindListeners = function () {
1520
+ if (this.socket) {
1521
+ this.socket.onopen = undefined;
1522
+ this.socket.onerror = undefined;
1523
+ this.socket.onclose = undefined;
1524
+ this.socket.onmessage = undefined;
1525
+ if (this.supportsPing()) {
1526
+ this.socket.onactivity = undefined;
1527
+ }
1528
+ }
1529
+ };
1530
+ TransportConnection.prototype.changeState = function (state, params) {
1531
+ this.state = state;
1532
+ this.timeline.info(this.buildTimelineMessage({
1533
+ state: state,
1534
+ params: params
1535
+ }));
1536
+ this.emit(state, params);
1537
+ };
1538
+ TransportConnection.prototype.buildTimelineMessage = function (message) {
1539
+ return Collections.extend({ cid: this.id }, message);
1540
+ };
1541
+ return TransportConnection;
1542
+ }(dispatcher_1["default"]));
1543
+ exports.__esModule = true;
1544
+ exports["default"] = TransportConnection;
1545
+
1546
+
1547
+ /***/ }),
1548
+ /* 24 */
1549
+ /***/ (function(module, exports, __webpack_require__) {
1550
+
1551
+ "use strict";
1552
+ var Collections = __webpack_require__(9);
1553
+ var callback_registry_1 = __webpack_require__(25);
1554
+ var Dispatcher = (function () {
1555
+ function Dispatcher(failThrough) {
1556
+ this.callbacks = new callback_registry_1["default"]();
1557
+ this.global_callbacks = [];
1558
+ this.failThrough = failThrough;
1559
+ }
1560
+ Dispatcher.prototype.bind = function (eventName, callback, context) {
1561
+ this.callbacks.add(eventName, callback, context);
1562
+ return this;
1563
+ };
1564
+ Dispatcher.prototype.bind_global = function (callback) {
1565
+ this.global_callbacks.push(callback);
1566
+ return this;
1567
+ };
1568
+ Dispatcher.prototype.unbind = function (eventName, callback, context) {
1569
+ this.callbacks.remove(eventName, callback, context);
1570
+ return this;
1571
+ };
1572
+ Dispatcher.prototype.unbind_global = function (callback) {
1573
+ if (!callback) {
1574
+ this.global_callbacks = [];
1575
+ return this;
1576
+ }
1577
+ this.global_callbacks = Collections.filter(this.global_callbacks || [], function (c) { return c !== callback; });
1578
+ return this;
1579
+ };
1580
+ Dispatcher.prototype.unbind_all = function () {
1581
+ this.unbind();
1582
+ this.unbind_global();
1583
+ return this;
1584
+ };
1585
+ Dispatcher.prototype.emit = function (eventName, data) {
1586
+ var i;
1587
+ for (i = 0; i < this.global_callbacks.length; i++) {
1588
+ this.global_callbacks[i](eventName, data);
1589
+ }
1590
+ var callbacks = this.callbacks.get(eventName);
1591
+ if (callbacks && callbacks.length > 0) {
1592
+ for (i = 0; i < callbacks.length; i++) {
1593
+ callbacks[i].fn.call(callbacks[i].context || (window), data);
1594
+ }
1595
+ }
1596
+ else if (this.failThrough) {
1597
+ this.failThrough(eventName, data);
1598
+ }
1599
+ return this;
1600
+ };
1601
+ return Dispatcher;
1602
+ }());
1603
+ exports.__esModule = true;
1604
+ exports["default"] = Dispatcher;
1605
+
1606
+
1607
+ /***/ }),
1608
+ /* 25 */
1609
+ /***/ (function(module, exports, __webpack_require__) {
1610
+
1611
+ "use strict";
1612
+ var Collections = __webpack_require__(9);
1613
+ var CallbackRegistry = (function () {
1614
+ function CallbackRegistry() {
1615
+ this._callbacks = {};
1616
+ }
1617
+ CallbackRegistry.prototype.get = function (name) {
1618
+ return this._callbacks[prefix(name)];
1619
+ };
1620
+ CallbackRegistry.prototype.add = function (name, callback, context) {
1621
+ var prefixedEventName = prefix(name);
1622
+ this._callbacks[prefixedEventName] = this._callbacks[prefixedEventName] || [];
1623
+ this._callbacks[prefixedEventName].push({
1624
+ fn: callback,
1625
+ context: context
1626
+ });
1627
+ };
1628
+ CallbackRegistry.prototype.remove = function (name, callback, context) {
1629
+ if (!name && !callback && !context) {
1630
+ this._callbacks = {};
1631
+ return;
1632
+ }
1633
+ var names = name ? [prefix(name)] : Collections.keys(this._callbacks);
1634
+ if (callback || context) {
1635
+ this.removeCallback(names, callback, context);
1636
+ }
1637
+ else {
1638
+ this.removeAllCallbacks(names);
1639
+ }
1640
+ };
1641
+ CallbackRegistry.prototype.removeCallback = function (names, callback, context) {
1642
+ Collections.apply(names, function (name) {
1643
+ this._callbacks[name] = Collections.filter(this._callbacks[name] || [], function (binding) {
1644
+ return (callback && callback !== binding.fn) ||
1645
+ (context && context !== binding.context);
1646
+ });
1647
+ if (this._callbacks[name].length === 0) {
1648
+ delete this._callbacks[name];
1649
+ }
1650
+ }, this);
1651
+ };
1652
+ CallbackRegistry.prototype.removeAllCallbacks = function (names) {
1653
+ Collections.apply(names, function (name) {
1654
+ delete this._callbacks[name];
1655
+ }, this);
1656
+ };
1657
+ return CallbackRegistry;
1658
+ }());
1659
+ exports.__esModule = true;
1660
+ exports["default"] = CallbackRegistry;
1661
+ function prefix(name) {
1662
+ return "_" + name;
1663
+ }
1664
+
1665
+
1666
+ /***/ }),
1667
+ /* 26 */
1668
+ /***/ (function(module, exports, __webpack_require__) {
1669
+
1670
+ "use strict";
1671
+ var __extends = (this && this.__extends) || function (d, b) {
1672
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
1673
+ function __() { this.constructor = d; }
1674
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1675
+ };
1676
+ var dispatcher_1 = __webpack_require__(24);
1677
+ var NetInfo = (function (_super) {
1678
+ __extends(NetInfo, _super);
1679
+ function NetInfo() {
1680
+ _super.call(this);
1681
+ var self = this;
1682
+ if (window.addEventListener !== undefined) {
1683
+ window.addEventListener("online", function () {
1684
+ self.emit('online');
1685
+ }, false);
1686
+ window.addEventListener("offline", function () {
1687
+ self.emit('offline');
1688
+ }, false);
1689
+ }
1690
+ }
1691
+ NetInfo.prototype.isOnline = function () {
1692
+ if (window.navigator.onLine === undefined) {
1693
+ return true;
1694
+ }
1695
+ else {
1696
+ return window.navigator.onLine;
1697
+ }
1698
+ };
1699
+ return NetInfo;
1700
+ }(dispatcher_1["default"]));
1701
+ exports.NetInfo = NetInfo;
1702
+ exports.Network = new NetInfo();
1703
+
1704
+
1705
+ /***/ }),
1706
+ /* 27 */
1707
+ /***/ (function(module, exports) {
1708
+
1709
+ "use strict";
1710
+ var getDefaultStrategy = function (config) {
1711
+ var wsStrategy;
1712
+ if (config.encrypted) {
1713
+ wsStrategy = [
1714
+ ":best_connected_ever",
1715
+ ":ws_loop",
1716
+ [":delayed", 2000, [":http_fallback_loop"]]
1717
+ ];
1718
+ }
1719
+ else {
1720
+ wsStrategy = [
1721
+ ":best_connected_ever",
1722
+ ":ws_loop",
1723
+ [":delayed", 2000, [":wss_loop"]],
1724
+ [":delayed", 5000, [":http_fallback_loop"]]
1725
+ ];
1726
+ }
1727
+ return [
1728
+ [":def", "ws_options", {
1729
+ hostUnencrypted: config.wsHost + ":" + config.wsPort,
1730
+ hostEncrypted: config.wsHost + ":" + config.wssPort,
1731
+ httpPath: config.wsPath
1732
+ }],
1733
+ [":def", "wss_options", [":extend", ":ws_options", {
1734
+ encrypted: true
1735
+ }]],
1736
+ [":def", "sockjs_options", {
1737
+ hostUnencrypted: config.httpHost + ":" + config.httpPort,
1738
+ hostEncrypted: config.httpHost + ":" + config.httpsPort,
1739
+ httpPath: config.httpPath
1740
+ }],
1741
+ [":def", "timeouts", {
1742
+ loop: true,
1743
+ timeout: 15000,
1744
+ timeoutLimit: 60000
1745
+ }],
1746
+ [":def", "ws_manager", [":transport_manager", {
1747
+ lives: 2,
1748
+ minPingDelay: 10000,
1749
+ maxPingDelay: config.activity_timeout
1750
+ }]],
1751
+ [":def", "streaming_manager", [":transport_manager", {
1752
+ lives: 2,
1753
+ minPingDelay: 10000,
1754
+ maxPingDelay: config.activity_timeout
1755
+ }]],
1756
+ [":def_transport", "ws", "ws", 3, ":ws_options", ":ws_manager"],
1757
+ [":def_transport", "wss", "ws", 3, ":wss_options", ":ws_manager"],
1758
+ [":def_transport", "sockjs", "sockjs", 1, ":sockjs_options"],
1759
+ [":def_transport", "xhr_streaming", "xhr_streaming", 1, ":sockjs_options", ":streaming_manager"],
1760
+ [":def_transport", "xdr_streaming", "xdr_streaming", 1, ":sockjs_options", ":streaming_manager"],
1761
+ [":def_transport", "xhr_polling", "xhr_polling", 1, ":sockjs_options"],
1762
+ [":def_transport", "xdr_polling", "xdr_polling", 1, ":sockjs_options"],
1763
+ [":def", "ws_loop", [":sequential", ":timeouts", ":ws"]],
1764
+ [":def", "wss_loop", [":sequential", ":timeouts", ":wss"]],
1765
+ [":def", "sockjs_loop", [":sequential", ":timeouts", ":sockjs"]],
1766
+ [":def", "streaming_loop", [":sequential", ":timeouts",
1767
+ [":if", [":is_supported", ":xhr_streaming"],
1768
+ ":xhr_streaming",
1769
+ ":xdr_streaming"
1770
+ ]
1771
+ ]],
1772
+ [":def", "polling_loop", [":sequential", ":timeouts",
1773
+ [":if", [":is_supported", ":xhr_polling"],
1774
+ ":xhr_polling",
1775
+ ":xdr_polling"
1776
+ ]
1777
+ ]],
1778
+ [":def", "http_loop", [":if", [":is_supported", ":streaming_loop"], [
1779
+ ":best_connected_ever",
1780
+ ":streaming_loop",
1781
+ [":delayed", 4000, [":polling_loop"]]
1782
+ ], [
1783
+ ":polling_loop"
1784
+ ]]],
1785
+ [":def", "http_fallback_loop",
1786
+ [":if", [":is_supported", ":http_loop"], [
1787
+ ":http_loop"
1788
+ ], [
1789
+ ":sockjs_loop"
1790
+ ]]
1791
+ ],
1792
+ [":def", "strategy",
1793
+ [":cached", 1800000,
1794
+ [":first_connected",
1795
+ [":if", [":is_supported", ":ws"],
1796
+ wsStrategy,
1797
+ ":http_fallback_loop"
1798
+ ]
1799
+ ]
1800
+ ]
1801
+ ]
1802
+ ];
1803
+ };
1804
+ exports.__esModule = true;
1805
+ exports["default"] = getDefaultStrategy;
1806
+
1807
+
1808
+ /***/ }),
1809
+ /* 28 */
1810
+ /***/ (function(module, exports, __webpack_require__) {
1811
+
1812
+ "use strict";
1813
+ var dependencies_1 = __webpack_require__(3);
1814
+ function default_1() {
1815
+ var self = this;
1816
+ self.timeline.info(self.buildTimelineMessage({
1817
+ transport: self.name + (self.options.encrypted ? "s" : "")
1818
+ }));
1819
+ if (self.hooks.isInitialized()) {
1820
+ self.changeState("initialized");
1821
+ }
1822
+ else if (self.hooks.file) {
1823
+ self.changeState("initializing");
1824
+ dependencies_1.Dependencies.load(self.hooks.file, { encrypted: self.options.encrypted }, function (error, callback) {
1825
+ if (self.hooks.isInitialized()) {
1826
+ self.changeState("initialized");
1827
+ callback(true);
1828
+ }
1829
+ else {
1830
+ if (error) {
1831
+ self.onError(error);
1832
+ }
1833
+ self.onClose();
1834
+ callback(false);
1835
+ }
1836
+ });
1837
+ }
1838
+ else {
1839
+ self.onClose();
1840
+ }
1841
+ }
1842
+ exports.__esModule = true;
1843
+ exports["default"] = default_1;
1844
+
1845
+
1846
+ /***/ }),
1847
+ /* 29 */
1848
+ /***/ (function(module, exports, __webpack_require__) {
1849
+
1850
+ "use strict";
1851
+ var http_xdomain_request_1 = __webpack_require__(30);
1852
+ var http_1 = __webpack_require__(32);
1853
+ http_1["default"].createXDR = function (method, url) {
1854
+ return this.createRequest(http_xdomain_request_1["default"], method, url);
1855
+ };
1856
+ exports.__esModule = true;
1857
+ exports["default"] = http_1["default"];
1858
+
1859
+
1860
+ /***/ }),
1861
+ /* 30 */
1862
+ /***/ (function(module, exports, __webpack_require__) {
1863
+
1864
+ "use strict";
1865
+ var Errors = __webpack_require__(31);
1866
+ var hooks = {
1867
+ getRequest: function (socket) {
1868
+ var xdr = new window.XDomainRequest();
1869
+ xdr.ontimeout = function () {
1870
+ socket.emit("error", new Errors.RequestTimedOut());
1871
+ socket.close();
1872
+ };
1873
+ xdr.onerror = function (e) {
1874
+ socket.emit("error", e);
1875
+ socket.close();
1876
+ };
1877
+ xdr.onprogress = function () {
1878
+ if (xdr.responseText && xdr.responseText.length > 0) {
1879
+ socket.onChunk(200, xdr.responseText);
1880
+ }
1881
+ };
1882
+ xdr.onload = function () {
1883
+ if (xdr.responseText && xdr.responseText.length > 0) {
1884
+ socket.onChunk(200, xdr.responseText);
1885
+ }
1886
+ socket.emit("finished", 200);
1887
+ socket.close();
1888
+ };
1889
+ return xdr;
1890
+ },
1891
+ abortRequest: function (xdr) {
1892
+ xdr.ontimeout = xdr.onerror = xdr.onprogress = xdr.onload = null;
1893
+ xdr.abort();
1894
+ }
1895
+ };
1896
+ exports.__esModule = true;
1897
+ exports["default"] = hooks;
1898
+
1899
+
1900
+ /***/ }),
1901
+ /* 31 */
1902
+ /***/ (function(module, exports) {
1903
+
1904
+ "use strict";
1905
+ var __extends = (this && this.__extends) || function (d, b) {
1906
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
1907
+ function __() { this.constructor = d; }
1908
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1909
+ };
1910
+ var BadEventName = (function (_super) {
1911
+ __extends(BadEventName, _super);
1912
+ function BadEventName() {
1913
+ _super.apply(this, arguments);
1914
+ }
1915
+ return BadEventName;
1916
+ }(Error));
1917
+ exports.BadEventName = BadEventName;
1918
+ var RequestTimedOut = (function (_super) {
1919
+ __extends(RequestTimedOut, _super);
1920
+ function RequestTimedOut() {
1921
+ _super.apply(this, arguments);
1922
+ }
1923
+ return RequestTimedOut;
1924
+ }(Error));
1925
+ exports.RequestTimedOut = RequestTimedOut;
1926
+ var TransportPriorityTooLow = (function (_super) {
1927
+ __extends(TransportPriorityTooLow, _super);
1928
+ function TransportPriorityTooLow() {
1929
+ _super.apply(this, arguments);
1930
+ }
1931
+ return TransportPriorityTooLow;
1932
+ }(Error));
1933
+ exports.TransportPriorityTooLow = TransportPriorityTooLow;
1934
+ var TransportClosed = (function (_super) {
1935
+ __extends(TransportClosed, _super);
1936
+ function TransportClosed() {
1937
+ _super.apply(this, arguments);
1938
+ }
1939
+ return TransportClosed;
1940
+ }(Error));
1941
+ exports.TransportClosed = TransportClosed;
1942
+ var UnsupportedTransport = (function (_super) {
1943
+ __extends(UnsupportedTransport, _super);
1944
+ function UnsupportedTransport() {
1945
+ _super.apply(this, arguments);
1946
+ }
1947
+ return UnsupportedTransport;
1948
+ }(Error));
1949
+ exports.UnsupportedTransport = UnsupportedTransport;
1950
+ var UnsupportedStrategy = (function (_super) {
1951
+ __extends(UnsupportedStrategy, _super);
1952
+ function UnsupportedStrategy() {
1953
+ _super.apply(this, arguments);
1954
+ }
1955
+ return UnsupportedStrategy;
1956
+ }(Error));
1957
+ exports.UnsupportedStrategy = UnsupportedStrategy;
1958
+
1959
+
1960
+ /***/ }),
1961
+ /* 32 */
1962
+ /***/ (function(module, exports, __webpack_require__) {
1963
+
1964
+ "use strict";
1965
+ var http_request_1 = __webpack_require__(33);
1966
+ var http_socket_1 = __webpack_require__(34);
1967
+ var http_streaming_socket_1 = __webpack_require__(36);
1968
+ var http_polling_socket_1 = __webpack_require__(37);
1969
+ var http_xhr_request_1 = __webpack_require__(38);
1970
+ var HTTP = {
1971
+ createStreamingSocket: function (url) {
1972
+ return this.createSocket(http_streaming_socket_1["default"], url);
1973
+ },
1974
+ createPollingSocket: function (url) {
1975
+ return this.createSocket(http_polling_socket_1["default"], url);
1976
+ },
1977
+ createSocket: function (hooks, url) {
1978
+ return new http_socket_1["default"](hooks, url);
1979
+ },
1980
+ createXHR: function (method, url) {
1981
+ return this.createRequest(http_xhr_request_1["default"], method, url);
1982
+ },
1983
+ createRequest: function (hooks, method, url) {
1984
+ return new http_request_1["default"](hooks, method, url);
1985
+ }
1986
+ };
1987
+ exports.__esModule = true;
1988
+ exports["default"] = HTTP;
1989
+
1990
+
1991
+ /***/ }),
1992
+ /* 33 */
1993
+ /***/ (function(module, exports, __webpack_require__) {
1994
+
1995
+ "use strict";
1996
+ var __extends = (this && this.__extends) || function (d, b) {
1997
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
1998
+ function __() { this.constructor = d; }
1999
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
2000
+ };
2001
+ var runtime_1 = __webpack_require__(2);
2002
+ var dispatcher_1 = __webpack_require__(24);
2003
+ var MAX_BUFFER_LENGTH = 256 * 1024;
2004
+ var HTTPRequest = (function (_super) {
2005
+ __extends(HTTPRequest, _super);
2006
+ function HTTPRequest(hooks, method, url) {
2007
+ _super.call(this);
2008
+ this.hooks = hooks;
2009
+ this.method = method;
2010
+ this.url = url;
2011
+ }
2012
+ HTTPRequest.prototype.start = function (payload) {
2013
+ var _this = this;
2014
+ this.position = 0;
2015
+ this.xhr = this.hooks.getRequest(this);
2016
+ this.unloader = function () {
2017
+ _this.close();
2018
+ };
2019
+ runtime_1["default"].addUnloadListener(this.unloader);
2020
+ this.xhr.open(this.method, this.url, true);
2021
+ if (this.xhr.setRequestHeader) {
2022
+ this.xhr.setRequestHeader("Content-Type", "application/json");
2023
+ }
2024
+ this.xhr.send(payload);
2025
+ };
2026
+ HTTPRequest.prototype.close = function () {
2027
+ if (this.unloader) {
2028
+ runtime_1["default"].removeUnloadListener(this.unloader);
2029
+ this.unloader = null;
2030
+ }
2031
+ if (this.xhr) {
2032
+ this.hooks.abortRequest(this.xhr);
2033
+ this.xhr = null;
2034
+ }
2035
+ };
2036
+ HTTPRequest.prototype.onChunk = function (status, data) {
2037
+ while (true) {
2038
+ var chunk = this.advanceBuffer(data);
2039
+ if (chunk) {
2040
+ this.emit("chunk", { status: status, data: chunk });
2041
+ }
2042
+ else {
2043
+ break;
2044
+ }
2045
+ }
2046
+ if (this.isBufferTooLong(data)) {
2047
+ this.emit("buffer_too_long");
2048
+ }
2049
+ };
2050
+ HTTPRequest.prototype.advanceBuffer = function (buffer) {
2051
+ var unreadData = buffer.slice(this.position);
2052
+ var endOfLinePosition = unreadData.indexOf("\n");
2053
+ if (endOfLinePosition !== -1) {
2054
+ this.position += endOfLinePosition + 1;
2055
+ return unreadData.slice(0, endOfLinePosition);
2056
+ }
2057
+ else {
2058
+ return null;
2059
+ }
2060
+ };
2061
+ HTTPRequest.prototype.isBufferTooLong = function (buffer) {
2062
+ return this.position === buffer.length && buffer.length > MAX_BUFFER_LENGTH;
2063
+ };
2064
+ return HTTPRequest;
2065
+ }(dispatcher_1["default"]));
2066
+ exports.__esModule = true;
2067
+ exports["default"] = HTTPRequest;
2068
+
2069
+
2070
+ /***/ }),
2071
+ /* 34 */
2072
+ /***/ (function(module, exports, __webpack_require__) {
2073
+
2074
+ "use strict";
2075
+ var state_1 = __webpack_require__(35);
2076
+ var util_1 = __webpack_require__(11);
2077
+ var runtime_1 = __webpack_require__(2);
2078
+ var autoIncrement = 1;
2079
+ var HTTPSocket = (function () {
2080
+ function HTTPSocket(hooks, url) {
2081
+ this.hooks = hooks;
2082
+ this.session = randomNumber(1000) + "/" + randomString(8);
2083
+ this.location = getLocation(url);
2084
+ this.readyState = state_1["default"].CONNECTING;
2085
+ this.openStream();
2086
+ }
2087
+ HTTPSocket.prototype.send = function (payload) {
2088
+ return this.sendRaw(JSON.stringify([payload]));
2089
+ };
2090
+ HTTPSocket.prototype.ping = function () {
2091
+ this.hooks.sendHeartbeat(this);
2092
+ };
2093
+ HTTPSocket.prototype.close = function (code, reason) {
2094
+ this.onClose(code, reason, true);
2095
+ };
2096
+ HTTPSocket.prototype.sendRaw = function (payload) {
2097
+ if (this.readyState === state_1["default"].OPEN) {
2098
+ try {
2099
+ runtime_1["default"].createSocketRequest("POST", getUniqueURL(getSendURL(this.location, this.session))).start(payload);
2100
+ return true;
2101
+ }
2102
+ catch (e) {
2103
+ return false;
2104
+ }
2105
+ }
2106
+ else {
2107
+ return false;
2108
+ }
2109
+ };
2110
+ HTTPSocket.prototype.reconnect = function () {
2111
+ this.closeStream();
2112
+ this.openStream();
2113
+ };
2114
+ ;
2115
+ HTTPSocket.prototype.onClose = function (code, reason, wasClean) {
2116
+ this.closeStream();
2117
+ this.readyState = state_1["default"].CLOSED;
2118
+ if (this.onclose) {
2119
+ this.onclose({
2120
+ code: code,
2121
+ reason: reason,
2122
+ wasClean: wasClean
2123
+ });
2124
+ }
2125
+ };
2126
+ HTTPSocket.prototype.onChunk = function (chunk) {
2127
+ if (chunk.status !== 200) {
2128
+ return;
2129
+ }
2130
+ if (this.readyState === state_1["default"].OPEN) {
2131
+ this.onActivity();
2132
+ }
2133
+ var payload;
2134
+ var type = chunk.data.slice(0, 1);
2135
+ switch (type) {
2136
+ case 'o':
2137
+ payload = JSON.parse(chunk.data.slice(1) || '{}');
2138
+ this.onOpen(payload);
2139
+ break;
2140
+ case 'a':
2141
+ payload = JSON.parse(chunk.data.slice(1) || '[]');
2142
+ for (var i = 0; i < payload.length; i++) {
2143
+ this.onEvent(payload[i]);
2144
+ }
2145
+ break;
2146
+ case 'm':
2147
+ payload = JSON.parse(chunk.data.slice(1) || 'null');
2148
+ this.onEvent(payload);
2149
+ break;
2150
+ case 'h':
2151
+ this.hooks.onHeartbeat(this);
2152
+ break;
2153
+ case 'c':
2154
+ payload = JSON.parse(chunk.data.slice(1) || '[]');
2155
+ this.onClose(payload[0], payload[1], true);
2156
+ break;
2157
+ }
2158
+ };
2159
+ HTTPSocket.prototype.onOpen = function (options) {
2160
+ if (this.readyState === state_1["default"].CONNECTING) {
2161
+ if (options && options.hostname) {
2162
+ this.location.base = replaceHost(this.location.base, options.hostname);
2163
+ }
2164
+ this.readyState = state_1["default"].OPEN;
2165
+ if (this.onopen) {
2166
+ this.onopen();
2167
+ }
2168
+ }
2169
+ else {
2170
+ this.onClose(1006, "Server lost session", true);
2171
+ }
2172
+ };
2173
+ HTTPSocket.prototype.onEvent = function (event) {
2174
+ if (this.readyState === state_1["default"].OPEN && this.onmessage) {
2175
+ this.onmessage({ data: event });
2176
+ }
2177
+ };
2178
+ HTTPSocket.prototype.onActivity = function () {
2179
+ if (this.onactivity) {
2180
+ this.onactivity();
2181
+ }
2182
+ };
2183
+ HTTPSocket.prototype.onError = function (error) {
2184
+ if (this.onerror) {
2185
+ this.onerror(error);
2186
+ }
2187
+ };
2188
+ HTTPSocket.prototype.openStream = function () {
2189
+ var _this = this;
2190
+ this.stream = runtime_1["default"].createSocketRequest("POST", getUniqueURL(this.hooks.getReceiveURL(this.location, this.session)));
2191
+ this.stream.bind("chunk", function (chunk) {
2192
+ _this.onChunk(chunk);
2193
+ });
2194
+ this.stream.bind("finished", function (status) {
2195
+ _this.hooks.onFinished(_this, status);
2196
+ });
2197
+ this.stream.bind("buffer_too_long", function () {
2198
+ _this.reconnect();
2199
+ });
2200
+ try {
2201
+ this.stream.start();
2202
+ }
2203
+ catch (error) {
2204
+ util_1["default"].defer(function () {
2205
+ _this.onError(error);
2206
+ _this.onClose(1006, "Could not start streaming", false);
2207
+ });
2208
+ }
2209
+ };
2210
+ HTTPSocket.prototype.closeStream = function () {
2211
+ if (this.stream) {
2212
+ this.stream.unbind_all();
2213
+ this.stream.close();
2214
+ this.stream = null;
2215
+ }
2216
+ };
2217
+ return HTTPSocket;
2218
+ }());
2219
+ function getLocation(url) {
2220
+ var parts = /([^\?]*)\/*(\??.*)/.exec(url);
2221
+ return {
2222
+ base: parts[1],
2223
+ queryString: parts[2]
2224
+ };
2225
+ }
2226
+ function getSendURL(url, session) {
2227
+ return url.base + "/" + session + "/xhr_send";
2228
+ }
2229
+ function getUniqueURL(url) {
2230
+ var separator = (url.indexOf('?') === -1) ? "?" : "&";
2231
+ return url + separator + "t=" + (+new Date()) + "&n=" + autoIncrement++;
2232
+ }
2233
+ function replaceHost(url, hostname) {
2234
+ var urlParts = /(https?:\/\/)([^\/:]+)((\/|:)?.*)/.exec(url);
2235
+ return urlParts[1] + hostname + urlParts[3];
2236
+ }
2237
+ function randomNumber(max) {
2238
+ return Math.floor(Math.random() * max);
2239
+ }
2240
+ function randomString(length) {
2241
+ var result = [];
2242
+ for (var i = 0; i < length; i++) {
2243
+ result.push(randomNumber(32).toString(32));
2244
+ }
2245
+ return result.join('');
2246
+ }
2247
+ exports.__esModule = true;
2248
+ exports["default"] = HTTPSocket;
2249
+
2250
+
2251
+ /***/ }),
2252
+ /* 35 */
2253
+ /***/ (function(module, exports) {
2254
+
2255
+ "use strict";
2256
+ var State;
2257
+ (function (State) {
2258
+ State[State["CONNECTING"] = 0] = "CONNECTING";
2259
+ State[State["OPEN"] = 1] = "OPEN";
2260
+ State[State["CLOSED"] = 3] = "CLOSED";
2261
+ })(State || (State = {}));
2262
+ exports.__esModule = true;
2263
+ exports["default"] = State;
2264
+
2265
+
2266
+ /***/ }),
2267
+ /* 36 */
2268
+ /***/ (function(module, exports) {
2269
+
2270
+ "use strict";
2271
+ var hooks = {
2272
+ getReceiveURL: function (url, session) {
2273
+ return url.base + "/" + session + "/xhr_streaming" + url.queryString;
2274
+ },
2275
+ onHeartbeat: function (socket) {
2276
+ socket.sendRaw("[]");
2277
+ },
2278
+ sendHeartbeat: function (socket) {
2279
+ socket.sendRaw("[]");
2280
+ },
2281
+ onFinished: function (socket, status) {
2282
+ socket.onClose(1006, "Connection interrupted (" + status + ")", false);
2283
+ }
2284
+ };
2285
+ exports.__esModule = true;
2286
+ exports["default"] = hooks;
2287
+
2288
+
2289
+ /***/ }),
2290
+ /* 37 */
2291
+ /***/ (function(module, exports) {
2292
+
2293
+ "use strict";
2294
+ var hooks = {
2295
+ getReceiveURL: function (url, session) {
2296
+ return url.base + "/" + session + "/xhr" + url.queryString;
2297
+ },
2298
+ onHeartbeat: function () {
2299
+ },
2300
+ sendHeartbeat: function (socket) {
2301
+ socket.sendRaw("[]");
2302
+ },
2303
+ onFinished: function (socket, status) {
2304
+ if (status === 200) {
2305
+ socket.reconnect();
2306
+ }
2307
+ else {
2308
+ socket.onClose(1006, "Connection interrupted (" + status + ")", false);
2309
+ }
2310
+ }
2311
+ };
2312
+ exports.__esModule = true;
2313
+ exports["default"] = hooks;
2314
+
2315
+
2316
+ /***/ }),
2317
+ /* 38 */
2318
+ /***/ (function(module, exports, __webpack_require__) {
2319
+
2320
+ "use strict";
2321
+ var runtime_1 = __webpack_require__(2);
2322
+ var hooks = {
2323
+ getRequest: function (socket) {
2324
+ var Constructor = runtime_1["default"].getXHRAPI();
2325
+ var xhr = new Constructor();
2326
+ xhr.onreadystatechange = xhr.onprogress = function () {
2327
+ switch (xhr.readyState) {
2328
+ case 3:
2329
+ if (xhr.responseText && xhr.responseText.length > 0) {
2330
+ socket.onChunk(xhr.status, xhr.responseText);
2331
+ }
2332
+ break;
2333
+ case 4:
2334
+ if (xhr.responseText && xhr.responseText.length > 0) {
2335
+ socket.onChunk(xhr.status, xhr.responseText);
2336
+ }
2337
+ socket.emit("finished", xhr.status);
2338
+ socket.close();
2339
+ break;
2340
+ }
2341
+ };
2342
+ return xhr;
2343
+ },
2344
+ abortRequest: function (xhr) {
2345
+ xhr.onreadystatechange = null;
2346
+ xhr.abort();
2347
+ }
2348
+ };
2349
+ exports.__esModule = true;
2350
+ exports["default"] = hooks;
2351
+
2352
+
2353
+ /***/ }),
2354
+ /* 39 */
2355
+ /***/ (function(module, exports, __webpack_require__) {
2356
+
2357
+ "use strict";
2358
+ var Collections = __webpack_require__(9);
2359
+ var util_1 = __webpack_require__(11);
2360
+ var level_1 = __webpack_require__(40);
2361
+ var Timeline = (function () {
2362
+ function Timeline(key, session, options) {
2363
+ this.key = key;
2364
+ this.session = session;
2365
+ this.events = [];
2366
+ this.options = options || {};
2367
+ this.sent = 0;
2368
+ this.uniqueID = 0;
2369
+ }
2370
+ Timeline.prototype.log = function (level, event) {
2371
+ if (level <= this.options.level) {
2372
+ this.events.push(Collections.extend({}, event, { timestamp: util_1["default"].now() }));
2373
+ if (this.options.limit && this.events.length > this.options.limit) {
2374
+ this.events.shift();
2375
+ }
2376
+ }
2377
+ };
2378
+ Timeline.prototype.error = function (event) {
2379
+ this.log(level_1["default"].ERROR, event);
2380
+ };
2381
+ Timeline.prototype.info = function (event) {
2382
+ this.log(level_1["default"].INFO, event);
2383
+ };
2384
+ Timeline.prototype.debug = function (event) {
2385
+ this.log(level_1["default"].DEBUG, event);
2386
+ };
2387
+ Timeline.prototype.isEmpty = function () {
2388
+ return this.events.length === 0;
2389
+ };
2390
+ Timeline.prototype.send = function (sendfn, callback) {
2391
+ var _this = this;
2392
+ var data = Collections.extend({
2393
+ session: this.session,
2394
+ bundle: this.sent + 1,
2395
+ key: this.key,
2396
+ lib: "js",
2397
+ version: this.options.version,
2398
+ cluster: this.options.cluster,
2399
+ features: this.options.features,
2400
+ timeline: this.events
2401
+ }, this.options.params);
2402
+ this.events = [];
2403
+ sendfn(data, function (error, result) {
2404
+ if (!error) {
2405
+ _this.sent++;
2406
+ }
2407
+ if (callback) {
2408
+ callback(error, result);
2409
+ }
2410
+ });
2411
+ return true;
2412
+ };
2413
+ Timeline.prototype.generateUniqueID = function () {
2414
+ this.uniqueID++;
2415
+ return this.uniqueID;
2416
+ };
2417
+ return Timeline;
2418
+ }());
2419
+ exports.__esModule = true;
2420
+ exports["default"] = Timeline;
2421
+
2422
+
2423
+ /***/ }),
2424
+ /* 40 */
2425
+ /***/ (function(module, exports) {
2426
+
2427
+ "use strict";
2428
+ var TimelineLevel;
2429
+ (function (TimelineLevel) {
2430
+ TimelineLevel[TimelineLevel["ERROR"] = 3] = "ERROR";
2431
+ TimelineLevel[TimelineLevel["INFO"] = 6] = "INFO";
2432
+ TimelineLevel[TimelineLevel["DEBUG"] = 7] = "DEBUG";
2433
+ })(TimelineLevel || (TimelineLevel = {}));
2434
+ exports.__esModule = true;
2435
+ exports["default"] = TimelineLevel;
2436
+
2437
+
2438
+ /***/ }),
2439
+ /* 41 */
2440
+ /***/ (function(module, exports, __webpack_require__) {
2441
+
2442
+ "use strict";
2443
+ var Collections = __webpack_require__(9);
2444
+ var util_1 = __webpack_require__(11);
2445
+ var transport_manager_1 = __webpack_require__(42);
2446
+ var Errors = __webpack_require__(31);
2447
+ var transport_strategy_1 = __webpack_require__(56);
2448
+ var sequential_strategy_1 = __webpack_require__(57);
2449
+ var best_connected_ever_strategy_1 = __webpack_require__(58);
2450
+ var cached_strategy_1 = __webpack_require__(59);
2451
+ var delayed_strategy_1 = __webpack_require__(60);
2452
+ var if_strategy_1 = __webpack_require__(61);
2453
+ var first_connected_strategy_1 = __webpack_require__(62);
2454
+ var runtime_1 = __webpack_require__(2);
2455
+ var Transports = runtime_1["default"].Transports;
2456
+ exports.build = function (scheme, options) {
2457
+ var context = Collections.extend({}, globalContext, options);
2458
+ return evaluate(scheme, context)[1].strategy;
2459
+ };
2460
+ var UnsupportedStrategy = {
2461
+ isSupported: function () {
2462
+ return false;
2463
+ },
2464
+ connect: function (_, callback) {
2465
+ var deferred = util_1["default"].defer(function () {
2466
+ callback(new Errors.UnsupportedStrategy());
2467
+ });
2468
+ return {
2469
+ abort: function () {
2470
+ deferred.ensureAborted();
2471
+ },
2472
+ forceMinPriority: function () { }
2473
+ };
2474
+ }
2475
+ };
2476
+ function returnWithOriginalContext(f) {
2477
+ return function (context) {
2478
+ return [f.apply(this, arguments), context];
2479
+ };
2480
+ }
2481
+ var globalContext = {
2482
+ extend: function (context, first, second) {
2483
+ return [Collections.extend({}, first, second), context];
2484
+ },
2485
+ def: function (context, name, value) {
2486
+ if (context[name] !== undefined) {
2487
+ throw "Redefining symbol " + name;
2488
+ }
2489
+ context[name] = value;
2490
+ return [undefined, context];
2491
+ },
2492
+ def_transport: function (context, name, type, priority, options, manager) {
2493
+ var transportClass = Transports[type];
2494
+ if (!transportClass) {
2495
+ throw new Errors.UnsupportedTransport(type);
2496
+ }
2497
+ var enabled = (!context.enabledTransports ||
2498
+ Collections.arrayIndexOf(context.enabledTransports, name) !== -1) &&
2499
+ (!context.disabledTransports ||
2500
+ Collections.arrayIndexOf(context.disabledTransports, name) === -1);
2501
+ var transport;
2502
+ if (enabled) {
2503
+ transport = new transport_strategy_1["default"](name, priority, manager ? manager.getAssistant(transportClass) : transportClass, Collections.extend({
2504
+ key: context.key,
2505
+ encrypted: context.encrypted,
2506
+ timeline: context.timeline,
2507
+ ignoreNullOrigin: context.ignoreNullOrigin
2508
+ }, options));
2509
+ }
2510
+ else {
2511
+ transport = UnsupportedStrategy;
2512
+ }
2513
+ var newContext = context.def(context, name, transport)[1];
2514
+ newContext.Transports = context.Transports || {};
2515
+ newContext.Transports[name] = transport;
2516
+ return [undefined, newContext];
2517
+ },
2518
+ transport_manager: returnWithOriginalContext(function (_, options) {
2519
+ return new transport_manager_1["default"](options);
2520
+ }),
2521
+ sequential: returnWithOriginalContext(function (_, options) {
2522
+ var strategies = Array.prototype.slice.call(arguments, 2);
2523
+ return new sequential_strategy_1["default"](strategies, options);
2524
+ }),
2525
+ cached: returnWithOriginalContext(function (context, ttl, strategy) {
2526
+ return new cached_strategy_1["default"](strategy, context.Transports, {
2527
+ ttl: ttl,
2528
+ timeline: context.timeline,
2529
+ encrypted: context.encrypted
2530
+ });
2531
+ }),
2532
+ first_connected: returnWithOriginalContext(function (_, strategy) {
2533
+ return new first_connected_strategy_1["default"](strategy);
2534
+ }),
2535
+ best_connected_ever: returnWithOriginalContext(function () {
2536
+ var strategies = Array.prototype.slice.call(arguments, 1);
2537
+ return new best_connected_ever_strategy_1["default"](strategies);
2538
+ }),
2539
+ delayed: returnWithOriginalContext(function (_, delay, strategy) {
2540
+ return new delayed_strategy_1["default"](strategy, { delay: delay });
2541
+ }),
2542
+ "if": returnWithOriginalContext(function (_, test, trueBranch, falseBranch) {
2543
+ return new if_strategy_1["default"](test, trueBranch, falseBranch);
2544
+ }),
2545
+ is_supported: returnWithOriginalContext(function (_, strategy) {
2546
+ return function () {
2547
+ return strategy.isSupported();
2548
+ };
2549
+ })
2550
+ };
2551
+ function isSymbol(expression) {
2552
+ return (typeof expression === "string") && expression.charAt(0) === ":";
2553
+ }
2554
+ function getSymbolValue(expression, context) {
2555
+ return context[expression.slice(1)];
2556
+ }
2557
+ function evaluateListOfExpressions(expressions, context) {
2558
+ if (expressions.length === 0) {
2559
+ return [[], context];
2560
+ }
2561
+ var head = evaluate(expressions[0], context);
2562
+ var tail = evaluateListOfExpressions(expressions.slice(1), head[1]);
2563
+ return [[head[0]].concat(tail[0]), tail[1]];
2564
+ }
2565
+ function evaluateString(expression, context) {
2566
+ if (!isSymbol(expression)) {
2567
+ return [expression, context];
2568
+ }
2569
+ var value = getSymbolValue(expression, context);
2570
+ if (value === undefined) {
2571
+ throw "Undefined symbol " + expression;
2572
+ }
2573
+ return [value, context];
2574
+ }
2575
+ function evaluateArray(expression, context) {
2576
+ if (isSymbol(expression[0])) {
2577
+ var f = getSymbolValue(expression[0], context);
2578
+ if (expression.length > 1) {
2579
+ if (typeof f !== "function") {
2580
+ throw "Calling non-function " + expression[0];
2581
+ }
2582
+ var args = [Collections.extend({}, context)].concat(Collections.map(expression.slice(1), function (arg) {
2583
+ return evaluate(arg, Collections.extend({}, context))[0];
2584
+ }));
2585
+ return f.apply(this, args);
2586
+ }
2587
+ else {
2588
+ return [f, context];
2589
+ }
2590
+ }
2591
+ else {
2592
+ return evaluateListOfExpressions(expression, context);
2593
+ }
2594
+ }
2595
+ function evaluate(expression, context) {
2596
+ if (typeof expression === "string") {
2597
+ return evaluateString(expression, context);
2598
+ }
2599
+ else if (typeof expression === "object") {
2600
+ if (expression instanceof Array && expression.length > 0) {
2601
+ return evaluateArray(expression, context);
2602
+ }
2603
+ }
2604
+ return [expression, context];
2605
+ }
2606
+
2607
+
2608
+ /***/ }),
2609
+ /* 42 */
2610
+ /***/ (function(module, exports, __webpack_require__) {
2611
+
2612
+ "use strict";
2613
+ var factory_1 = __webpack_require__(43);
2614
+ var TransportManager = (function () {
2615
+ function TransportManager(options) {
2616
+ this.options = options || {};
2617
+ this.livesLeft = this.options.lives || Infinity;
2618
+ }
2619
+ TransportManager.prototype.getAssistant = function (transport) {
2620
+ return factory_1["default"].createAssistantToTheTransportManager(this, transport, {
2621
+ minPingDelay: this.options.minPingDelay,
2622
+ maxPingDelay: this.options.maxPingDelay
2623
+ });
2624
+ };
2625
+ TransportManager.prototype.isAlive = function () {
2626
+ return this.livesLeft > 0;
2627
+ };
2628
+ TransportManager.prototype.reportDeath = function () {
2629
+ this.livesLeft -= 1;
2630
+ };
2631
+ return TransportManager;
2632
+ }());
2633
+ exports.__esModule = true;
2634
+ exports["default"] = TransportManager;
2635
+
2636
+
2637
+ /***/ }),
2638
+ /* 43 */
2639
+ /***/ (function(module, exports, __webpack_require__) {
2640
+
2641
+ "use strict";
2642
+ var assistant_to_the_transport_manager_1 = __webpack_require__(44);
2643
+ var handshake_1 = __webpack_require__(45);
2644
+ var pusher_authorizer_1 = __webpack_require__(48);
2645
+ var timeline_sender_1 = __webpack_require__(49);
2646
+ var presence_channel_1 = __webpack_require__(50);
2647
+ var private_channel_1 = __webpack_require__(51);
2648
+ var channel_1 = __webpack_require__(52);
2649
+ var connection_manager_1 = __webpack_require__(54);
2650
+ var channels_1 = __webpack_require__(55);
2651
+ var Factory = {
2652
+ createChannels: function () {
2653
+ return new channels_1["default"]();
2654
+ },
2655
+ createConnectionManager: function (key, options) {
2656
+ return new connection_manager_1["default"](key, options);
2657
+ },
2658
+ createChannel: function (name, pusher) {
2659
+ return new channel_1["default"](name, pusher);
2660
+ },
2661
+ createPrivateChannel: function (name, pusher) {
2662
+ return new private_channel_1["default"](name, pusher);
2663
+ },
2664
+ createPresenceChannel: function (name, pusher) {
2665
+ return new presence_channel_1["default"](name, pusher);
2666
+ },
2667
+ createTimelineSender: function (timeline, options) {
2668
+ return new timeline_sender_1["default"](timeline, options);
2669
+ },
2670
+ createAuthorizer: function (channel, options) {
2671
+ if (options.authorizer) {
2672
+ return options.authorizer(channel, options);
2673
+ }
2674
+ return new pusher_authorizer_1["default"](channel, options);
2675
+ },
2676
+ createHandshake: function (transport, callback) {
2677
+ return new handshake_1["default"](transport, callback);
2678
+ },
2679
+ createAssistantToTheTransportManager: function (manager, transport, options) {
2680
+ return new assistant_to_the_transport_manager_1["default"](manager, transport, options);
2681
+ }
2682
+ };
2683
+ exports.__esModule = true;
2684
+ exports["default"] = Factory;
2685
+
2686
+
2687
+ /***/ }),
2688
+ /* 44 */
2689
+ /***/ (function(module, exports, __webpack_require__) {
2690
+
2691
+ "use strict";
2692
+ var util_1 = __webpack_require__(11);
2693
+ var Collections = __webpack_require__(9);
2694
+ var AssistantToTheTransportManager = (function () {
2695
+ function AssistantToTheTransportManager(manager, transport, options) {
2696
+ this.manager = manager;
2697
+ this.transport = transport;
2698
+ this.minPingDelay = options.minPingDelay;
2699
+ this.maxPingDelay = options.maxPingDelay;
2700
+ this.pingDelay = undefined;
2701
+ }
2702
+ AssistantToTheTransportManager.prototype.createConnection = function (name, priority, key, options) {
2703
+ var _this = this;
2704
+ options = Collections.extend({}, options, {
2705
+ activityTimeout: this.pingDelay
2706
+ });
2707
+ var connection = this.transport.createConnection(name, priority, key, options);
2708
+ var openTimestamp = null;
2709
+ var onOpen = function () {
2710
+ connection.unbind("open", onOpen);
2711
+ connection.bind("closed", onClosed);
2712
+ openTimestamp = util_1["default"].now();
2713
+ };
2714
+ var onClosed = function (closeEvent) {
2715
+ connection.unbind("closed", onClosed);
2716
+ if (closeEvent.code === 1002 || closeEvent.code === 1003) {
2717
+ _this.manager.reportDeath();
2718
+ }
2719
+ else if (!closeEvent.wasClean && openTimestamp) {
2720
+ var lifespan = util_1["default"].now() - openTimestamp;
2721
+ if (lifespan < 2 * _this.maxPingDelay) {
2722
+ _this.manager.reportDeath();
2723
+ _this.pingDelay = Math.max(lifespan / 2, _this.minPingDelay);
2724
+ }
2725
+ }
2726
+ };
2727
+ connection.bind("open", onOpen);
2728
+ return connection;
2729
+ };
2730
+ AssistantToTheTransportManager.prototype.isSupported = function (environment) {
2731
+ return this.manager.isAlive() && this.transport.isSupported(environment);
2732
+ };
2733
+ return AssistantToTheTransportManager;
2734
+ }());
2735
+ exports.__esModule = true;
2736
+ exports["default"] = AssistantToTheTransportManager;
2737
+
2738
+
2739
+ /***/ }),
2740
+ /* 45 */
2741
+ /***/ (function(module, exports, __webpack_require__) {
2742
+
2743
+ "use strict";
2744
+ var Collections = __webpack_require__(9);
2745
+ var Protocol = __webpack_require__(46);
2746
+ var connection_1 = __webpack_require__(47);
2747
+ var Handshake = (function () {
2748
+ function Handshake(transport, callback) {
2749
+ this.transport = transport;
2750
+ this.callback = callback;
2751
+ this.bindListeners();
2752
+ }
2753
+ Handshake.prototype.close = function () {
2754
+ this.unbindListeners();
2755
+ this.transport.close();
2756
+ };
2757
+ Handshake.prototype.bindListeners = function () {
2758
+ var _this = this;
2759
+ this.onMessage = function (m) {
2760
+ _this.unbindListeners();
2761
+ var result;
2762
+ try {
2763
+ result = Protocol.processHandshake(m);
2764
+ }
2765
+ catch (e) {
2766
+ _this.finish("error", { error: e });
2767
+ _this.transport.close();
2768
+ return;
2769
+ }
2770
+ if (result.action === "connected") {
2771
+ _this.finish("connected", {
2772
+ connection: new connection_1["default"](result.id, _this.transport),
2773
+ activityTimeout: result.activityTimeout
2774
+ });
2775
+ }
2776
+ else {
2777
+ _this.finish(result.action, { error: result.error });
2778
+ _this.transport.close();
2779
+ }
2780
+ };
2781
+ this.onClosed = function (closeEvent) {
2782
+ _this.unbindListeners();
2783
+ var action = Protocol.getCloseAction(closeEvent) || "backoff";
2784
+ var error = Protocol.getCloseError(closeEvent);
2785
+ _this.finish(action, { error: error });
2786
+ };
2787
+ this.transport.bind("message", this.onMessage);
2788
+ this.transport.bind("closed", this.onClosed);
2789
+ };
2790
+ Handshake.prototype.unbindListeners = function () {
2791
+ this.transport.unbind("message", this.onMessage);
2792
+ this.transport.unbind("closed", this.onClosed);
2793
+ };
2794
+ Handshake.prototype.finish = function (action, params) {
2795
+ this.callback(Collections.extend({ transport: this.transport, action: action }, params));
2796
+ };
2797
+ return Handshake;
2798
+ }());
2799
+ exports.__esModule = true;
2800
+ exports["default"] = Handshake;
2801
+
2802
+
2803
+ /***/ }),
2804
+ /* 46 */
2805
+ /***/ (function(module, exports) {
2806
+
2807
+ "use strict";
2808
+ exports.decodeMessage = function (message) {
2809
+ try {
2810
+ var params = JSON.parse(message.data);
2811
+ if (typeof params.data === 'string') {
2812
+ try {
2813
+ params.data = JSON.parse(params.data);
2814
+ }
2815
+ catch (e) {
2816
+ if (!(e instanceof SyntaxError)) {
2817
+ throw e;
2818
+ }
2819
+ }
2820
+ }
2821
+ return params;
2822
+ }
2823
+ catch (e) {
2824
+ throw { type: 'MessageParseError', error: e, data: message.data };
2825
+ }
2826
+ };
2827
+ exports.encodeMessage = function (message) {
2828
+ return JSON.stringify(message);
2829
+ };
2830
+ exports.processHandshake = function (message) {
2831
+ message = exports.decodeMessage(message);
2832
+ if (message.event === "pusher:connection_established") {
2833
+ if (!message.data.activity_timeout) {
2834
+ throw "No activity timeout specified in handshake";
2835
+ }
2836
+ return {
2837
+ action: "connected",
2838
+ id: message.data.socket_id,
2839
+ activityTimeout: message.data.activity_timeout * 1000
2840
+ };
2841
+ }
2842
+ else if (message.event === "pusher:error") {
2843
+ return {
2844
+ action: this.getCloseAction(message.data),
2845
+ error: this.getCloseError(message.data)
2846
+ };
2847
+ }
2848
+ else {
2849
+ throw "Invalid handshake";
2850
+ }
2851
+ };
2852
+ exports.getCloseAction = function (closeEvent) {
2853
+ if (closeEvent.code < 4000) {
2854
+ if (closeEvent.code >= 1002 && closeEvent.code <= 1004) {
2855
+ return "backoff";
2856
+ }
2857
+ else {
2858
+ return null;
2859
+ }
2860
+ }
2861
+ else if (closeEvent.code === 4000) {
2862
+ return "ssl_only";
2863
+ }
2864
+ else if (closeEvent.code < 4100) {
2865
+ return "refused";
2866
+ }
2867
+ else if (closeEvent.code < 4200) {
2868
+ return "backoff";
2869
+ }
2870
+ else if (closeEvent.code < 4300) {
2871
+ return "retry";
2872
+ }
2873
+ else {
2874
+ return "refused";
2875
+ }
2876
+ };
2877
+ exports.getCloseError = function (closeEvent) {
2878
+ if (closeEvent.code !== 1000 && closeEvent.code !== 1001) {
2879
+ return {
2880
+ type: 'PusherError',
2881
+ data: {
2882
+ code: closeEvent.code,
2883
+ message: closeEvent.reason || closeEvent.message
2884
+ }
2885
+ };
2886
+ }
2887
+ else {
2888
+ return null;
2889
+ }
2890
+ };
2891
+
2892
+
2893
+ /***/ }),
2894
+ /* 47 */
2895
+ /***/ (function(module, exports, __webpack_require__) {
2896
+
2897
+ "use strict";
2898
+ var __extends = (this && this.__extends) || function (d, b) {
2899
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
2900
+ function __() { this.constructor = d; }
2901
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
2902
+ };
2903
+ var Collections = __webpack_require__(9);
2904
+ var dispatcher_1 = __webpack_require__(24);
2905
+ var Protocol = __webpack_require__(46);
2906
+ var logger_1 = __webpack_require__(8);
2907
+ var Connection = (function (_super) {
2908
+ __extends(Connection, _super);
2909
+ function Connection(id, transport) {
2910
+ _super.call(this);
2911
+ this.id = id;
2912
+ this.transport = transport;
2913
+ this.activityTimeout = transport.activityTimeout;
2914
+ this.bindListeners();
2915
+ }
2916
+ Connection.prototype.handlesActivityChecks = function () {
2917
+ return this.transport.handlesActivityChecks();
2918
+ };
2919
+ Connection.prototype.send = function (data) {
2920
+ return this.transport.send(data);
2921
+ };
2922
+ Connection.prototype.send_event = function (name, data, channel) {
2923
+ var message = { event: name, data: data };
2924
+ if (channel) {
2925
+ message.channel = channel;
2926
+ }
2927
+ logger_1["default"].debug('Event sent', message);
2928
+ return this.send(Protocol.encodeMessage(message));
2929
+ };
2930
+ Connection.prototype.ping = function () {
2931
+ if (this.transport.supportsPing()) {
2932
+ this.transport.ping();
2933
+ }
2934
+ else {
2935
+ this.send_event('pusher:ping', {});
2936
+ }
2937
+ };
2938
+ Connection.prototype.close = function () {
2939
+ this.transport.close();
2940
+ };
2941
+ Connection.prototype.bindListeners = function () {
2942
+ var _this = this;
2943
+ var listeners = {
2944
+ message: function (m) {
2945
+ var message;
2946
+ try {
2947
+ message = Protocol.decodeMessage(m);
2948
+ }
2949
+ catch (e) {
2950
+ _this.emit('error', {
2951
+ type: 'MessageParseError',
2952
+ error: e,
2953
+ data: m.data
2954
+ });
2955
+ }
2956
+ if (message !== undefined) {
2957
+ logger_1["default"].debug('Event recd', message);
2958
+ switch (message.event) {
2959
+ case 'pusher:error':
2960
+ _this.emit('error', { type: 'PusherError', data: message.data });
2961
+ break;
2962
+ case 'pusher:ping':
2963
+ _this.emit("ping");
2964
+ break;
2965
+ case 'pusher:pong':
2966
+ _this.emit("pong");
2967
+ break;
2968
+ }
2969
+ _this.emit('message', message);
2970
+ }
2971
+ },
2972
+ activity: function () {
2973
+ _this.emit("activity");
2974
+ },
2975
+ error: function (error) {
2976
+ _this.emit("error", { type: "WebSocketError", error: error });
2977
+ },
2978
+ closed: function (closeEvent) {
2979
+ unbindListeners();
2980
+ if (closeEvent && closeEvent.code) {
2981
+ _this.handleCloseEvent(closeEvent);
2982
+ }
2983
+ _this.transport = null;
2984
+ _this.emit("closed");
2985
+ }
2986
+ };
2987
+ var unbindListeners = function () {
2988
+ Collections.objectApply(listeners, function (listener, event) {
2989
+ _this.transport.unbind(event, listener);
2990
+ });
2991
+ };
2992
+ Collections.objectApply(listeners, function (listener, event) {
2993
+ _this.transport.bind(event, listener);
2994
+ });
2995
+ };
2996
+ Connection.prototype.handleCloseEvent = function (closeEvent) {
2997
+ var action = Protocol.getCloseAction(closeEvent);
2998
+ var error = Protocol.getCloseError(closeEvent);
2999
+ if (error) {
3000
+ this.emit('error', error);
3001
+ }
3002
+ if (action) {
3003
+ this.emit(action);
3004
+ }
3005
+ };
3006
+ return Connection;
3007
+ }(dispatcher_1["default"]));
3008
+ exports.__esModule = true;
3009
+ exports["default"] = Connection;
3010
+
3011
+
3012
+ /***/ }),
3013
+ /* 48 */
3014
+ /***/ (function(module, exports, __webpack_require__) {
3015
+
3016
+ "use strict";
3017
+ var runtime_1 = __webpack_require__(2);
3018
+ var PusherAuthorizer = (function () {
3019
+ function PusherAuthorizer(channel, options) {
3020
+ this.channel = channel;
3021
+ var authTransport = options.authTransport;
3022
+ if (typeof runtime_1["default"].getAuthorizers()[authTransport] === "undefined") {
3023
+ throw "'" + authTransport + "' is not a recognized auth transport";
3024
+ }
3025
+ this.type = authTransport;
3026
+ this.options = options;
3027
+ this.authOptions = (options || {}).auth || {};
3028
+ }
3029
+ PusherAuthorizer.prototype.composeQuery = function (socketId) {
3030
+ var query = 'socket_id=' + encodeURIComponent(socketId) +
3031
+ '&channel_name=' + encodeURIComponent(this.channel.name);
3032
+ for (var i in this.authOptions.params) {
3033
+ query += "&" + encodeURIComponent(i) + "=" + encodeURIComponent(this.authOptions.params[i]);
3034
+ }
3035
+ return query;
3036
+ };
3037
+ PusherAuthorizer.prototype.authorize = function (socketId, callback) {
3038
+ PusherAuthorizer.authorizers = PusherAuthorizer.authorizers || runtime_1["default"].getAuthorizers();
3039
+ return PusherAuthorizer.authorizers[this.type].call(this, runtime_1["default"], socketId, callback);
3040
+ };
3041
+ return PusherAuthorizer;
3042
+ }());
3043
+ exports.__esModule = true;
3044
+ exports["default"] = PusherAuthorizer;
3045
+
3046
+
3047
+ /***/ }),
3048
+ /* 49 */
3049
+ /***/ (function(module, exports, __webpack_require__) {
3050
+
3051
+ "use strict";
3052
+ var runtime_1 = __webpack_require__(2);
3053
+ var TimelineSender = (function () {
3054
+ function TimelineSender(timeline, options) {
3055
+ this.timeline = timeline;
3056
+ this.options = options || {};
3057
+ }
3058
+ TimelineSender.prototype.send = function (encrypted, callback) {
3059
+ if (this.timeline.isEmpty()) {
3060
+ return;
3061
+ }
3062
+ this.timeline.send(runtime_1["default"].TimelineTransport.getAgent(this, encrypted), callback);
3063
+ };
3064
+ return TimelineSender;
3065
+ }());
3066
+ exports.__esModule = true;
3067
+ exports["default"] = TimelineSender;
3068
+
3069
+
3070
+ /***/ }),
3071
+ /* 50 */
3072
+ /***/ (function(module, exports, __webpack_require__) {
3073
+
3074
+ "use strict";
3075
+ var __extends = (this && this.__extends) || function (d, b) {
3076
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
3077
+ function __() { this.constructor = d; }
3078
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
3079
+ };
3080
+ var private_channel_1 = __webpack_require__(51);
3081
+ var logger_1 = __webpack_require__(8);
3082
+ var members_1 = __webpack_require__(53);
3083
+ var url_store_1 = __webpack_require__(14);
3084
+ var PresenceChannel = (function (_super) {
3085
+ __extends(PresenceChannel, _super);
3086
+ function PresenceChannel(name, pusher) {
3087
+ _super.call(this, name, pusher);
3088
+ this.members = new members_1["default"]();
3089
+ }
3090
+ PresenceChannel.prototype.authorize = function (socketId, callback) {
3091
+ var _this = this;
3092
+ _super.prototype.authorize.call(this, socketId, function (error, authData) {
3093
+ if (!error) {
3094
+ if (authData.channel_data === undefined) {
3095
+ var suffix = url_store_1["default"].buildLogSuffix("authenticationEndpoint");
3096
+ logger_1["default"].warn(("Invalid auth response for channel '" + _this.name + "',") +
3097
+ ("expected 'channel_data' field. " + suffix));
3098
+ callback("Invalid auth response");
3099
+ return;
3100
+ }
3101
+ var channelData = JSON.parse(authData.channel_data);
3102
+ _this.members.setMyID(channelData.user_id);
3103
+ }
3104
+ callback(error, authData);
3105
+ });
3106
+ };
3107
+ PresenceChannel.prototype.handleEvent = function (event, data) {
3108
+ switch (event) {
3109
+ case "pusher_internal:subscription_succeeded":
3110
+ this.subscriptionPending = false;
3111
+ this.subscribed = true;
3112
+ if (this.subscriptionCancelled) {
3113
+ this.pusher.unsubscribe(this.name);
3114
+ }
3115
+ else {
3116
+ this.members.onSubscription(data);
3117
+ this.emit("pusher:subscription_succeeded", this.members);
3118
+ }
3119
+ break;
3120
+ case "pusher_internal:member_added":
3121
+ var addedMember = this.members.addMember(data);
3122
+ this.emit('pusher:member_added', addedMember);
3123
+ break;
3124
+ case "pusher_internal:member_removed":
3125
+ var removedMember = this.members.removeMember(data);
3126
+ if (removedMember) {
3127
+ this.emit('pusher:member_removed', removedMember);
3128
+ }
3129
+ break;
3130
+ default:
3131
+ private_channel_1["default"].prototype.handleEvent.call(this, event, data);
3132
+ }
3133
+ };
3134
+ PresenceChannel.prototype.disconnect = function () {
3135
+ this.members.reset();
3136
+ _super.prototype.disconnect.call(this);
3137
+ };
3138
+ return PresenceChannel;
3139
+ }(private_channel_1["default"]));
3140
+ exports.__esModule = true;
3141
+ exports["default"] = PresenceChannel;
3142
+
3143
+
3144
+ /***/ }),
3145
+ /* 51 */
3146
+ /***/ (function(module, exports, __webpack_require__) {
3147
+
3148
+ "use strict";
3149
+ var __extends = (this && this.__extends) || function (d, b) {
3150
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
3151
+ function __() { this.constructor = d; }
3152
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
3153
+ };
3154
+ var factory_1 = __webpack_require__(43);
3155
+ var channel_1 = __webpack_require__(52);
3156
+ var PrivateChannel = (function (_super) {
3157
+ __extends(PrivateChannel, _super);
3158
+ function PrivateChannel() {
3159
+ _super.apply(this, arguments);
3160
+ }
3161
+ PrivateChannel.prototype.authorize = function (socketId, callback) {
3162
+ var authorizer = factory_1["default"].createAuthorizer(this, this.pusher.config);
3163
+ return authorizer.authorize(socketId, callback);
3164
+ };
3165
+ return PrivateChannel;
3166
+ }(channel_1["default"]));
3167
+ exports.__esModule = true;
3168
+ exports["default"] = PrivateChannel;
3169
+
3170
+
3171
+ /***/ }),
3172
+ /* 52 */
3173
+ /***/ (function(module, exports, __webpack_require__) {
3174
+
3175
+ "use strict";
3176
+ var __extends = (this && this.__extends) || function (d, b) {
3177
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
3178
+ function __() { this.constructor = d; }
3179
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
3180
+ };
3181
+ var dispatcher_1 = __webpack_require__(24);
3182
+ var Errors = __webpack_require__(31);
3183
+ var logger_1 = __webpack_require__(8);
3184
+ var Channel = (function (_super) {
3185
+ __extends(Channel, _super);
3186
+ function Channel(name, pusher) {
3187
+ _super.call(this, function (event, data) {
3188
+ logger_1["default"].debug('No callbacks on ' + name + ' for ' + event);
3189
+ });
3190
+ this.name = name;
3191
+ this.pusher = pusher;
3192
+ this.subscribed = false;
3193
+ this.subscriptionPending = false;
3194
+ this.subscriptionCancelled = false;
3195
+ }
3196
+ Channel.prototype.authorize = function (socketId, callback) {
3197
+ return callback(false, {});
3198
+ };
3199
+ Channel.prototype.trigger = function (event, data) {
3200
+ if (event.indexOf("client-") !== 0) {
3201
+ throw new Errors.BadEventName("Event '" + event + "' does not start with 'client-'");
3202
+ }
3203
+ return this.pusher.send_event(event, data, this.name);
3204
+ };
3205
+ Channel.prototype.disconnect = function () {
3206
+ this.subscribed = false;
3207
+ this.subscriptionPending = false;
3208
+ };
3209
+ Channel.prototype.handleEvent = function (event, data) {
3210
+ if (event.indexOf("pusher_internal:") === 0) {
3211
+ if (event === "pusher_internal:subscription_succeeded") {
3212
+ this.subscriptionPending = false;
3213
+ this.subscribed = true;
3214
+ if (this.subscriptionCancelled) {
3215
+ this.pusher.unsubscribe(this.name);
3216
+ }
3217
+ else {
3218
+ this.emit("pusher:subscription_succeeded", data);
3219
+ }
3220
+ }
3221
+ }
3222
+ else {
3223
+ this.emit(event, data);
3224
+ }
3225
+ };
3226
+ Channel.prototype.subscribe = function () {
3227
+ var _this = this;
3228
+ if (this.subscribed) {
3229
+ return;
3230
+ }
3231
+ this.subscriptionPending = true;
3232
+ this.subscriptionCancelled = false;
3233
+ this.authorize(this.pusher.connection.socket_id, function (error, data) {
3234
+ if (error) {
3235
+ _this.handleEvent('pusher:subscription_error', data);
3236
+ }
3237
+ else {
3238
+ _this.pusher.send_event('pusher:subscribe', {
3239
+ auth: data.auth,
3240
+ channel_data: data.channel_data,
3241
+ channel: _this.name
3242
+ });
3243
+ }
3244
+ });
3245
+ };
3246
+ Channel.prototype.unsubscribe = function () {
3247
+ this.subscribed = false;
3248
+ this.pusher.send_event('pusher:unsubscribe', {
3249
+ channel: this.name
3250
+ });
3251
+ };
3252
+ Channel.prototype.cancelSubscription = function () {
3253
+ this.subscriptionCancelled = true;
3254
+ };
3255
+ Channel.prototype.reinstateSubscription = function () {
3256
+ this.subscriptionCancelled = false;
3257
+ };
3258
+ return Channel;
3259
+ }(dispatcher_1["default"]));
3260
+ exports.__esModule = true;
3261
+ exports["default"] = Channel;
3262
+
3263
+
3264
+ /***/ }),
3265
+ /* 53 */
3266
+ /***/ (function(module, exports, __webpack_require__) {
3267
+
3268
+ "use strict";
3269
+ var Collections = __webpack_require__(9);
3270
+ var Members = (function () {
3271
+ function Members() {
3272
+ this.reset();
3273
+ }
3274
+ Members.prototype.get = function (id) {
3275
+ if (Object.prototype.hasOwnProperty.call(this.members, id)) {
3276
+ return {
3277
+ id: id,
3278
+ info: this.members[id]
3279
+ };
3280
+ }
3281
+ else {
3282
+ return null;
3283
+ }
3284
+ };
3285
+ Members.prototype.each = function (callback) {
3286
+ var _this = this;
3287
+ Collections.objectApply(this.members, function (member, id) {
3288
+ callback(_this.get(id));
3289
+ });
3290
+ };
3291
+ Members.prototype.setMyID = function (id) {
3292
+ this.myID = id;
3293
+ };
3294
+ Members.prototype.onSubscription = function (subscriptionData) {
3295
+ this.members = subscriptionData.presence.hash;
3296
+ this.count = subscriptionData.presence.count;
3297
+ this.me = this.get(this.myID);
3298
+ };
3299
+ Members.prototype.addMember = function (memberData) {
3300
+ if (this.get(memberData.user_id) === null) {
3301
+ this.count++;
3302
+ }
3303
+ this.members[memberData.user_id] = memberData.user_info;
3304
+ return this.get(memberData.user_id);
3305
+ };
3306
+ Members.prototype.removeMember = function (memberData) {
3307
+ var member = this.get(memberData.user_id);
3308
+ if (member) {
3309
+ delete this.members[memberData.user_id];
3310
+ this.count--;
3311
+ }
3312
+ return member;
3313
+ };
3314
+ Members.prototype.reset = function () {
3315
+ this.members = {};
3316
+ this.count = 0;
3317
+ this.myID = null;
3318
+ this.me = null;
3319
+ };
3320
+ return Members;
3321
+ }());
3322
+ exports.__esModule = true;
3323
+ exports["default"] = Members;
3324
+
3325
+
3326
+ /***/ }),
3327
+ /* 54 */
3328
+ /***/ (function(module, exports, __webpack_require__) {
3329
+
3330
+ "use strict";
3331
+ var __extends = (this && this.__extends) || function (d, b) {
3332
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
3333
+ function __() { this.constructor = d; }
3334
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
3335
+ };
3336
+ var dispatcher_1 = __webpack_require__(24);
3337
+ var timers_1 = __webpack_require__(12);
3338
+ var logger_1 = __webpack_require__(8);
3339
+ var Collections = __webpack_require__(9);
3340
+ var runtime_1 = __webpack_require__(2);
3341
+ var ConnectionManager = (function (_super) {
3342
+ __extends(ConnectionManager, _super);
3343
+ function ConnectionManager(key, options) {
3344
+ var _this = this;
3345
+ _super.call(this);
3346
+ this.key = key;
3347
+ this.options = options || {};
3348
+ this.state = "initialized";
3349
+ this.connection = null;
3350
+ this.encrypted = !!options.encrypted;
3351
+ this.timeline = this.options.timeline;
3352
+ this.connectionCallbacks = this.buildConnectionCallbacks();
3353
+ this.errorCallbacks = this.buildErrorCallbacks();
3354
+ this.handshakeCallbacks = this.buildHandshakeCallbacks(this.errorCallbacks);
3355
+ var Network = runtime_1["default"].getNetwork();
3356
+ Network.bind("online", function () {
3357
+ _this.timeline.info({ netinfo: "online" });
3358
+ if (_this.state === "connecting" || _this.state === "unavailable") {
3359
+ _this.retryIn(0);
3360
+ }
3361
+ });
3362
+ Network.bind("offline", function () {
3363
+ _this.timeline.info({ netinfo: "offline" });
3364
+ if (_this.connection) {
3365
+ _this.sendActivityCheck();
3366
+ }
3367
+ });
3368
+ this.updateStrategy();
3369
+ }
3370
+ ConnectionManager.prototype.connect = function () {
3371
+ if (this.connection || this.runner) {
3372
+ return;
3373
+ }
3374
+ if (!this.strategy.isSupported()) {
3375
+ this.updateState("failed");
3376
+ return;
3377
+ }
3378
+ this.updateState("connecting");
3379
+ this.startConnecting();
3380
+ this.setUnavailableTimer();
3381
+ };
3382
+ ;
3383
+ ConnectionManager.prototype.send = function (data) {
3384
+ if (this.connection) {
3385
+ return this.connection.send(data);
3386
+ }
3387
+ else {
3388
+ return false;
3389
+ }
3390
+ };
3391
+ ;
3392
+ ConnectionManager.prototype.send_event = function (name, data, channel) {
3393
+ if (this.connection) {
3394
+ return this.connection.send_event(name, data, channel);
3395
+ }
3396
+ else {
3397
+ return false;
3398
+ }
3399
+ };
3400
+ ;
3401
+ ConnectionManager.prototype.disconnect = function () {
3402
+ this.disconnectInternally();
3403
+ this.updateState("disconnected");
3404
+ };
3405
+ ;
3406
+ ConnectionManager.prototype.isEncrypted = function () {
3407
+ return this.encrypted;
3408
+ };
3409
+ ;
3410
+ ConnectionManager.prototype.startConnecting = function () {
3411
+ var _this = this;
3412
+ var callback = function (error, handshake) {
3413
+ if (error) {
3414
+ _this.runner = _this.strategy.connect(0, callback);
3415
+ }
3416
+ else {
3417
+ if (handshake.action === "error") {
3418
+ _this.emit("error", { type: "HandshakeError", error: handshake.error });
3419
+ _this.timeline.error({ handshakeError: handshake.error });
3420
+ }
3421
+ else {
3422
+ _this.abortConnecting();
3423
+ _this.handshakeCallbacks[handshake.action](handshake);
3424
+ }
3425
+ }
3426
+ };
3427
+ this.runner = this.strategy.connect(0, callback);
3428
+ };
3429
+ ;
3430
+ ConnectionManager.prototype.abortConnecting = function () {
3431
+ if (this.runner) {
3432
+ this.runner.abort();
3433
+ this.runner = null;
3434
+ }
3435
+ };
3436
+ ;
3437
+ ConnectionManager.prototype.disconnectInternally = function () {
3438
+ this.abortConnecting();
3439
+ this.clearRetryTimer();
3440
+ this.clearUnavailableTimer();
3441
+ if (this.connection) {
3442
+ var connection = this.abandonConnection();
3443
+ connection.close();
3444
+ }
3445
+ };
3446
+ ;
3447
+ ConnectionManager.prototype.updateStrategy = function () {
3448
+ this.strategy = this.options.getStrategy({
3449
+ key: this.key,
3450
+ timeline: this.timeline,
3451
+ encrypted: this.encrypted
3452
+ });
3453
+ };
3454
+ ;
3455
+ ConnectionManager.prototype.retryIn = function (delay) {
3456
+ var _this = this;
3457
+ this.timeline.info({ action: "retry", delay: delay });
3458
+ if (delay > 0) {
3459
+ this.emit("connecting_in", Math.round(delay / 1000));
3460
+ }
3461
+ this.retryTimer = new timers_1.OneOffTimer(delay || 0, function () {
3462
+ _this.disconnectInternally();
3463
+ _this.connect();
3464
+ });
3465
+ };
3466
+ ;
3467
+ ConnectionManager.prototype.clearRetryTimer = function () {
3468
+ if (this.retryTimer) {
3469
+ this.retryTimer.ensureAborted();
3470
+ this.retryTimer = null;
3471
+ }
3472
+ };
3473
+ ;
3474
+ ConnectionManager.prototype.setUnavailableTimer = function () {
3475
+ var _this = this;
3476
+ this.unavailableTimer = new timers_1.OneOffTimer(this.options.unavailableTimeout, function () {
3477
+ _this.updateState("unavailable");
3478
+ });
3479
+ };
3480
+ ;
3481
+ ConnectionManager.prototype.clearUnavailableTimer = function () {
3482
+ if (this.unavailableTimer) {
3483
+ this.unavailableTimer.ensureAborted();
3484
+ }
3485
+ };
3486
+ ;
3487
+ ConnectionManager.prototype.sendActivityCheck = function () {
3488
+ var _this = this;
3489
+ this.stopActivityCheck();
3490
+ this.connection.ping();
3491
+ this.activityTimer = new timers_1.OneOffTimer(this.options.pongTimeout, function () {
3492
+ _this.timeline.error({ pong_timed_out: _this.options.pongTimeout });
3493
+ _this.retryIn(0);
3494
+ });
3495
+ };
3496
+ ;
3497
+ ConnectionManager.prototype.resetActivityCheck = function () {
3498
+ var _this = this;
3499
+ this.stopActivityCheck();
3500
+ if (this.connection && !this.connection.handlesActivityChecks()) {
3501
+ this.activityTimer = new timers_1.OneOffTimer(this.activityTimeout, function () {
3502
+ _this.sendActivityCheck();
3503
+ });
3504
+ }
3505
+ };
3506
+ ;
3507
+ ConnectionManager.prototype.stopActivityCheck = function () {
3508
+ if (this.activityTimer) {
3509
+ this.activityTimer.ensureAborted();
3510
+ }
3511
+ };
3512
+ ;
3513
+ ConnectionManager.prototype.buildConnectionCallbacks = function () {
3514
+ var _this = this;
3515
+ return {
3516
+ message: function (message) {
3517
+ _this.resetActivityCheck();
3518
+ _this.emit('message', message);
3519
+ },
3520
+ ping: function () {
3521
+ _this.send_event('pusher:pong', {});
3522
+ },
3523
+ activity: function () {
3524
+ _this.resetActivityCheck();
3525
+ },
3526
+ error: function (error) {
3527
+ _this.emit("error", { type: "WebSocketError", error: error });
3528
+ },
3529
+ closed: function () {
3530
+ _this.abandonConnection();
3531
+ if (_this.shouldRetry()) {
3532
+ _this.retryIn(1000);
3533
+ }
3534
+ }
3535
+ };
3536
+ };
3537
+ ;
3538
+ ConnectionManager.prototype.buildHandshakeCallbacks = function (errorCallbacks) {
3539
+ var _this = this;
3540
+ return Collections.extend({}, errorCallbacks, {
3541
+ connected: function (handshake) {
3542
+ _this.activityTimeout = Math.min(_this.options.activityTimeout, handshake.activityTimeout, handshake.connection.activityTimeout || Infinity);
3543
+ _this.clearUnavailableTimer();
3544
+ _this.setConnection(handshake.connection);
3545
+ _this.socket_id = _this.connection.id;
3546
+ _this.updateState("connected", { socket_id: _this.socket_id });
3547
+ }
3548
+ });
3549
+ };
3550
+ ;
3551
+ ConnectionManager.prototype.buildErrorCallbacks = function () {
3552
+ var _this = this;
3553
+ var withErrorEmitted = function (callback) {
3554
+ return function (result) {
3555
+ if (result.error) {
3556
+ _this.emit("error", { type: "WebSocketError", error: result.error });
3557
+ }
3558
+ callback(result);
3559
+ };
3560
+ };
3561
+ return {
3562
+ ssl_only: withErrorEmitted(function () {
3563
+ _this.encrypted = true;
3564
+ _this.updateStrategy();
3565
+ _this.retryIn(0);
3566
+ }),
3567
+ refused: withErrorEmitted(function () {
3568
+ _this.disconnect();
3569
+ }),
3570
+ backoff: withErrorEmitted(function () {
3571
+ _this.retryIn(1000);
3572
+ }),
3573
+ retry: withErrorEmitted(function () {
3574
+ _this.retryIn(0);
3575
+ })
3576
+ };
3577
+ };
3578
+ ;
3579
+ ConnectionManager.prototype.setConnection = function (connection) {
3580
+ this.connection = connection;
3581
+ for (var event in this.connectionCallbacks) {
3582
+ this.connection.bind(event, this.connectionCallbacks[event]);
3583
+ }
3584
+ this.resetActivityCheck();
3585
+ };
3586
+ ;
3587
+ ConnectionManager.prototype.abandonConnection = function () {
3588
+ if (!this.connection) {
3589
+ return;
3590
+ }
3591
+ this.stopActivityCheck();
3592
+ for (var event in this.connectionCallbacks) {
3593
+ this.connection.unbind(event, this.connectionCallbacks[event]);
3594
+ }
3595
+ var connection = this.connection;
3596
+ this.connection = null;
3597
+ return connection;
3598
+ };
3599
+ ConnectionManager.prototype.updateState = function (newState, data) {
3600
+ var previousState = this.state;
3601
+ this.state = newState;
3602
+ if (previousState !== newState) {
3603
+ var newStateDescription = newState;
3604
+ if (newStateDescription === "connected") {
3605
+ newStateDescription += " with new socket ID " + data.socket_id;
3606
+ }
3607
+ logger_1["default"].debug('State changed', previousState + ' -> ' + newStateDescription);
3608
+ this.timeline.info({ state: newState, params: data });
3609
+ this.emit('state_change', { previous: previousState, current: newState });
3610
+ this.emit(newState, data);
3611
+ }
3612
+ };
3613
+ ConnectionManager.prototype.shouldRetry = function () {
3614
+ return this.state === "connecting" || this.state === "connected";
3615
+ };
3616
+ return ConnectionManager;
3617
+ }(dispatcher_1["default"]));
3618
+ exports.__esModule = true;
3619
+ exports["default"] = ConnectionManager;
3620
+
3621
+
3622
+ /***/ }),
3623
+ /* 55 */
3624
+ /***/ (function(module, exports, __webpack_require__) {
3625
+
3626
+ "use strict";
3627
+ var Collections = __webpack_require__(9);
3628
+ var factory_1 = __webpack_require__(43);
3629
+ var Channels = (function () {
3630
+ function Channels() {
3631
+ this.channels = {};
3632
+ }
3633
+ Channels.prototype.add = function (name, pusher) {
3634
+ if (!this.channels[name]) {
3635
+ this.channels[name] = createChannel(name, pusher);
3636
+ }
3637
+ return this.channels[name];
3638
+ };
3639
+ Channels.prototype.all = function () {
3640
+ return Collections.values(this.channels);
3641
+ };
3642
+ Channels.prototype.find = function (name) {
3643
+ return this.channels[name];
3644
+ };
3645
+ Channels.prototype.remove = function (name) {
3646
+ var channel = this.channels[name];
3647
+ delete this.channels[name];
3648
+ return channel;
3649
+ };
3650
+ Channels.prototype.disconnect = function () {
3651
+ Collections.objectApply(this.channels, function (channel) {
3652
+ channel.disconnect();
3653
+ });
3654
+ };
3655
+ return Channels;
3656
+ }());
3657
+ exports.__esModule = true;
3658
+ exports["default"] = Channels;
3659
+ function createChannel(name, pusher) {
3660
+ if (name.indexOf('private-') === 0) {
3661
+ return factory_1["default"].createPrivateChannel(name, pusher);
3662
+ }
3663
+ else if (name.indexOf('presence-') === 0) {
3664
+ return factory_1["default"].createPresenceChannel(name, pusher);
3665
+ }
3666
+ else {
3667
+ return factory_1["default"].createChannel(name, pusher);
3668
+ }
3669
+ }
3670
+
3671
+
3672
+ /***/ }),
3673
+ /* 56 */
3674
+ /***/ (function(module, exports, __webpack_require__) {
3675
+
3676
+ "use strict";
3677
+ var factory_1 = __webpack_require__(43);
3678
+ var util_1 = __webpack_require__(11);
3679
+ var Errors = __webpack_require__(31);
3680
+ var Collections = __webpack_require__(9);
3681
+ var TransportStrategy = (function () {
3682
+ function TransportStrategy(name, priority, transport, options) {
3683
+ this.name = name;
3684
+ this.priority = priority;
3685
+ this.transport = transport;
3686
+ this.options = options || {};
3687
+ }
3688
+ TransportStrategy.prototype.isSupported = function () {
3689
+ return this.transport.isSupported({
3690
+ encrypted: this.options.encrypted
3691
+ });
3692
+ };
3693
+ TransportStrategy.prototype.connect = function (minPriority, callback) {
3694
+ var _this = this;
3695
+ if (!this.isSupported()) {
3696
+ return failAttempt(new Errors.UnsupportedStrategy(), callback);
3697
+ }
3698
+ else if (this.priority < minPriority) {
3699
+ return failAttempt(new Errors.TransportPriorityTooLow(), callback);
3700
+ }
3701
+ var connected = false;
3702
+ var transport = this.transport.createConnection(this.name, this.priority, this.options.key, this.options);
3703
+ var handshake = null;
3704
+ var onInitialized = function () {
3705
+ transport.unbind("initialized", onInitialized);
3706
+ transport.connect();
3707
+ };
3708
+ var onOpen = function () {
3709
+ handshake = factory_1["default"].createHandshake(transport, function (result) {
3710
+ connected = true;
3711
+ unbindListeners();
3712
+ callback(null, result);
3713
+ });
3714
+ };
3715
+ var onError = function (error) {
3716
+ unbindListeners();
3717
+ callback(error);
3718
+ };
3719
+ var onClosed = function () {
3720
+ unbindListeners();
3721
+ var serializedTransport;
3722
+ serializedTransport = Collections.safeJSONStringify(transport);
3723
+ callback(new Errors.TransportClosed(serializedTransport));
3724
+ };
3725
+ var unbindListeners = function () {
3726
+ transport.unbind("initialized", onInitialized);
3727
+ transport.unbind("open", onOpen);
3728
+ transport.unbind("error", onError);
3729
+ transport.unbind("closed", onClosed);
3730
+ };
3731
+ transport.bind("initialized", onInitialized);
3732
+ transport.bind("open", onOpen);
3733
+ transport.bind("error", onError);
3734
+ transport.bind("closed", onClosed);
3735
+ transport.initialize();
3736
+ return {
3737
+ abort: function () {
3738
+ if (connected) {
3739
+ return;
3740
+ }
3741
+ unbindListeners();
3742
+ if (handshake) {
3743
+ handshake.close();
3744
+ }
3745
+ else {
3746
+ transport.close();
3747
+ }
3748
+ },
3749
+ forceMinPriority: function (p) {
3750
+ if (connected) {
3751
+ return;
3752
+ }
3753
+ if (_this.priority < p) {
3754
+ if (handshake) {
3755
+ handshake.close();
3756
+ }
3757
+ else {
3758
+ transport.close();
3759
+ }
3760
+ }
3761
+ }
3762
+ };
3763
+ };
3764
+ return TransportStrategy;
3765
+ }());
3766
+ exports.__esModule = true;
3767
+ exports["default"] = TransportStrategy;
3768
+ function failAttempt(error, callback) {
3769
+ util_1["default"].defer(function () {
3770
+ callback(error);
3771
+ });
3772
+ return {
3773
+ abort: function () { },
3774
+ forceMinPriority: function () { }
3775
+ };
3776
+ }
3777
+
3778
+
3779
+ /***/ }),
3780
+ /* 57 */
3781
+ /***/ (function(module, exports, __webpack_require__) {
3782
+
3783
+ "use strict";
3784
+ var Collections = __webpack_require__(9);
3785
+ var util_1 = __webpack_require__(11);
3786
+ var timers_1 = __webpack_require__(12);
3787
+ var SequentialStrategy = (function () {
3788
+ function SequentialStrategy(strategies, options) {
3789
+ this.strategies = strategies;
3790
+ this.loop = Boolean(options.loop);
3791
+ this.failFast = Boolean(options.failFast);
3792
+ this.timeout = options.timeout;
3793
+ this.timeoutLimit = options.timeoutLimit;
3794
+ }
3795
+ SequentialStrategy.prototype.isSupported = function () {
3796
+ return Collections.any(this.strategies, util_1["default"].method("isSupported"));
3797
+ };
3798
+ SequentialStrategy.prototype.connect = function (minPriority, callback) {
3799
+ var _this = this;
3800
+ var strategies = this.strategies;
3801
+ var current = 0;
3802
+ var timeout = this.timeout;
3803
+ var runner = null;
3804
+ var tryNextStrategy = function (error, handshake) {
3805
+ if (handshake) {
3806
+ callback(null, handshake);
3807
+ }
3808
+ else {
3809
+ current = current + 1;
3810
+ if (_this.loop) {
3811
+ current = current % strategies.length;
3812
+ }
3813
+ if (current < strategies.length) {
3814
+ if (timeout) {
3815
+ timeout = timeout * 2;
3816
+ if (_this.timeoutLimit) {
3817
+ timeout = Math.min(timeout, _this.timeoutLimit);
3818
+ }
3819
+ }
3820
+ runner = _this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: _this.failFast }, tryNextStrategy);
3821
+ }
3822
+ else {
3823
+ callback(true);
3824
+ }
3825
+ }
3826
+ };
3827
+ runner = this.tryStrategy(strategies[current], minPriority, { timeout: timeout, failFast: this.failFast }, tryNextStrategy);
3828
+ return {
3829
+ abort: function () {
3830
+ runner.abort();
3831
+ },
3832
+ forceMinPriority: function (p) {
3833
+ minPriority = p;
3834
+ if (runner) {
3835
+ runner.forceMinPriority(p);
3836
+ }
3837
+ }
3838
+ };
3839
+ };
3840
+ SequentialStrategy.prototype.tryStrategy = function (strategy, minPriority, options, callback) {
3841
+ var timer = null;
3842
+ var runner = null;
3843
+ if (options.timeout > 0) {
3844
+ timer = new timers_1.OneOffTimer(options.timeout, function () {
3845
+ runner.abort();
3846
+ callback(true);
3847
+ });
3848
+ }
3849
+ runner = strategy.connect(minPriority, function (error, handshake) {
3850
+ if (error && timer && timer.isRunning() && !options.failFast) {
3851
+ return;
3852
+ }
3853
+ if (timer) {
3854
+ timer.ensureAborted();
3855
+ }
3856
+ callback(error, handshake);
3857
+ });
3858
+ return {
3859
+ abort: function () {
3860
+ if (timer) {
3861
+ timer.ensureAborted();
3862
+ }
3863
+ runner.abort();
3864
+ },
3865
+ forceMinPriority: function (p) {
3866
+ runner.forceMinPriority(p);
3867
+ }
3868
+ };
3869
+ };
3870
+ return SequentialStrategy;
3871
+ }());
3872
+ exports.__esModule = true;
3873
+ exports["default"] = SequentialStrategy;
3874
+
3875
+
3876
+ /***/ }),
3877
+ /* 58 */
3878
+ /***/ (function(module, exports, __webpack_require__) {
3879
+
3880
+ "use strict";
3881
+ var Collections = __webpack_require__(9);
3882
+ var util_1 = __webpack_require__(11);
3883
+ var BestConnectedEverStrategy = (function () {
3884
+ function BestConnectedEverStrategy(strategies) {
3885
+ this.strategies = strategies;
3886
+ }
3887
+ BestConnectedEverStrategy.prototype.isSupported = function () {
3888
+ return Collections.any(this.strategies, util_1["default"].method("isSupported"));
3889
+ };
3890
+ BestConnectedEverStrategy.prototype.connect = function (minPriority, callback) {
3891
+ return connect(this.strategies, minPriority, function (i, runners) {
3892
+ return function (error, handshake) {
3893
+ runners[i].error = error;
3894
+ if (error) {
3895
+ if (allRunnersFailed(runners)) {
3896
+ callback(true);
3897
+ }
3898
+ return;
3899
+ }
3900
+ Collections.apply(runners, function (runner) {
3901
+ runner.forceMinPriority(handshake.transport.priority);
3902
+ });
3903
+ callback(null, handshake);
3904
+ };
3905
+ });
3906
+ };
3907
+ return BestConnectedEverStrategy;
3908
+ }());
3909
+ exports.__esModule = true;
3910
+ exports["default"] = BestConnectedEverStrategy;
3911
+ function connect(strategies, minPriority, callbackBuilder) {
3912
+ var runners = Collections.map(strategies, function (strategy, i, _, rs) {
3913
+ return strategy.connect(minPriority, callbackBuilder(i, rs));
3914
+ });
3915
+ return {
3916
+ abort: function () {
3917
+ Collections.apply(runners, abortRunner);
3918
+ },
3919
+ forceMinPriority: function (p) {
3920
+ Collections.apply(runners, function (runner) {
3921
+ runner.forceMinPriority(p);
3922
+ });
3923
+ }
3924
+ };
3925
+ }
3926
+ function allRunnersFailed(runners) {
3927
+ return Collections.all(runners, function (runner) {
3928
+ return Boolean(runner.error);
3929
+ });
3930
+ }
3931
+ function abortRunner(runner) {
3932
+ if (!runner.error && !runner.aborted) {
3933
+ runner.abort();
3934
+ runner.aborted = true;
3935
+ }
3936
+ }
3937
+
3938
+
3939
+ /***/ }),
3940
+ /* 59 */
3941
+ /***/ (function(module, exports, __webpack_require__) {
3942
+
3943
+ "use strict";
3944
+ var util_1 = __webpack_require__(11);
3945
+ var runtime_1 = __webpack_require__(2);
3946
+ var sequential_strategy_1 = __webpack_require__(57);
3947
+ var Collections = __webpack_require__(9);
3948
+ var CachedStrategy = (function () {
3949
+ function CachedStrategy(strategy, transports, options) {
3950
+ this.strategy = strategy;
3951
+ this.transports = transports;
3952
+ this.ttl = options.ttl || 1800 * 1000;
3953
+ this.encrypted = options.encrypted;
3954
+ this.timeline = options.timeline;
3955
+ }
3956
+ CachedStrategy.prototype.isSupported = function () {
3957
+ return this.strategy.isSupported();
3958
+ };
3959
+ CachedStrategy.prototype.connect = function (minPriority, callback) {
3960
+ var encrypted = this.encrypted;
3961
+ var info = fetchTransportCache(encrypted);
3962
+ var strategies = [this.strategy];
3963
+ if (info && info.timestamp + this.ttl >= util_1["default"].now()) {
3964
+ var transport = this.transports[info.transport];
3965
+ if (transport) {
3966
+ this.timeline.info({
3967
+ cached: true,
3968
+ transport: info.transport,
3969
+ latency: info.latency
3970
+ });
3971
+ strategies.push(new sequential_strategy_1["default"]([transport], {
3972
+ timeout: info.latency * 2 + 1000,
3973
+ failFast: true
3974
+ }));
3975
+ }
3976
+ }
3977
+ var startTimestamp = util_1["default"].now();
3978
+ var runner = strategies.pop().connect(minPriority, function cb(error, handshake) {
3979
+ if (error) {
3980
+ flushTransportCache(encrypted);
3981
+ if (strategies.length > 0) {
3982
+ startTimestamp = util_1["default"].now();
3983
+ runner = strategies.pop().connect(minPriority, cb);
3984
+ }
3985
+ else {
3986
+ callback(error);
3987
+ }
3988
+ }
3989
+ else {
3990
+ storeTransportCache(encrypted, handshake.transport.name, util_1["default"].now() - startTimestamp);
3991
+ callback(null, handshake);
3992
+ }
3993
+ });
3994
+ return {
3995
+ abort: function () {
3996
+ runner.abort();
3997
+ },
3998
+ forceMinPriority: function (p) {
3999
+ minPriority = p;
4000
+ if (runner) {
4001
+ runner.forceMinPriority(p);
4002
+ }
4003
+ }
4004
+ };
4005
+ };
4006
+ return CachedStrategy;
4007
+ }());
4008
+ exports.__esModule = true;
4009
+ exports["default"] = CachedStrategy;
4010
+ function getTransportCacheKey(encrypted) {
4011
+ return "pusherTransport" + (encrypted ? "Encrypted" : "Unencrypted");
4012
+ }
4013
+ function fetchTransportCache(encrypted) {
4014
+ var storage = runtime_1["default"].getLocalStorage();
4015
+ if (storage) {
4016
+ try {
4017
+ var serializedCache = storage[getTransportCacheKey(encrypted)];
4018
+ if (serializedCache) {
4019
+ return JSON.parse(serializedCache);
4020
+ }
4021
+ }
4022
+ catch (e) {
4023
+ flushTransportCache(encrypted);
4024
+ }
4025
+ }
4026
+ return null;
4027
+ }
4028
+ function storeTransportCache(encrypted, transport, latency) {
4029
+ var storage = runtime_1["default"].getLocalStorage();
4030
+ if (storage) {
4031
+ try {
4032
+ storage[getTransportCacheKey(encrypted)] = Collections.safeJSONStringify({
4033
+ timestamp: util_1["default"].now(),
4034
+ transport: transport,
4035
+ latency: latency
4036
+ });
4037
+ }
4038
+ catch (e) {
4039
+ }
4040
+ }
4041
+ }
4042
+ function flushTransportCache(encrypted) {
4043
+ var storage = runtime_1["default"].getLocalStorage();
4044
+ if (storage) {
4045
+ try {
4046
+ delete storage[getTransportCacheKey(encrypted)];
4047
+ }
4048
+ catch (e) {
4049
+ }
4050
+ }
4051
+ }
4052
+
4053
+
4054
+ /***/ }),
4055
+ /* 60 */
4056
+ /***/ (function(module, exports, __webpack_require__) {
4057
+
4058
+ "use strict";
4059
+ var timers_1 = __webpack_require__(12);
4060
+ var DelayedStrategy = (function () {
4061
+ function DelayedStrategy(strategy, _a) {
4062
+ var number = _a.delay;
4063
+ this.strategy = strategy;
4064
+ this.options = { delay: number };
4065
+ }
4066
+ DelayedStrategy.prototype.isSupported = function () {
4067
+ return this.strategy.isSupported();
4068
+ };
4069
+ DelayedStrategy.prototype.connect = function (minPriority, callback) {
4070
+ var strategy = this.strategy;
4071
+ var runner;
4072
+ var timer = new timers_1.OneOffTimer(this.options.delay, function () {
4073
+ runner = strategy.connect(minPriority, callback);
4074
+ });
4075
+ return {
4076
+ abort: function () {
4077
+ timer.ensureAborted();
4078
+ if (runner) {
4079
+ runner.abort();
4080
+ }
4081
+ },
4082
+ forceMinPriority: function (p) {
4083
+ minPriority = p;
4084
+ if (runner) {
4085
+ runner.forceMinPriority(p);
4086
+ }
4087
+ }
4088
+ };
4089
+ };
4090
+ return DelayedStrategy;
4091
+ }());
4092
+ exports.__esModule = true;
4093
+ exports["default"] = DelayedStrategy;
4094
+
4095
+
4096
+ /***/ }),
4097
+ /* 61 */
4098
+ /***/ (function(module, exports) {
4099
+
4100
+ "use strict";
4101
+ var IfStrategy = (function () {
4102
+ function IfStrategy(test, trueBranch, falseBranch) {
4103
+ this.test = test;
4104
+ this.trueBranch = trueBranch;
4105
+ this.falseBranch = falseBranch;
4106
+ }
4107
+ IfStrategy.prototype.isSupported = function () {
4108
+ var branch = this.test() ? this.trueBranch : this.falseBranch;
4109
+ return branch.isSupported();
4110
+ };
4111
+ IfStrategy.prototype.connect = function (minPriority, callback) {
4112
+ var branch = this.test() ? this.trueBranch : this.falseBranch;
4113
+ return branch.connect(minPriority, callback);
4114
+ };
4115
+ return IfStrategy;
4116
+ }());
4117
+ exports.__esModule = true;
4118
+ exports["default"] = IfStrategy;
4119
+
4120
+
4121
+ /***/ }),
4122
+ /* 62 */
4123
+ /***/ (function(module, exports) {
4124
+
4125
+ "use strict";
4126
+ var FirstConnectedStrategy = (function () {
4127
+ function FirstConnectedStrategy(strategy) {
4128
+ this.strategy = strategy;
4129
+ }
4130
+ FirstConnectedStrategy.prototype.isSupported = function () {
4131
+ return this.strategy.isSupported();
4132
+ };
4133
+ FirstConnectedStrategy.prototype.connect = function (minPriority, callback) {
4134
+ var runner = this.strategy.connect(minPriority, function (error, handshake) {
4135
+ if (handshake) {
4136
+ runner.abort();
4137
+ }
4138
+ callback(error, handshake);
4139
+ });
4140
+ return runner;
4141
+ };
4142
+ return FirstConnectedStrategy;
4143
+ }());
4144
+ exports.__esModule = true;
4145
+ exports["default"] = FirstConnectedStrategy;
4146
+
4147
+
4148
+ /***/ }),
4149
+ /* 63 */
4150
+ /***/ (function(module, exports, __webpack_require__) {
4151
+
4152
+ "use strict";
4153
+ var defaults_1 = __webpack_require__(5);
4154
+ exports.getGlobalConfig = function () {
4155
+ return {
4156
+ wsHost: defaults_1["default"].host,
4157
+ wsPort: defaults_1["default"].ws_port,
4158
+ wssPort: defaults_1["default"].wss_port,
4159
+ wsPath: defaults_1["default"].ws_path,
4160
+ httpHost: defaults_1["default"].sockjs_host,
4161
+ httpPort: defaults_1["default"].sockjs_http_port,
4162
+ httpsPort: defaults_1["default"].sockjs_https_port,
4163
+ httpPath: defaults_1["default"].sockjs_path,
4164
+ statsHost: defaults_1["default"].stats_host,
4165
+ authEndpoint: defaults_1["default"].channel_auth_endpoint,
4166
+ authTransport: defaults_1["default"].channel_auth_transport,
4167
+ activity_timeout: defaults_1["default"].activity_timeout,
4168
+ pong_timeout: defaults_1["default"].pong_timeout,
4169
+ unavailable_timeout: defaults_1["default"].unavailable_timeout
4170
+ };
4171
+ };
4172
+ exports.getClusterConfig = function (clusterName) {
4173
+ return {
4174
+ wsHost: "ws-" + clusterName + ".pusher.com",
4175
+ httpHost: "sockjs-" + clusterName + ".pusher.com"
4176
+ };
4177
+ };
4178
+
4179
+
4180
+ /***/ })
4181
+ /******/ ])
4182
+ });
4183
+ ;