pusher-fake 0.11.0 → 0.12.0
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.
- checksums.yaml +4 -4
- data/features/support/application/public/javascripts/vendor/{pusher-2.1.3.js → pusher-2.1.5.js} +320 -276
- data/features/support/application/views/index.erb +1 -1
- data/lib/pusher-fake.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/have_configuration_option_matcher.rb +1 -1
- metadata +21 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5aa94db2edd0797091dc88becfdb8ae831846e76
|
|
4
|
+
data.tar.gz: 5ab407e3e83ea0755b36a3548d226e40f957979e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8fd3d7eae0e62bd30d631da88088720dbaff65c689b24bdd9016d2029841922e78706f83f68860b9488818a15e51965fff72bd4af0b3c85bd44c2efa29f878cd
|
|
7
|
+
data.tar.gz: 05ce0a03d04b78d02a0da9ae9a9ceee8766b3b67ae1833f58c6d0e8499f3780868cd89698237d4a9288c1fa582e0927f2a5db7e7c22939464af48a90499dccc1
|
data/features/support/application/public/javascripts/vendor/{pusher-2.1.3.js → pusher-2.1.5.js}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Pusher JavaScript Library v2.1.
|
|
2
|
+
* Pusher JavaScript Library v2.1.5
|
|
3
3
|
* http://pusherapp.com/
|
|
4
4
|
*
|
|
5
5
|
* Copyright 2013, Pusher
|
|
@@ -86,6 +86,7 @@
|
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
Pusher.instances.push(this);
|
|
89
|
+
this.timeline.info({ instances: Pusher.instances.length });
|
|
89
90
|
|
|
90
91
|
if (Pusher.isReady) self.connect();
|
|
91
92
|
}
|
|
@@ -128,6 +129,10 @@
|
|
|
128
129
|
return this.channels.find(name);
|
|
129
130
|
};
|
|
130
131
|
|
|
132
|
+
prototype.allChannels = function() {
|
|
133
|
+
return this.channels.all();
|
|
134
|
+
};
|
|
135
|
+
|
|
131
136
|
prototype.connect = function() {
|
|
132
137
|
this.connection.connect();
|
|
133
138
|
|
|
@@ -208,6 +213,79 @@
|
|
|
208
213
|
this.Pusher = Pusher;
|
|
209
214
|
}).call(this);
|
|
210
215
|
|
|
216
|
+
;(function() {
|
|
217
|
+
/** Cross-browser compatible timer abstraction.
|
|
218
|
+
*
|
|
219
|
+
* @param {Number} delay
|
|
220
|
+
* @param {Function} callback
|
|
221
|
+
*/
|
|
222
|
+
function Timer(delay, callback) {
|
|
223
|
+
var self = this;
|
|
224
|
+
|
|
225
|
+
this.timeout = setTimeout(function() {
|
|
226
|
+
if (self.timeout !== null) {
|
|
227
|
+
callback();
|
|
228
|
+
self.timeout = null;
|
|
229
|
+
}
|
|
230
|
+
}, delay);
|
|
231
|
+
}
|
|
232
|
+
var prototype = Timer.prototype;
|
|
233
|
+
|
|
234
|
+
/** Returns whether the timer is still running.
|
|
235
|
+
*
|
|
236
|
+
* @return {Boolean}
|
|
237
|
+
*/
|
|
238
|
+
prototype.isRunning = function() {
|
|
239
|
+
return this.timeout !== null;
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
/** Aborts a timer when it's running. */
|
|
243
|
+
prototype.ensureAborted = function() {
|
|
244
|
+
if (this.timeout) {
|
|
245
|
+
clearTimeout(this.timeout);
|
|
246
|
+
this.timeout = null;
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
Pusher.Timer = Timer;
|
|
251
|
+
}).call(this);
|
|
252
|
+
|
|
253
|
+
;(function() {
|
|
254
|
+
/** Cross-browser compatible periodic timer abstraction.
|
|
255
|
+
*
|
|
256
|
+
* @param {Number} interval
|
|
257
|
+
* @param {Function} callback
|
|
258
|
+
*/
|
|
259
|
+
function PeriodicTimer(interval, callback) {
|
|
260
|
+
var self = this;
|
|
261
|
+
|
|
262
|
+
this.interval = setInterval(function() {
|
|
263
|
+
if (self.interval !== null) {
|
|
264
|
+
callback();
|
|
265
|
+
}
|
|
266
|
+
}, interval);
|
|
267
|
+
}
|
|
268
|
+
var prototype = PeriodicTimer.prototype;
|
|
269
|
+
|
|
270
|
+
/** Returns whether the timer is still running.
|
|
271
|
+
*
|
|
272
|
+
* @return {Boolean}
|
|
273
|
+
*/
|
|
274
|
+
prototype.isRunning = function() {
|
|
275
|
+
return this.interval !== null;
|
|
276
|
+
};
|
|
277
|
+
|
|
278
|
+
/** Aborts a timer when it's running. */
|
|
279
|
+
prototype.ensureAborted = function() {
|
|
280
|
+
if (this.interval) {
|
|
281
|
+
clearInterval(this.interval);
|
|
282
|
+
this.interval = null;
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
Pusher.PeriodicTimer = PeriodicTimer;
|
|
287
|
+
}).call(this);
|
|
288
|
+
|
|
211
289
|
;(function() {
|
|
212
290
|
Pusher.Util = {
|
|
213
291
|
now: function() {
|
|
@@ -218,6 +296,10 @@
|
|
|
218
296
|
}
|
|
219
297
|
},
|
|
220
298
|
|
|
299
|
+
defer: function(callback) {
|
|
300
|
+
return new Pusher.Timer(0, callback);
|
|
301
|
+
},
|
|
302
|
+
|
|
221
303
|
/** Merges multiple objects into the target argument.
|
|
222
304
|
*
|
|
223
305
|
* For properties that are plain Objects, performs a deep-merge. For the
|
|
@@ -281,14 +363,48 @@
|
|
|
281
363
|
return -1;
|
|
282
364
|
},
|
|
283
365
|
|
|
284
|
-
|
|
285
|
-
|
|
366
|
+
/** Applies a function f to all properties of an object.
|
|
367
|
+
*
|
|
368
|
+
* Function f gets 3 arguments passed:
|
|
369
|
+
* - element from the object
|
|
370
|
+
* - key of the element
|
|
371
|
+
* - reference to the object
|
|
372
|
+
*
|
|
373
|
+
* @param {Object} object
|
|
374
|
+
* @param {Function} f
|
|
375
|
+
*/
|
|
376
|
+
objectApply: function(object, f) {
|
|
286
377
|
for (var key in object) {
|
|
287
378
|
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
288
|
-
|
|
379
|
+
f(object[key], key, object);
|
|
289
380
|
}
|
|
290
381
|
}
|
|
291
|
-
|
|
382
|
+
},
|
|
383
|
+
|
|
384
|
+
/** Return a list of object's own property keys
|
|
385
|
+
*
|
|
386
|
+
* @param {Object} object
|
|
387
|
+
* @returns {Array}
|
|
388
|
+
*/
|
|
389
|
+
keys: function(object) {
|
|
390
|
+
var keys = [];
|
|
391
|
+
Pusher.Util.objectApply(object, function(_, key) {
|
|
392
|
+
keys.push(key);
|
|
393
|
+
});
|
|
394
|
+
return keys;
|
|
395
|
+
},
|
|
396
|
+
|
|
397
|
+
/** Return a list of object's own property values
|
|
398
|
+
*
|
|
399
|
+
* @param {Object} object
|
|
400
|
+
* @returns {Array}
|
|
401
|
+
*/
|
|
402
|
+
values: function(object) {
|
|
403
|
+
var values = [];
|
|
404
|
+
Pusher.Util.objectApply(object, function(value) {
|
|
405
|
+
values.push(value);
|
|
406
|
+
});
|
|
407
|
+
return values;
|
|
292
408
|
},
|
|
293
409
|
|
|
294
410
|
/** Applies a function f to all elements of an array.
|
|
@@ -307,24 +423,6 @@
|
|
|
307
423
|
}
|
|
308
424
|
},
|
|
309
425
|
|
|
310
|
-
/** Applies a function f to all properties of an object.
|
|
311
|
-
*
|
|
312
|
-
* Function f gets 3 arguments passed:
|
|
313
|
-
* - element from the object
|
|
314
|
-
* - key of the element
|
|
315
|
-
* - reference to the object
|
|
316
|
-
*
|
|
317
|
-
* @param {Object} object
|
|
318
|
-
* @param {Function} f
|
|
319
|
-
*/
|
|
320
|
-
objectApply: function(object, f) {
|
|
321
|
-
for (var key in object) {
|
|
322
|
-
if (Object.prototype.hasOwnProperty.call(object, key)) {
|
|
323
|
-
f(object[key], key, object);
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
},
|
|
327
|
-
|
|
328
426
|
/** Maps all elements of the array and returns the result.
|
|
329
427
|
*
|
|
330
428
|
* Function f gets 4 arguments passed:
|
|
@@ -357,11 +455,9 @@
|
|
|
357
455
|
*/
|
|
358
456
|
mapObject: function(object, f) {
|
|
359
457
|
var result = {};
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
}
|
|
364
|
-
}
|
|
458
|
+
Pusher.Util.objectApply(object, function(value, key) {
|
|
459
|
+
result[key] = f(value);
|
|
460
|
+
});
|
|
365
461
|
return result;
|
|
366
462
|
},
|
|
367
463
|
|
|
@@ -400,16 +496,12 @@
|
|
|
400
496
|
* @param {Function} f
|
|
401
497
|
*/
|
|
402
498
|
filterObject: function(object, test) {
|
|
403
|
-
test = test || function(value) { return !!value; };
|
|
404
|
-
|
|
405
499
|
var result = {};
|
|
406
|
-
|
|
407
|
-
if (
|
|
408
|
-
|
|
409
|
-
result[key] = object[key];
|
|
410
|
-
}
|
|
500
|
+
Pusher.Util.objectApply(object, function(value, key) {
|
|
501
|
+
if ((test && test(value, key, object, result)) || Boolean(value)) {
|
|
502
|
+
result[key] = value;
|
|
411
503
|
}
|
|
412
|
-
}
|
|
504
|
+
});
|
|
413
505
|
return result;
|
|
414
506
|
},
|
|
415
507
|
|
|
@@ -420,11 +512,9 @@
|
|
|
420
512
|
*/
|
|
421
513
|
flatten: function(object) {
|
|
422
514
|
var result = [];
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
}
|
|
427
|
-
}
|
|
515
|
+
Pusher.Util.objectApply(object, function(value, key) {
|
|
516
|
+
result.push([key, value]);
|
|
517
|
+
});
|
|
428
518
|
return result;
|
|
429
519
|
},
|
|
430
520
|
|
|
@@ -509,8 +599,8 @@
|
|
|
509
599
|
}).call(this);
|
|
510
600
|
|
|
511
601
|
;(function() {
|
|
512
|
-
Pusher.VERSION = '2.1.
|
|
513
|
-
Pusher.PROTOCOL =
|
|
602
|
+
Pusher.VERSION = '2.1.5';
|
|
603
|
+
Pusher.PROTOCOL = 7;
|
|
514
604
|
|
|
515
605
|
// DEPRECATED: WS connection parameters
|
|
516
606
|
Pusher.host = 'ws.pusherapp.com';
|
|
@@ -852,79 +942,6 @@
|
|
|
852
942
|
}
|
|
853
943
|
})();
|
|
854
944
|
|
|
855
|
-
;(function() {
|
|
856
|
-
/** Cross-browser compatible timer abstraction.
|
|
857
|
-
*
|
|
858
|
-
* @param {Number} delay
|
|
859
|
-
* @param {Function} callback
|
|
860
|
-
*/
|
|
861
|
-
function Timer(delay, callback) {
|
|
862
|
-
var self = this;
|
|
863
|
-
|
|
864
|
-
this.timeout = setTimeout(function() {
|
|
865
|
-
if (self.timeout !== null) {
|
|
866
|
-
callback();
|
|
867
|
-
self.timeout = null;
|
|
868
|
-
}
|
|
869
|
-
}, delay);
|
|
870
|
-
}
|
|
871
|
-
var prototype = Timer.prototype;
|
|
872
|
-
|
|
873
|
-
/** Returns whether the timer is still running.
|
|
874
|
-
*
|
|
875
|
-
* @return {Boolean}
|
|
876
|
-
*/
|
|
877
|
-
prototype.isRunning = function() {
|
|
878
|
-
return this.timeout !== null;
|
|
879
|
-
};
|
|
880
|
-
|
|
881
|
-
/** Aborts a timer when it's running. */
|
|
882
|
-
prototype.ensureAborted = function() {
|
|
883
|
-
if (this.timeout) {
|
|
884
|
-
clearTimeout(this.timeout);
|
|
885
|
-
this.timeout = null;
|
|
886
|
-
}
|
|
887
|
-
};
|
|
888
|
-
|
|
889
|
-
Pusher.Timer = Timer;
|
|
890
|
-
}).call(this);
|
|
891
|
-
|
|
892
|
-
;(function() {
|
|
893
|
-
/** Cross-browser compatible periodic timer abstraction.
|
|
894
|
-
*
|
|
895
|
-
* @param {Number} interval
|
|
896
|
-
* @param {Function} callback
|
|
897
|
-
*/
|
|
898
|
-
function PeriodicTimer(interval, callback) {
|
|
899
|
-
var self = this;
|
|
900
|
-
|
|
901
|
-
this.interval = setInterval(function() {
|
|
902
|
-
if (self.interval !== null) {
|
|
903
|
-
callback();
|
|
904
|
-
}
|
|
905
|
-
}, interval);
|
|
906
|
-
}
|
|
907
|
-
var prototype = PeriodicTimer.prototype;
|
|
908
|
-
|
|
909
|
-
/** Returns whether the timer is still running.
|
|
910
|
-
*
|
|
911
|
-
* @return {Boolean}
|
|
912
|
-
*/
|
|
913
|
-
prototype.isRunning = function() {
|
|
914
|
-
return this.interval !== null;
|
|
915
|
-
};
|
|
916
|
-
|
|
917
|
-
/** Aborts a timer when it's running. */
|
|
918
|
-
prototype.ensureAborted = function() {
|
|
919
|
-
if (this.interval) {
|
|
920
|
-
clearInterval(this.interval);
|
|
921
|
-
this.interval = null;
|
|
922
|
-
}
|
|
923
|
-
};
|
|
924
|
-
|
|
925
|
-
Pusher.PeriodicTimer = PeriodicTimer;
|
|
926
|
-
}).call(this);
|
|
927
|
-
|
|
928
945
|
(function() {
|
|
929
946
|
|
|
930
947
|
var Base64 = {
|
|
@@ -1142,7 +1159,7 @@
|
|
|
1142
1159
|
this.events.push(
|
|
1143
1160
|
Pusher.Util.extend({}, event, {
|
|
1144
1161
|
timestamp: Pusher.Util.now(),
|
|
1145
|
-
level: level
|
|
1162
|
+
level: (level !== Timeline.INFO ? level : undefined)
|
|
1146
1163
|
})
|
|
1147
1164
|
);
|
|
1148
1165
|
if (this.options.limit && this.events.length > this.options.limit) {
|
|
@@ -1170,23 +1187,15 @@
|
|
|
1170
1187
|
prototype.send = function(sendJSONP, callback) {
|
|
1171
1188
|
var self = this;
|
|
1172
1189
|
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
version: self.options.version
|
|
1183
|
-
}, self.options.params || {});
|
|
1184
|
-
}
|
|
1185
|
-
data.session = self.session;
|
|
1186
|
-
data.timeline = self.events;
|
|
1187
|
-
data = Pusher.Util.filterObject(data, function(v) {
|
|
1188
|
-
return v !== undefined;
|
|
1189
|
-
});
|
|
1190
|
+
var data = Pusher.Util.extend({
|
|
1191
|
+
session: self.session,
|
|
1192
|
+
bundle: self.sent + 1,
|
|
1193
|
+
key: self.key,
|
|
1194
|
+
lib: "js",
|
|
1195
|
+
version: self.options.version,
|
|
1196
|
+
features: self.options.features,
|
|
1197
|
+
timeline: self.events
|
|
1198
|
+
}, self.options.params);
|
|
1190
1199
|
|
|
1191
1200
|
self.events = [];
|
|
1192
1201
|
sendJSONP(data, function(error, result) {
|
|
@@ -1226,7 +1235,9 @@
|
|
|
1226
1235
|
|
|
1227
1236
|
var sendJSONP = function(data, callback) {
|
|
1228
1237
|
var params = {
|
|
1229
|
-
data: data,
|
|
1238
|
+
data: Pusher.Util.filterObject(data, function(v) {
|
|
1239
|
+
return v !== undefined;
|
|
1240
|
+
}),
|
|
1230
1241
|
url: scheme + (self.host || self.options.host) + self.options.path,
|
|
1231
1242
|
receiver: Pusher.JSONP
|
|
1232
1243
|
};
|
|
@@ -1331,6 +1342,7 @@
|
|
|
1331
1342
|
this.strategy = strategy;
|
|
1332
1343
|
this.transports = transports;
|
|
1333
1344
|
this.ttl = options.ttl || 1800*1000;
|
|
1345
|
+
this.encrypted = options.encrypted;
|
|
1334
1346
|
this.timeline = options.timeline;
|
|
1335
1347
|
}
|
|
1336
1348
|
var prototype = CachedStrategy.prototype;
|
|
@@ -1340,7 +1352,8 @@
|
|
|
1340
1352
|
};
|
|
1341
1353
|
|
|
1342
1354
|
prototype.connect = function(minPriority, callback) {
|
|
1343
|
-
var
|
|
1355
|
+
var encrypted = this.encrypted;
|
|
1356
|
+
var info = fetchTransportCache(encrypted);
|
|
1344
1357
|
|
|
1345
1358
|
var strategies = [this.strategy];
|
|
1346
1359
|
if (info && info.timestamp + this.ttl >= Pusher.Util.now()) {
|
|
@@ -1359,7 +1372,7 @@
|
|
|
1359
1372
|
minPriority,
|
|
1360
1373
|
function cb(error, handshake) {
|
|
1361
1374
|
if (error) {
|
|
1362
|
-
|
|
1375
|
+
flushTransportCache(encrypted);
|
|
1363
1376
|
if (strategies.length > 0) {
|
|
1364
1377
|
startTimestamp = Pusher.Util.now();
|
|
1365
1378
|
runner = strategies.pop().connect(minPriority, cb);
|
|
@@ -1367,8 +1380,11 @@
|
|
|
1367
1380
|
callback(error);
|
|
1368
1381
|
}
|
|
1369
1382
|
} else {
|
|
1370
|
-
|
|
1371
|
-
|
|
1383
|
+
storeTransportCache(
|
|
1384
|
+
encrypted,
|
|
1385
|
+
handshake.transport.name,
|
|
1386
|
+
Pusher.Util.now() - startTimestamp
|
|
1387
|
+
);
|
|
1372
1388
|
callback(null, handshake);
|
|
1373
1389
|
}
|
|
1374
1390
|
}
|
|
@@ -1387,26 +1403,30 @@
|
|
|
1387
1403
|
};
|
|
1388
1404
|
};
|
|
1389
1405
|
|
|
1390
|
-
function
|
|
1406
|
+
function getTransportCacheKey(encrypted) {
|
|
1407
|
+
return "pusherTransport" + (encrypted ? "Encrypted" : "Unencrypted");
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
function fetchTransportCache(encrypted) {
|
|
1391
1411
|
var storage = Pusher.Util.getLocalStorage();
|
|
1392
1412
|
if (storage) {
|
|
1393
1413
|
try {
|
|
1394
|
-
var
|
|
1395
|
-
if (
|
|
1396
|
-
return JSON.parse(
|
|
1414
|
+
var serializedCache = storage[getTransportCacheKey(encrypted)];
|
|
1415
|
+
if (serializedCache) {
|
|
1416
|
+
return JSON.parse(serializedCache);
|
|
1397
1417
|
}
|
|
1398
1418
|
} catch (e) {
|
|
1399
|
-
|
|
1419
|
+
flushTransportCache(encrypted);
|
|
1400
1420
|
}
|
|
1401
1421
|
}
|
|
1402
1422
|
return null;
|
|
1403
1423
|
}
|
|
1404
1424
|
|
|
1405
|
-
function
|
|
1425
|
+
function storeTransportCache(encrypted, transport, latency) {
|
|
1406
1426
|
var storage = Pusher.Util.getLocalStorage();
|
|
1407
1427
|
if (storage) {
|
|
1408
1428
|
try {
|
|
1409
|
-
storage
|
|
1429
|
+
storage[getTransportCacheKey(encrypted)] = JSON.stringify({
|
|
1410
1430
|
timestamp: Pusher.Util.now(),
|
|
1411
1431
|
transport: transport,
|
|
1412
1432
|
latency: latency
|
|
@@ -1417,13 +1437,13 @@
|
|
|
1417
1437
|
}
|
|
1418
1438
|
}
|
|
1419
1439
|
|
|
1420
|
-
function
|
|
1440
|
+
function flushTransportCache(encrypted) {
|
|
1421
1441
|
var storage = Pusher.Util.getLocalStorage();
|
|
1422
|
-
if (storage
|
|
1442
|
+
if (storage) {
|
|
1423
1443
|
try {
|
|
1424
|
-
delete storage
|
|
1444
|
+
delete storage[getTransportCacheKey(encrypted)];
|
|
1425
1445
|
} catch (e) {
|
|
1426
|
-
|
|
1446
|
+
// catch exceptions raised by localStorage
|
|
1427
1447
|
}
|
|
1428
1448
|
}
|
|
1429
1449
|
}
|
|
@@ -1618,6 +1638,13 @@
|
|
|
1618
1638
|
var timer = null;
|
|
1619
1639
|
var runner = null;
|
|
1620
1640
|
|
|
1641
|
+
if (options.timeout > 0) {
|
|
1642
|
+
timer = new Pusher.Timer(options.timeout, function() {
|
|
1643
|
+
runner.abort();
|
|
1644
|
+
callback(true);
|
|
1645
|
+
});
|
|
1646
|
+
}
|
|
1647
|
+
|
|
1621
1648
|
runner = strategy.connect(minPriority, function(error, handshake) {
|
|
1622
1649
|
if (error && timer && timer.isRunning() && !options.failFast) {
|
|
1623
1650
|
// advance to the next strategy after the timeout
|
|
@@ -1629,13 +1656,6 @@
|
|
|
1629
1656
|
callback(error, handshake);
|
|
1630
1657
|
});
|
|
1631
1658
|
|
|
1632
|
-
if (options.timeout > 0) {
|
|
1633
|
-
timer = new Pusher.Timer(options.timeout, function() {
|
|
1634
|
-
runner.abort();
|
|
1635
|
-
callback(true);
|
|
1636
|
-
});
|
|
1637
|
-
}
|
|
1638
|
-
|
|
1639
1659
|
return {
|
|
1640
1660
|
abort: function() {
|
|
1641
1661
|
if (timer) {
|
|
@@ -1673,9 +1693,7 @@
|
|
|
1673
1693
|
* @returns {Boolean}
|
|
1674
1694
|
*/
|
|
1675
1695
|
prototype.isSupported = function() {
|
|
1676
|
-
return this.transport.isSupported(
|
|
1677
|
-
disableFlash: !!this.options.disableFlash
|
|
1678
|
-
});
|
|
1696
|
+
return this.transport.isSupported();
|
|
1679
1697
|
};
|
|
1680
1698
|
|
|
1681
1699
|
/** Launches a connection attempt and returns a strategy runner.
|
|
@@ -1684,7 +1702,7 @@
|
|
|
1684
1702
|
* @return {Object} strategy runner
|
|
1685
1703
|
*/
|
|
1686
1704
|
prototype.connect = function(minPriority, callback) {
|
|
1687
|
-
if (!this.
|
|
1705
|
+
if (!this.isSupported()) {
|
|
1688
1706
|
return failAttempt(new Pusher.Errors.UnsupportedStrategy(), callback);
|
|
1689
1707
|
} else if (this.priority < minPriority) {
|
|
1690
1708
|
return failAttempt(new Pusher.Errors.TransportPriorityTooLow(), callback);
|
|
@@ -1761,7 +1779,7 @@
|
|
|
1761
1779
|
};
|
|
1762
1780
|
|
|
1763
1781
|
function failAttempt(error, callback) {
|
|
1764
|
-
|
|
1782
|
+
Pusher.Util.defer(function() {
|
|
1765
1783
|
callback(error);
|
|
1766
1784
|
});
|
|
1767
1785
|
return {
|
|
@@ -1812,6 +1830,7 @@
|
|
|
1812
1830
|
this.key = key;
|
|
1813
1831
|
this.state = "new";
|
|
1814
1832
|
this.timeline = options.timeline;
|
|
1833
|
+
this.activityTimeout = options.activityTimeout;
|
|
1815
1834
|
this.id = this.timeline.generateUniqueID();
|
|
1816
1835
|
|
|
1817
1836
|
this.options = {
|
|
@@ -1871,7 +1890,7 @@
|
|
|
1871
1890
|
this.socket = this.createSocket(url);
|
|
1872
1891
|
} catch (e) {
|
|
1873
1892
|
var self = this;
|
|
1874
|
-
|
|
1893
|
+
Pusher.Util.defer(function() {
|
|
1875
1894
|
self.onError(e);
|
|
1876
1895
|
self.changeState("closed");
|
|
1877
1896
|
});
|
|
@@ -1925,10 +1944,6 @@
|
|
|
1925
1944
|
}
|
|
1926
1945
|
};
|
|
1927
1946
|
|
|
1928
|
-
prototype.requestPing = function() {
|
|
1929
|
-
this.emit("ping_request");
|
|
1930
|
-
};
|
|
1931
|
-
|
|
1932
1947
|
/** @protected */
|
|
1933
1948
|
prototype.onOpen = function() {
|
|
1934
1949
|
this.changeState("open");
|
|
@@ -2056,18 +2071,19 @@
|
|
|
2056
2071
|
* @param {Object} environment
|
|
2057
2072
|
* @returns {Boolean}
|
|
2058
2073
|
*/
|
|
2059
|
-
FlashTransport.isSupported = function(
|
|
2060
|
-
if (environment && environment.disableFlash) {
|
|
2061
|
-
return false;
|
|
2062
|
-
}
|
|
2074
|
+
FlashTransport.isSupported = function() {
|
|
2063
2075
|
try {
|
|
2064
2076
|
return Boolean(new ActiveXObject('ShockwaveFlash.ShockwaveFlash'));
|
|
2065
2077
|
} catch (e) {
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2078
|
+
try {
|
|
2079
|
+
return Boolean(
|
|
2080
|
+
navigator &&
|
|
2081
|
+
navigator.mimeTypes &&
|
|
2082
|
+
navigator.mimeTypes["application/x-shockwave-flash"] !== undefined
|
|
2083
|
+
);
|
|
2084
|
+
} catch(e) {
|
|
2085
|
+
return false;
|
|
2086
|
+
}
|
|
2071
2087
|
}
|
|
2072
2088
|
};
|
|
2073
2089
|
|
|
@@ -2261,39 +2277,29 @@
|
|
|
2261
2277
|
this.transport = transport;
|
|
2262
2278
|
this.minPingDelay = options.minPingDelay;
|
|
2263
2279
|
this.maxPingDelay = options.maxPingDelay;
|
|
2264
|
-
this.pingDelay =
|
|
2280
|
+
this.pingDelay = undefined;
|
|
2265
2281
|
}
|
|
2266
2282
|
var prototype = AssistantToTheTransportManager.prototype;
|
|
2267
2283
|
|
|
2268
2284
|
prototype.createConnection = function(name, priority, key, options) {
|
|
2269
|
-
var
|
|
2285
|
+
var self = this;
|
|
2286
|
+
|
|
2287
|
+
var options = Pusher.Util.extend({}, options, {
|
|
2288
|
+
activityTimeout: self.pingDelay
|
|
2289
|
+
});
|
|
2290
|
+
var connection = self.transport.createConnection(
|
|
2270
2291
|
name, priority, key, options
|
|
2271
2292
|
);
|
|
2272
2293
|
|
|
2273
|
-
var self = this;
|
|
2274
2294
|
var openTimestamp = null;
|
|
2275
|
-
var pingTimer = null;
|
|
2276
2295
|
|
|
2277
2296
|
var onOpen = function() {
|
|
2278
2297
|
connection.unbind("open", onOpen);
|
|
2279
|
-
|
|
2280
|
-
openTimestamp = Pusher.Util.now();
|
|
2281
|
-
if (self.pingDelay) {
|
|
2282
|
-
pingTimer = setInterval(function() {
|
|
2283
|
-
if (pingTimer) {
|
|
2284
|
-
connection.requestPing();
|
|
2285
|
-
}
|
|
2286
|
-
}, self.pingDelay);
|
|
2287
|
-
}
|
|
2288
|
-
|
|
2289
2298
|
connection.bind("closed", onClosed);
|
|
2299
|
+
openTimestamp = Pusher.Util.now();
|
|
2290
2300
|
};
|
|
2291
2301
|
var onClosed = function(closeEvent) {
|
|
2292
2302
|
connection.unbind("closed", onClosed);
|
|
2293
|
-
if (pingTimer) {
|
|
2294
|
-
clearInterval(pingTimer);
|
|
2295
|
-
pingTimer = null;
|
|
2296
|
-
}
|
|
2297
2303
|
|
|
2298
2304
|
if (closeEvent.code === 1002 || closeEvent.code === 1003) {
|
|
2299
2305
|
// we don't want to use transports not obeying the protocol
|
|
@@ -2312,8 +2318,8 @@
|
|
|
2312
2318
|
return connection;
|
|
2313
2319
|
};
|
|
2314
2320
|
|
|
2315
|
-
prototype.isSupported = function(
|
|
2316
|
-
return this.manager.isAlive() && this.transport.isSupported(
|
|
2321
|
+
prototype.isSupported = function() {
|
|
2322
|
+
return this.manager.isAlive() && this.transport.isSupported();
|
|
2317
2323
|
};
|
|
2318
2324
|
|
|
2319
2325
|
Pusher.AssistantToTheTransportManager = AssistantToTheTransportManager;
|
|
@@ -2364,6 +2370,23 @@
|
|
|
2364
2370
|
sockjs: Pusher.SockJSTransport
|
|
2365
2371
|
};
|
|
2366
2372
|
|
|
2373
|
+
var UnsupportedStrategy = {
|
|
2374
|
+
isSupported: function() {
|
|
2375
|
+
return false;
|
|
2376
|
+
},
|
|
2377
|
+
connect: function(_, callback) {
|
|
2378
|
+
var deferred = Pusher.Util.defer(function() {
|
|
2379
|
+
callback(new Pusher.Errors.UnsupportedStrategy());
|
|
2380
|
+
});
|
|
2381
|
+
return {
|
|
2382
|
+
abort: function() {
|
|
2383
|
+
deferred.ensureAborted();
|
|
2384
|
+
},
|
|
2385
|
+
forceMinPriority: function() {}
|
|
2386
|
+
};
|
|
2387
|
+
}
|
|
2388
|
+
};
|
|
2389
|
+
|
|
2367
2390
|
// DSL bindings
|
|
2368
2391
|
|
|
2369
2392
|
function returnWithOriginalContext(f) {
|
|
@@ -2386,19 +2409,31 @@
|
|
|
2386
2409
|
if (!transportClass) {
|
|
2387
2410
|
throw new Pusher.Errors.UnsupportedTransport(type);
|
|
2388
2411
|
}
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2412
|
+
|
|
2413
|
+
var enabled =
|
|
2414
|
+
(!context.enabledTransports ||
|
|
2415
|
+
Pusher.Util.arrayIndexOf(context.enabledTransports, name) !== -1) &&
|
|
2416
|
+
(!context.disabledTransports ||
|
|
2417
|
+
Pusher.Util.arrayIndexOf(context.disabledTransports, name) === -1) &&
|
|
2418
|
+
(name !== "flash" || context.disableFlash !== true);
|
|
2419
|
+
|
|
2420
|
+
var transport;
|
|
2421
|
+
if (enabled) {
|
|
2422
|
+
transport = new Pusher.TransportStrategy(
|
|
2423
|
+
name,
|
|
2424
|
+
priority,
|
|
2425
|
+
manager ? manager.getAssistant(transportClass) : transportClass,
|
|
2426
|
+
Pusher.Util.extend({
|
|
2427
|
+
key: context.key,
|
|
2428
|
+
encrypted: context.encrypted,
|
|
2429
|
+
timeline: context.timeline,
|
|
2430
|
+
ignoreNullOrigin: context.ignoreNullOrigin
|
|
2431
|
+
}, options)
|
|
2432
|
+
);
|
|
2433
|
+
} else {
|
|
2434
|
+
transport = UnsupportedStrategy;
|
|
2435
|
+
}
|
|
2436
|
+
|
|
2402
2437
|
var newContext = context.def(context, name, transport)[1];
|
|
2403
2438
|
newContext.transports = context.transports || {};
|
|
2404
2439
|
newContext.transports[name] = transport;
|
|
@@ -2515,7 +2550,7 @@
|
|
|
2515
2550
|
/**
|
|
2516
2551
|
* Provides functions for handling Pusher protocol-specific messages.
|
|
2517
2552
|
*/
|
|
2518
|
-
Protocol = {};
|
|
2553
|
+
var Protocol = {};
|
|
2519
2554
|
|
|
2520
2555
|
/**
|
|
2521
2556
|
* Decodes a message in a Pusher format.
|
|
@@ -2572,7 +2607,11 @@
|
|
|
2572
2607
|
message = this.decodeMessage(message);
|
|
2573
2608
|
|
|
2574
2609
|
if (message.event === "pusher:connection_established") {
|
|
2575
|
-
return {
|
|
2610
|
+
return {
|
|
2611
|
+
action: "connected",
|
|
2612
|
+
id: message.data.socket_id,
|
|
2613
|
+
activityTimeout: message.data.activity_timeout * 1000
|
|
2614
|
+
};
|
|
2576
2615
|
} else if (message.event === "pusher:error") {
|
|
2577
2616
|
// From protocol 6 close codes are sent only once, so this only
|
|
2578
2617
|
// happens when connection does not support close codes
|
|
@@ -2669,6 +2708,7 @@
|
|
|
2669
2708
|
|
|
2670
2709
|
this.id = id;
|
|
2671
2710
|
this.transport = transport;
|
|
2711
|
+
this.activityTimeout = transport.activityTimeout;
|
|
2672
2712
|
this.bindListeners();
|
|
2673
2713
|
}
|
|
2674
2714
|
var prototype = Connection.prototype;
|
|
@@ -2744,9 +2784,6 @@
|
|
|
2744
2784
|
self.emit('message', message);
|
|
2745
2785
|
}
|
|
2746
2786
|
};
|
|
2747
|
-
var onPingRequest = function() {
|
|
2748
|
-
self.emit("ping_request");
|
|
2749
|
-
};
|
|
2750
2787
|
var onError = function(error) {
|
|
2751
2788
|
self.emit("error", { type: "WebSocketError", error: error });
|
|
2752
2789
|
};
|
|
@@ -2764,12 +2801,10 @@
|
|
|
2764
2801
|
var unbindListeners = function() {
|
|
2765
2802
|
self.transport.unbind("closed", onClosed);
|
|
2766
2803
|
self.transport.unbind("error", onError);
|
|
2767
|
-
self.transport.unbind("ping_request", onPingRequest);
|
|
2768
2804
|
self.transport.unbind("message", onMessage);
|
|
2769
2805
|
};
|
|
2770
2806
|
|
|
2771
2807
|
self.transport.bind("message", onMessage);
|
|
2772
|
-
self.transport.bind("ping_request", onPingRequest);
|
|
2773
2808
|
self.transport.bind("error", onError);
|
|
2774
2809
|
self.transport.bind("closed", onClosed);
|
|
2775
2810
|
};
|
|
@@ -2829,7 +2864,8 @@
|
|
|
2829
2864
|
var result = Pusher.Protocol.processHandshake(m);
|
|
2830
2865
|
if (result.action === "connected") {
|
|
2831
2866
|
self.finish("connected", {
|
|
2832
|
-
connection: new Pusher.Connection(result.id, self.transport)
|
|
2867
|
+
connection: new Pusher.Connection(result.id, self.transport),
|
|
2868
|
+
activityTimeout: result.activityTimeout
|
|
2833
2869
|
});
|
|
2834
2870
|
} else {
|
|
2835
2871
|
self.finish(result.action, { error: result.error });
|
|
@@ -2884,8 +2920,9 @@
|
|
|
2884
2920
|
* - initialized - initial state, never transitioned to
|
|
2885
2921
|
* - connecting - connection is being established
|
|
2886
2922
|
* - connected - connection has been fully established
|
|
2887
|
-
* - disconnected - on requested disconnection
|
|
2923
|
+
* - disconnected - on requested disconnection
|
|
2888
2924
|
* - unavailable - after connection timeout or when there's no network
|
|
2925
|
+
* - failed - when the connection strategy is not supported
|
|
2889
2926
|
*
|
|
2890
2927
|
* Options:
|
|
2891
2928
|
* - unavailableTimeout - time to transition to unavailable state
|
|
@@ -2913,16 +2950,12 @@
|
|
|
2913
2950
|
|
|
2914
2951
|
Pusher.Network.bind("online", function() {
|
|
2915
2952
|
self.timeline.info({ netinfo: "online" });
|
|
2916
|
-
if (self.state === "unavailable") {
|
|
2917
|
-
self.
|
|
2953
|
+
if (self.state === "connecting" || self.state === "unavailable") {
|
|
2954
|
+
self.retryIn(0);
|
|
2918
2955
|
}
|
|
2919
2956
|
});
|
|
2920
2957
|
Pusher.Network.bind("offline", function() {
|
|
2921
2958
|
self.timeline.info({ netinfo: "offline" });
|
|
2922
|
-
if (self.shouldRetry()) {
|
|
2923
|
-
self.disconnect();
|
|
2924
|
-
self.updateState("unavailable");
|
|
2925
|
-
}
|
|
2926
2959
|
});
|
|
2927
2960
|
|
|
2928
2961
|
this.updateStrategy();
|
|
@@ -2937,42 +2970,16 @@
|
|
|
2937
2970
|
* to find events emitted on connection attempts.
|
|
2938
2971
|
*/
|
|
2939
2972
|
prototype.connect = function() {
|
|
2940
|
-
|
|
2941
|
-
|
|
2942
|
-
if (self.connection) {
|
|
2943
|
-
return;
|
|
2944
|
-
}
|
|
2945
|
-
if (self.state === "connecting") {
|
|
2973
|
+
if (this.connection || this.runner) {
|
|
2946
2974
|
return;
|
|
2947
2975
|
}
|
|
2948
|
-
|
|
2949
|
-
|
|
2950
|
-
self.updateState("failed");
|
|
2976
|
+
if (!this.strategy.isSupported()) {
|
|
2977
|
+
this.updateState("failed");
|
|
2951
2978
|
return;
|
|
2952
2979
|
}
|
|
2953
|
-
|
|
2954
|
-
|
|
2955
|
-
|
|
2956
|
-
}
|
|
2957
|
-
|
|
2958
|
-
self.updateState("connecting");
|
|
2959
|
-
|
|
2960
|
-
var callback = function(error, handshake) {
|
|
2961
|
-
if (error) {
|
|
2962
|
-
self.runner = self.strategy.connect(0, callback);
|
|
2963
|
-
} else {
|
|
2964
|
-
if (handshake.action === "error") {
|
|
2965
|
-
self.timeline.error({ handshakeError: handshake.error });
|
|
2966
|
-
} else {
|
|
2967
|
-
// we don't support switching connections yet
|
|
2968
|
-
self.runner.abort();
|
|
2969
|
-
self.handshakeCallbacks[handshake.action](handshake);
|
|
2970
|
-
}
|
|
2971
|
-
}
|
|
2972
|
-
};
|
|
2973
|
-
self.runner = self.strategy.connect(0, callback);
|
|
2974
|
-
|
|
2975
|
-
self.setUnavailableTimer();
|
|
2980
|
+
this.updateState("connecting");
|
|
2981
|
+
this.startConnecting();
|
|
2982
|
+
this.setUnavailableTimer();
|
|
2976
2983
|
};
|
|
2977
2984
|
|
|
2978
2985
|
/** Sends raw data.
|
|
@@ -3004,24 +3011,52 @@
|
|
|
3004
3011
|
|
|
3005
3012
|
/** Closes the connection. */
|
|
3006
3013
|
prototype.disconnect = function() {
|
|
3014
|
+
this.disconnectInternally();
|
|
3015
|
+
this.updateState("disconnected");
|
|
3016
|
+
};
|
|
3017
|
+
|
|
3018
|
+
prototype.isEncrypted = function() {
|
|
3019
|
+
return this.encrypted;
|
|
3020
|
+
};
|
|
3021
|
+
|
|
3022
|
+
/** @private */
|
|
3023
|
+
prototype.startConnecting = function() {
|
|
3024
|
+
var self = this;
|
|
3025
|
+
var callback = function(error, handshake) {
|
|
3026
|
+
if (error) {
|
|
3027
|
+
self.runner = self.strategy.connect(0, callback);
|
|
3028
|
+
} else {
|
|
3029
|
+
if (handshake.action === "error") {
|
|
3030
|
+
self.timeline.error({ handshakeError: handshake.error });
|
|
3031
|
+
} else {
|
|
3032
|
+
self.abortConnecting(); // we don't support switching connections yet
|
|
3033
|
+
self.handshakeCallbacks[handshake.action](handshake);
|
|
3034
|
+
}
|
|
3035
|
+
}
|
|
3036
|
+
};
|
|
3037
|
+
self.runner = self.strategy.connect(0, callback);
|
|
3038
|
+
};
|
|
3039
|
+
|
|
3040
|
+
/** @private */
|
|
3041
|
+
prototype.abortConnecting = function() {
|
|
3007
3042
|
if (this.runner) {
|
|
3008
3043
|
this.runner.abort();
|
|
3044
|
+
this.runner = null;
|
|
3009
3045
|
}
|
|
3046
|
+
};
|
|
3047
|
+
|
|
3048
|
+
/** @private */
|
|
3049
|
+
prototype.disconnectInternally = function() {
|
|
3050
|
+
this.abortConnecting();
|
|
3010
3051
|
this.clearRetryTimer();
|
|
3011
3052
|
this.clearUnavailableTimer();
|
|
3012
3053
|
this.stopActivityCheck();
|
|
3013
|
-
this.updateState("disconnected");
|
|
3014
|
-
// we're in disconnected state, so closing will not cause reconnecting
|
|
3015
3054
|
if (this.connection) {
|
|
3016
|
-
this.
|
|
3017
|
-
|
|
3055
|
+
var connection = this.abandonConnection();
|
|
3056
|
+
connection.close();
|
|
3018
3057
|
}
|
|
3019
3058
|
};
|
|
3020
3059
|
|
|
3021
|
-
prototype.isEncrypted = function() {
|
|
3022
|
-
return this.encrypted;
|
|
3023
|
-
};
|
|
3024
|
-
|
|
3025
3060
|
/** @private */
|
|
3026
3061
|
prototype.updateStrategy = function() {
|
|
3027
3062
|
this.strategy = this.options.getStrategy({
|
|
@@ -3039,7 +3074,7 @@
|
|
|
3039
3074
|
self.emit("connecting_in", Math.round(delay / 1000));
|
|
3040
3075
|
}
|
|
3041
3076
|
self.retryTimer = new Pusher.Timer(delay || 0, function() {
|
|
3042
|
-
self.
|
|
3077
|
+
self.disconnectInternally();
|
|
3043
3078
|
self.connect();
|
|
3044
3079
|
});
|
|
3045
3080
|
};
|
|
@@ -3048,6 +3083,7 @@
|
|
|
3048
3083
|
prototype.clearRetryTimer = function() {
|
|
3049
3084
|
if (this.retryTimer) {
|
|
3050
3085
|
this.retryTimer.ensureAborted();
|
|
3086
|
+
this.retryTimer = null;
|
|
3051
3087
|
}
|
|
3052
3088
|
};
|
|
3053
3089
|
|
|
@@ -3076,7 +3112,7 @@
|
|
|
3076
3112
|
if (!this.connection.supportsPing()) {
|
|
3077
3113
|
var self = this;
|
|
3078
3114
|
self.activityTimer = new Pusher.Timer(
|
|
3079
|
-
self.
|
|
3115
|
+
self.activityTimeout,
|
|
3080
3116
|
function() {
|
|
3081
3117
|
self.send_event('pusher:ping', {});
|
|
3082
3118
|
// wait for pong response
|
|
@@ -3084,7 +3120,7 @@
|
|
|
3084
3120
|
self.options.pongTimeout,
|
|
3085
3121
|
function() {
|
|
3086
3122
|
self.timeline.error({ pong_timed_out: self.options.pongTimeout });
|
|
3087
|
-
self.
|
|
3123
|
+
self.retryIn(0);
|
|
3088
3124
|
}
|
|
3089
3125
|
);
|
|
3090
3126
|
}
|
|
@@ -3111,9 +3147,6 @@
|
|
|
3111
3147
|
ping: function() {
|
|
3112
3148
|
self.send_event('pusher:pong', {});
|
|
3113
3149
|
},
|
|
3114
|
-
ping_request: function() {
|
|
3115
|
-
self.send_event('pusher:ping', {});
|
|
3116
|
-
},
|
|
3117
3150
|
error: function(error) {
|
|
3118
3151
|
// just emit error to user - socket will already be closed by browser
|
|
3119
3152
|
self.emit("error", { type: "WebSocketError", error: error });
|
|
@@ -3132,11 +3165,15 @@
|
|
|
3132
3165
|
var self = this;
|
|
3133
3166
|
return Pusher.Util.extend({}, errorCallbacks, {
|
|
3134
3167
|
connected: function(handshake) {
|
|
3168
|
+
self.activityTimeout = Math.min(
|
|
3169
|
+
self.options.activityTimeout,
|
|
3170
|
+
handshake.activityTimeout,
|
|
3171
|
+
handshake.connection.activityTimeout || Infinity
|
|
3172
|
+
);
|
|
3135
3173
|
self.clearUnavailableTimer();
|
|
3136
3174
|
self.setConnection(handshake.connection);
|
|
3137
3175
|
self.socket_id = self.connection.id;
|
|
3138
|
-
self.
|
|
3139
|
-
self.updateState("connected");
|
|
3176
|
+
self.updateState("connected", { socket_id: self.socket_id });
|
|
3140
3177
|
}
|
|
3141
3178
|
});
|
|
3142
3179
|
};
|
|
@@ -3189,19 +3226,18 @@
|
|
|
3189
3226
|
for (var event in this.connectionCallbacks) {
|
|
3190
3227
|
this.connection.unbind(event, this.connectionCallbacks[event]);
|
|
3191
3228
|
}
|
|
3229
|
+
var connection = this.connection;
|
|
3192
3230
|
this.connection = null;
|
|
3231
|
+
return connection;
|
|
3193
3232
|
};
|
|
3194
3233
|
|
|
3195
3234
|
/** @private */
|
|
3196
3235
|
prototype.updateState = function(newState, data) {
|
|
3197
3236
|
var previousState = this.state;
|
|
3198
|
-
|
|
3199
3237
|
this.state = newState;
|
|
3200
|
-
// Only emit when the state changes
|
|
3201
3238
|
if (previousState !== newState) {
|
|
3202
3239
|
Pusher.debug('State changed', previousState + ' -> ' + newState);
|
|
3203
|
-
|
|
3204
|
-
this.timeline.info({ state: newState });
|
|
3240
|
+
this.timeline.info({ state: newState, params: data });
|
|
3205
3241
|
this.emit('state_change', { previous: previousState, current: newState });
|
|
3206
3242
|
this.emit(newState, data);
|
|
3207
3243
|
}
|
|
@@ -3546,6 +3582,14 @@
|
|
|
3546
3582
|
return this.channels[name];
|
|
3547
3583
|
};
|
|
3548
3584
|
|
|
3585
|
+
/** Returns a list of all channels
|
|
3586
|
+
*
|
|
3587
|
+
* @return {Array}
|
|
3588
|
+
*/
|
|
3589
|
+
prototype.all = function(name) {
|
|
3590
|
+
return Pusher.Util.values(this.channels);
|
|
3591
|
+
};
|
|
3592
|
+
|
|
3549
3593
|
/** Finds a channel by its name.
|
|
3550
3594
|
*
|
|
3551
3595
|
* @param {String} name
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<ul></ul>
|
|
14
14
|
</section>
|
|
15
15
|
|
|
16
|
-
<script src="/javascripts/vendor/pusher-2.1.
|
|
16
|
+
<script src="/javascripts/vendor/pusher-2.1.5.js"></script>
|
|
17
17
|
<script>
|
|
18
18
|
window.addEventListener("DOMContentLoaded", function() {
|
|
19
19
|
// Create the client instance using the PusherFake server.
|
data/lib/pusher-fake.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: pusher-fake
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.12.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Tristan Dunn
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2013-
|
|
11
|
+
date: 2013-12-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: em-http-request
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- -
|
|
17
|
+
- - '>='
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
19
|
version: 1.0.0
|
|
20
|
+
- - <
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: 1.2.0
|
|
20
23
|
type: :runtime
|
|
21
24
|
prerelease: false
|
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
26
|
requirements:
|
|
24
|
-
- -
|
|
27
|
+
- - '>='
|
|
25
28
|
- !ruby/object:Gem::Version
|
|
26
29
|
version: 1.0.0
|
|
30
|
+
- - <
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: 1.2.0
|
|
27
33
|
- !ruby/object:Gem::Dependency
|
|
28
34
|
name: em-websocket
|
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -86,14 +92,14 @@ dependencies:
|
|
|
86
92
|
requirements:
|
|
87
93
|
- - '='
|
|
88
94
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: 1.
|
|
95
|
+
version: 1.1.0
|
|
90
96
|
type: :development
|
|
91
97
|
prerelease: false
|
|
92
98
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
99
|
requirements:
|
|
94
100
|
- - '='
|
|
95
101
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: 1.
|
|
102
|
+
version: 1.1.0
|
|
97
103
|
- !ruby/object:Gem::Dependency
|
|
98
104
|
name: coveralls
|
|
99
105
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -114,14 +120,14 @@ dependencies:
|
|
|
114
120
|
requirements:
|
|
115
121
|
- - '='
|
|
116
122
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: 1.3.
|
|
123
|
+
version: 1.3.10
|
|
118
124
|
type: :development
|
|
119
125
|
prerelease: false
|
|
120
126
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
127
|
requirements:
|
|
122
128
|
- - '='
|
|
123
129
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: 1.3.
|
|
130
|
+
version: 1.3.10
|
|
125
131
|
- !ruby/object:Gem::Dependency
|
|
126
132
|
name: pusher
|
|
127
133
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -142,14 +148,14 @@ dependencies:
|
|
|
142
148
|
requirements:
|
|
143
149
|
- - '='
|
|
144
150
|
- !ruby/object:Gem::Version
|
|
145
|
-
version: 10.1.
|
|
151
|
+
version: 10.1.1
|
|
146
152
|
type: :development
|
|
147
153
|
prerelease: false
|
|
148
154
|
version_requirements: !ruby/object:Gem::Requirement
|
|
149
155
|
requirements:
|
|
150
156
|
- - '='
|
|
151
157
|
- !ruby/object:Gem::Version
|
|
152
|
-
version: 10.1.
|
|
158
|
+
version: 10.1.1
|
|
153
159
|
- !ruby/object:Gem::Dependency
|
|
154
160
|
name: redcarpet
|
|
155
161
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -198,14 +204,14 @@ dependencies:
|
|
|
198
204
|
requirements:
|
|
199
205
|
- - '='
|
|
200
206
|
- !ruby/object:Gem::Version
|
|
201
|
-
version: 0.8.7.
|
|
207
|
+
version: 0.8.7.3
|
|
202
208
|
type: :development
|
|
203
209
|
prerelease: false
|
|
204
210
|
version_requirements: !ruby/object:Gem::Requirement
|
|
205
211
|
requirements:
|
|
206
212
|
- - '='
|
|
207
213
|
- !ruby/object:Gem::Version
|
|
208
|
-
version: 0.8.7.
|
|
214
|
+
version: 0.8.7.3
|
|
209
215
|
description: A fake Pusher server for development and testing.
|
|
210
216
|
email: hello@tristandunn.com
|
|
211
217
|
executables: []
|
|
@@ -236,7 +242,7 @@ files:
|
|
|
236
242
|
- features/step_definitions/navigation_steps.rb
|
|
237
243
|
- features/step_definitions/presence_steps.rb
|
|
238
244
|
- features/step_definitions/webhook_steps.rb
|
|
239
|
-
- features/support/application/public/javascripts/vendor/pusher-2.1.
|
|
245
|
+
- features/support/application/public/javascripts/vendor/pusher-2.1.5.js
|
|
240
246
|
- features/support/application/views/index.erb
|
|
241
247
|
- features/support/application.rb
|
|
242
248
|
- features/support/coveralls.rb
|
|
@@ -279,7 +285,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
279
285
|
version: '0'
|
|
280
286
|
requirements: []
|
|
281
287
|
rubyforge_project:
|
|
282
|
-
rubygems_version: 2.0.
|
|
288
|
+
rubygems_version: 2.0.14
|
|
283
289
|
signing_key:
|
|
284
290
|
specification_version: 4
|
|
285
291
|
summary: A fake Pusher server for development and testing.
|
|
@@ -297,7 +303,7 @@ test_files:
|
|
|
297
303
|
- features/step_definitions/navigation_steps.rb
|
|
298
304
|
- features/step_definitions/presence_steps.rb
|
|
299
305
|
- features/step_definitions/webhook_steps.rb
|
|
300
|
-
- features/support/application/public/javascripts/vendor/pusher-2.1.
|
|
306
|
+
- features/support/application/public/javascripts/vendor/pusher-2.1.5.js
|
|
301
307
|
- features/support/application/views/index.erb
|
|
302
308
|
- features/support/application.rb
|
|
303
309
|
- features/support/coveralls.rb
|