pusher_rails 0.1.5 → 0.1.6
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.
- data/CHANGELOG.md +4 -0
- data/README.md +2 -2
- data/pusher_rails.gemspec +1 -1
- data/vendor/assets/javascripts/pusher.js +191 -178
- metadata +50 -32
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
|
4
4
|
Adds:
|
5
5
|
- [pusher-gem v0.8.4](https://github.com/pusher/pusher-gem/tree/v0.8.4)
|
6
|
-
- [pusher.js v1.
|
6
|
+
- [pusher.js v1.11.0](https://github.com/pusher/pusher-js/tree/v1.11.0)
|
7
7
|
- [backpusher.js](https://github.com/pusher/backpusher/commit/e61c9d7a761fcb48f312416408d1bf4ed418735b#diff-1)
|
8
8
|
|
9
9
|
This pulls in the *pusher-gem* as well as adding *pusher.js* and *backpusher.js* to the assets pipeline of your Rails 3.1+ app.
|
@@ -21,7 +21,7 @@ Licenses
|
|
21
21
|
========
|
22
22
|
|
23
23
|
/*!
|
24
|
-
* Pusher JavaScript Library v1.
|
24
|
+
* Pusher JavaScript Library v1.11.0
|
25
25
|
* http://pusherapp.com/
|
26
26
|
*
|
27
27
|
* Copyright 2011, Pusher
|
data/pusher_rails.gemspec
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
/*!
|
2
|
-
* Pusher JavaScript Library v1.
|
2
|
+
* Pusher JavaScript Library v1.11.0
|
3
3
|
* http://pusherapp.com/
|
4
4
|
*
|
5
5
|
* Copyright 2011, Pusher
|
6
6
|
* Released under the MIT licence.
|
7
7
|
*/
|
8
8
|
|
9
|
-
if (
|
9
|
+
if (Function.prototype.scopedTo === undefined) {
|
10
10
|
Function.prototype.scopedTo = function(context, args) {
|
11
11
|
var f = this;
|
12
12
|
return function() {
|
@@ -18,14 +18,14 @@ if (typeof Function.prototype.scopedTo === 'undefined') {
|
|
18
18
|
|
19
19
|
var Pusher = function(app_key, options) {
|
20
20
|
this.options = options || {};
|
21
|
-
this.path = '/app/' + app_key + '?client=js&version=' + Pusher.VERSION;
|
22
21
|
this.key = app_key;
|
23
22
|
this.channels = new Pusher.Channels();
|
24
|
-
this.
|
25
|
-
this.global_channel.global = true;
|
23
|
+
this.global_emitter = new Pusher.EventsDispatcher()
|
26
24
|
|
27
25
|
var self = this;
|
28
26
|
|
27
|
+
this.checkAppKey();
|
28
|
+
|
29
29
|
this.connection = new Pusher.Connection(this.key, this.options);
|
30
30
|
|
31
31
|
// Setup / teardown connection
|
@@ -34,13 +34,21 @@ var Pusher = function(app_key, options) {
|
|
34
34
|
self.subscribeAll();
|
35
35
|
})
|
36
36
|
.bind('message', function(params) {
|
37
|
-
|
37
|
+
var internal = (params.event.indexOf('pusher_internal:') === 0);
|
38
|
+
if (params.channel) {
|
39
|
+
var channel;
|
40
|
+
if (channel = self.channel(params.channel)) {
|
41
|
+
channel.emit(params.event, params.data);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
// Emit globaly [deprecated]
|
45
|
+
if (!internal) self.global_emitter.emit(params.event, params.data);
|
38
46
|
})
|
39
47
|
.bind('disconnected', function() {
|
40
48
|
self.channels.disconnect();
|
41
49
|
})
|
42
50
|
.bind('error', function(err) {
|
43
|
-
Pusher.
|
51
|
+
Pusher.warn('Error', err);
|
44
52
|
});
|
45
53
|
|
46
54
|
Pusher.instances.push(this);
|
@@ -62,12 +70,12 @@ Pusher.prototype = {
|
|
62
70
|
},
|
63
71
|
|
64
72
|
bind: function(event_name, callback) {
|
65
|
-
this.
|
73
|
+
this.global_emitter.bind(event_name, callback);
|
66
74
|
return this;
|
67
75
|
},
|
68
76
|
|
69
77
|
bind_all: function(callback) {
|
70
|
-
this.
|
78
|
+
this.global_emitter.bind_all(callback);
|
71
79
|
return this;
|
72
80
|
},
|
73
81
|
|
@@ -109,30 +117,13 @@ Pusher.prototype = {
|
|
109
117
|
},
|
110
118
|
|
111
119
|
send_event: function(event_name, data, channel) {
|
112
|
-
|
113
|
-
|
114
|
-
var payload = {
|
115
|
-
event: event_name,
|
116
|
-
data: data
|
117
|
-
};
|
118
|
-
if (channel) payload['channel'] = channel;
|
119
|
-
|
120
|
-
return this.connection.send(JSON.stringify(payload));
|
120
|
+
return this.connection.send_event(event_name, data, channel);
|
121
121
|
},
|
122
122
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
var channel = this.channel(channel_name);
|
127
|
-
if (channel) {
|
128
|
-
channel.dispatch_with_all(event_name, event_data);
|
129
|
-
}
|
130
|
-
} else {
|
131
|
-
// Bit hacky but these events won't get logged otherwise
|
132
|
-
Pusher.debug("Event recd (event,data)", event_name, event_data);
|
123
|
+
checkAppKey: function() {
|
124
|
+
if(this.key === null || this.key === undefined) {
|
125
|
+
Pusher.warn('Warning', 'You must pass your app key when you instantiate Pusher.');
|
133
126
|
}
|
134
|
-
|
135
|
-
this.global_channel.dispatch_with_all(event_name, event_data);
|
136
127
|
}
|
137
128
|
};
|
138
129
|
|
@@ -147,42 +138,61 @@ Pusher.Util = {
|
|
147
138
|
}
|
148
139
|
}
|
149
140
|
return target;
|
141
|
+
},
|
142
|
+
|
143
|
+
stringify: function stringify() {
|
144
|
+
var m = ["Pusher"]
|
145
|
+
for (var i = 0; i < arguments.length; i++){
|
146
|
+
if (typeof arguments[i] === "string") {
|
147
|
+
m.push(arguments[i])
|
148
|
+
} else {
|
149
|
+
if (window['JSON'] == undefined) {
|
150
|
+
m.push(arguments[i].toString());
|
151
|
+
} else {
|
152
|
+
m.push(JSON.stringify(arguments[i]))
|
153
|
+
}
|
154
|
+
}
|
155
|
+
};
|
156
|
+
return m.join(" : ")
|
157
|
+
},
|
158
|
+
|
159
|
+
arrayIndexOf: function(array, item) { // MSIE doesn't have array.indexOf
|
160
|
+
var nativeIndexOf = Array.prototype.indexOf;
|
161
|
+
if (array == null) return -1;
|
162
|
+
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
|
163
|
+
for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
|
164
|
+
return -1;
|
150
165
|
}
|
151
166
|
};
|
152
167
|
|
153
168
|
// To receive log output provide a Pusher.log function, for example
|
154
169
|
// Pusher.log = function(m){console.log(m)}
|
155
170
|
Pusher.debug = function() {
|
156
|
-
if (!Pusher.log)
|
157
|
-
|
158
|
-
for (var i = 0; i < arguments.length; i++){
|
159
|
-
if (typeof arguments[i] === "string") {
|
160
|
-
m.push(arguments[i])
|
161
|
-
} else {
|
162
|
-
if (window['JSON'] == undefined) {
|
163
|
-
m.push(arguments[i].toString());
|
164
|
-
} else {
|
165
|
-
m.push(JSON.stringify(arguments[i]))
|
166
|
-
}
|
167
|
-
}
|
168
|
-
};
|
169
|
-
Pusher.log(m.join(" : "))
|
171
|
+
if (!Pusher.log) return
|
172
|
+
Pusher.log(Pusher.Util.stringify.apply(this, arguments))
|
170
173
|
}
|
174
|
+
Pusher.warn = function() {
|
175
|
+
if (window.console && window.console.warn) {
|
176
|
+
window.console.warn(Pusher.Util.stringify.apply(this, arguments));
|
177
|
+
} else {
|
178
|
+
if (!Pusher.log) return
|
179
|
+
Pusher.log(Pusher.Util.stringify.apply(this, arguments));
|
180
|
+
}
|
181
|
+
};
|
171
182
|
|
172
183
|
// Pusher defaults
|
173
|
-
Pusher.VERSION = '1.
|
184
|
+
Pusher.VERSION = '1.11.0';
|
174
185
|
|
175
186
|
Pusher.host = 'ws.pusherapp.com';
|
176
187
|
Pusher.ws_port = 80;
|
177
188
|
Pusher.wss_port = 443;
|
178
189
|
Pusher.channel_auth_endpoint = '/pusher/auth';
|
179
|
-
Pusher.
|
180
|
-
Pusher.
|
181
|
-
Pusher.cdn_https = 'https://d3ds63zw57jt09.cloudfront.net/'
|
190
|
+
Pusher.cdn_http = 'http://js.pusher.com/'
|
191
|
+
Pusher.cdn_https = 'https://d3dy5gmtp8yhk7.cloudfront.net/'
|
182
192
|
Pusher.dependency_suffix = '';
|
183
|
-
Pusher.data_decorator = function(event_name, event_data){ return event_data }; // wrap event_data before dispatching
|
184
|
-
Pusher.allow_reconnect = true;
|
185
193
|
Pusher.channel_auth_transport = 'ajax';
|
194
|
+
Pusher.activity_timeout = 120000;
|
195
|
+
Pusher.pong_timeout = 30000;
|
186
196
|
|
187
197
|
Pusher.isReady = false;
|
188
198
|
Pusher.ready = function() {
|
@@ -208,9 +218,11 @@ Example:
|
|
208
218
|
emitter.bind_all(function(event_name, data){ alert(data) });
|
209
219
|
|
210
220
|
--------------------------------------------------------*/
|
211
|
-
function EventsDispatcher() {
|
221
|
+
function EventsDispatcher(failThrough) {
|
212
222
|
this.callbacks = {};
|
213
223
|
this.global_callbacks = [];
|
224
|
+
// Run this function when dispatching an event when no callbacks defined
|
225
|
+
this.failThrough = failThrough;
|
214
226
|
}
|
215
227
|
|
216
228
|
EventsDispatcher.prototype.bind = function(event_name, callback) {
|
@@ -218,42 +230,37 @@ Example:
|
|
218
230
|
this.callbacks[event_name].push(callback);
|
219
231
|
return this;// chainable
|
220
232
|
};
|
221
|
-
|
222
|
-
EventsDispatcher.prototype.
|
223
|
-
this.
|
224
|
-
|
233
|
+
|
234
|
+
EventsDispatcher.prototype.unbind = function(eventName, callback) {
|
235
|
+
if(this.callbacks[eventName]) {
|
236
|
+
var index = Pusher.Util.arrayIndexOf(this.callbacks[eventName], callback);
|
237
|
+
this.callbacks[eventName].splice(index, 1);
|
238
|
+
}
|
225
239
|
return this;
|
226
240
|
};
|
227
241
|
|
228
|
-
EventsDispatcher.prototype.
|
229
|
-
|
230
|
-
|
231
|
-
|
242
|
+
EventsDispatcher.prototype.emit = function(event_name, data) {
|
243
|
+
// Global callbacks
|
244
|
+
for (var i = 0; i < this.global_callbacks.length; i++) {
|
245
|
+
this.global_callbacks[i](event_name, data);
|
246
|
+
}
|
232
247
|
|
233
|
-
|
248
|
+
// Event callbacks
|
234
249
|
var callbacks = this.callbacks[event_name];
|
235
|
-
|
236
250
|
if (callbacks) {
|
237
251
|
for (var i = 0; i < callbacks.length; i++) {
|
238
|
-
callbacks[i](
|
239
|
-
}
|
240
|
-
} else {
|
241
|
-
// Log is un-necessary in case of global channel or connection object
|
242
|
-
if (!(this.global || this instanceof Pusher.Connection || this instanceof Pusher.Machine)) {
|
243
|
-
Pusher.debug('No callbacks for ' + event_name, event_data);
|
252
|
+
callbacks[i](data);
|
244
253
|
}
|
254
|
+
} else if (this.failThrough) {
|
255
|
+
this.failThrough(event_name, data)
|
245
256
|
}
|
246
|
-
};
|
247
257
|
|
248
|
-
|
249
|
-
for (var i = 0; i < this.global_callbacks.length; i++) {
|
250
|
-
this.global_callbacks[i](event_name, data);
|
251
|
-
}
|
258
|
+
return this;
|
252
259
|
};
|
253
260
|
|
254
|
-
EventsDispatcher.prototype.
|
255
|
-
this.
|
256
|
-
this
|
261
|
+
EventsDispatcher.prototype.bind_all = function(callback) {
|
262
|
+
this.global_callbacks.push(callback);
|
263
|
+
return this;
|
257
264
|
};
|
258
265
|
|
259
266
|
this.Pusher.EventsDispatcher = EventsDispatcher;
|
@@ -266,16 +273,6 @@ Example:
|
|
266
273
|
Helpers:
|
267
274
|
-----------------------------------------------*/
|
268
275
|
|
269
|
-
// MSIE doesn't have array.indexOf
|
270
|
-
var nativeIndexOf = Array.prototype.indexOf;
|
271
|
-
function indexOf(array, item) {
|
272
|
-
if (array == null) return -1;
|
273
|
-
if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
|
274
|
-
for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i;
|
275
|
-
return -1;
|
276
|
-
}
|
277
|
-
|
278
|
-
|
279
276
|
function capitalize(str) {
|
280
277
|
return str.substr(0, 1).toUpperCase() + str.substr(1);
|
281
278
|
}
|
@@ -290,10 +287,9 @@ Example:
|
|
290
287
|
/*-----------------------------------------------
|
291
288
|
The State Machine
|
292
289
|
-----------------------------------------------*/
|
293
|
-
function Machine(
|
290
|
+
function Machine(initialState, transitions, stateActions) {
|
294
291
|
Pusher.EventsDispatcher.call(this);
|
295
292
|
|
296
|
-
this.actor = actor;
|
297
293
|
this.state = undefined;
|
298
294
|
this.errors = [];
|
299
295
|
|
@@ -310,8 +306,8 @@ Example:
|
|
310
306
|
var prevState = this.state;
|
311
307
|
var stateCallbacks = this.stateActions;
|
312
308
|
|
313
|
-
if (prevState && (
|
314
|
-
throw new Error(
|
309
|
+
if (prevState && (Pusher.Util.arrayIndexOf(this.transitions[prevState], nextState) == -1)) {
|
310
|
+
throw new Error('Invalid transition [' + prevState + ' to ' + nextState + ']');
|
315
311
|
}
|
316
312
|
|
317
313
|
// exit
|
@@ -350,8 +346,6 @@ Example:
|
|
350
346
|
}).call(this);
|
351
347
|
|
352
348
|
;(function() {
|
353
|
-
var Pusher = this.Pusher;
|
354
|
-
|
355
349
|
/*
|
356
350
|
A little bauble to interface with window.navigator.onLine,
|
357
351
|
window.ononline and window.onoffline. Easier to mock.
|
@@ -382,7 +376,12 @@ Example:
|
|
382
376
|
};
|
383
377
|
|
384
378
|
Pusher.Util.extend(NetInfo.prototype, Pusher.EventsDispatcher.prototype);
|
385
|
-
|
379
|
+
|
380
|
+
this.Pusher.NetInfo = NetInfo;
|
381
|
+
}).call(this);
|
382
|
+
|
383
|
+
;(function() {
|
384
|
+
var Pusher = this.Pusher;
|
386
385
|
|
387
386
|
var machineTransitions = {
|
388
387
|
'initialized': ['waiting', 'failed'],
|
@@ -425,7 +424,7 @@ Example:
|
|
425
424
|
|
426
425
|
Pusher.EventsDispatcher.call(this);
|
427
426
|
|
428
|
-
this.options = Pusher.Util.extend({encrypted: false}, options
|
427
|
+
this.options = Pusher.Util.extend({encrypted: false}, options);
|
429
428
|
|
430
429
|
this.netInfo = new Pusher.NetInfo();
|
431
430
|
|
@@ -452,7 +451,7 @@ Example:
|
|
452
451
|
});
|
453
452
|
|
454
453
|
// define the state machine that runs the connection
|
455
|
-
this._machine = new Pusher.Machine(
|
454
|
+
this._machine = new Pusher.Machine('initialized', machineTransitions, {
|
456
455
|
|
457
456
|
// TODO: Use the constructor for this.
|
458
457
|
initializedPre: function() {
|
@@ -467,7 +466,7 @@ Example:
|
|
467
466
|
|
468
467
|
waitingPre: function() {
|
469
468
|
if (self.connectionWait > 0) {
|
470
|
-
|
469
|
+
self.emit('connecting_in', self.connectionWait);
|
471
470
|
}
|
472
471
|
|
473
472
|
if (self.netInfo.isOnLine() === false || self.connectionAttempts > 4){
|
@@ -529,7 +528,7 @@ Example:
|
|
529
528
|
},
|
530
529
|
|
531
530
|
openPre: function() {
|
532
|
-
self.socket.onmessage =
|
531
|
+
self.socket.onmessage = ws_onMessageOpen;
|
533
532
|
self.socket.onerror = ws_onError;
|
534
533
|
self.socket.onclose = transitionToWaiting;
|
535
534
|
|
@@ -552,11 +551,13 @@ Example:
|
|
552
551
|
connectedPre: function(socket_id) {
|
553
552
|
self.socket_id = socket_id;
|
554
553
|
|
555
|
-
self.socket.onmessage =
|
554
|
+
self.socket.onmessage = ws_onMessageConnected;
|
556
555
|
self.socket.onerror = ws_onError;
|
557
556
|
self.socket.onclose = transitionToWaiting;
|
558
557
|
|
559
558
|
resetConnectionParameters(self);
|
559
|
+
|
560
|
+
resetActivityCheck();
|
560
561
|
},
|
561
562
|
|
562
563
|
connectedPost: function() {
|
@@ -564,6 +565,7 @@ Example:
|
|
564
565
|
},
|
565
566
|
|
566
567
|
connectedExit: function() {
|
568
|
+
stopActivityCheck();
|
567
569
|
triggerStateChange('disconnected');
|
568
570
|
},
|
569
571
|
|
@@ -639,6 +641,22 @@ Example:
|
|
639
641
|
self._machine.transition('impermanentlyClosing');
|
640
642
|
}
|
641
643
|
|
644
|
+
function resetActivityCheck() {
|
645
|
+
if (self._activityTimer) { clearTimeout(self._activityTimer); }
|
646
|
+
// Send ping after inactivity
|
647
|
+
self._activityTimer = setTimeout(function() {
|
648
|
+
self.send_event('pusher:ping', {})
|
649
|
+
// Wait for pong response
|
650
|
+
self._activityTimer = setTimeout(function() {
|
651
|
+
self.socket.close();
|
652
|
+
}, (self.options.pong_timeout || Pusher.pong_timeout))
|
653
|
+
}, (self.options.activity_timeout || Pusher.activity_timeout))
|
654
|
+
}
|
655
|
+
|
656
|
+
function stopActivityCheck() {
|
657
|
+
if (self._activityTimer) { clearTimeout(self._activityTimer); }
|
658
|
+
}
|
659
|
+
|
642
660
|
/*-----------------------------------------------
|
643
661
|
WebSocket Callbacks
|
644
662
|
-----------------------------------------------*/
|
@@ -648,38 +666,49 @@ Example:
|
|
648
666
|
self._machine.transition('open');
|
649
667
|
};
|
650
668
|
|
651
|
-
function
|
669
|
+
function ws_onMessageOpen(event) {
|
652
670
|
var params = parseWebSocketEvent(event);
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
+
if (params !== undefined) {
|
672
|
+
if (params.event === 'pusher:connection_established') {
|
673
|
+
self._machine.transition('connected', params.data.socket_id);
|
674
|
+
} else if (params.event === 'pusher:error') {
|
675
|
+
// first inform the end-developer of this error
|
676
|
+
self.emit('error', {type: 'PusherError', data: params.data});
|
677
|
+
|
678
|
+
switch (params.data.code) {
|
679
|
+
case 4000:
|
680
|
+
Pusher.warn(params.data.message);
|
681
|
+
|
682
|
+
self.compulsorySecure = true;
|
683
|
+
self.connectionSecure = true;
|
684
|
+
self.options.encrypted = true;
|
685
|
+
break;
|
686
|
+
case 4001:
|
687
|
+
// App not found by key - close connection
|
688
|
+
self._machine.transition('permanentlyClosing');
|
689
|
+
break;
|
690
|
+
}
|
671
691
|
}
|
692
|
+
}
|
693
|
+
}
|
672
694
|
|
673
|
-
|
674
|
-
|
695
|
+
function ws_onMessageConnected(event) {
|
696
|
+
resetActivityCheck();
|
675
697
|
|
676
|
-
|
677
|
-
|
678
|
-
|
698
|
+
var params = parseWebSocketEvent(event);
|
699
|
+
if (params !== undefined) {
|
700
|
+
Pusher.debug('Event recd', params);
|
701
|
+
|
702
|
+
switch (params.event) {
|
703
|
+
case 'pusher:error':
|
704
|
+
self.emit('error', {type: 'PusherError', data: params.data});
|
705
|
+
break;
|
706
|
+
case 'pusher:ping':
|
707
|
+
self.send_event('pusher:pong', {})
|
708
|
+
break;
|
679
709
|
}
|
680
|
-
|
681
|
-
|
682
|
-
informUser('message', params);
|
710
|
+
|
711
|
+
self.emit('message', params);
|
683
712
|
}
|
684
713
|
}
|
685
714
|
|
@@ -706,7 +735,7 @@ Example:
|
|
706
735
|
|
707
736
|
return params;
|
708
737
|
} catch (e) {
|
709
|
-
|
738
|
+
self.emit('error', {type: 'MessageParseError', error: e, data: event.data});
|
710
739
|
}
|
711
740
|
}
|
712
741
|
|
@@ -715,7 +744,7 @@ Example:
|
|
715
744
|
}
|
716
745
|
|
717
746
|
function ws_onError() {
|
718
|
-
|
747
|
+
self.emit('error', {
|
719
748
|
type: 'WebSocketError'
|
720
749
|
});
|
721
750
|
|
@@ -724,10 +753,6 @@ Example:
|
|
724
753
|
self._machine.transition('impermanentlyClosing');
|
725
754
|
}
|
726
755
|
|
727
|
-
function informUser(eventName, data) {
|
728
|
-
self.emit(eventName, data);
|
729
|
-
}
|
730
|
-
|
731
756
|
function triggerStateChange(newState, data) {
|
732
757
|
// avoid emitting and changing the state
|
733
758
|
// multiple times when it's the same.
|
@@ -746,7 +771,7 @@ Example:
|
|
746
771
|
|
747
772
|
Connection.prototype.connect = function() {
|
748
773
|
// no WebSockets
|
749
|
-
if (Pusher.Transport === null ||
|
774
|
+
if (Pusher.Transport === null || Pusher.Transport === undefined) {
|
750
775
|
this._machine.transition('failed');
|
751
776
|
}
|
752
777
|
// initial open of connection
|
@@ -773,12 +798,19 @@ Example:
|
|
773
798
|
}
|
774
799
|
};
|
775
800
|
|
776
|
-
Connection.prototype.
|
777
|
-
|
778
|
-
|
779
|
-
|
801
|
+
Connection.prototype.send_event = function(event_name, data, channel) {
|
802
|
+
var payload = {
|
803
|
+
event: event_name,
|
804
|
+
data: data
|
805
|
+
};
|
806
|
+
if (channel) payload['channel'] = channel;
|
780
807
|
|
781
|
-
Pusher.debug('
|
808
|
+
Pusher.debug('Event sent', payload);
|
809
|
+
return this.send(JSON.stringify(payload));
|
810
|
+
}
|
811
|
+
|
812
|
+
Connection.prototype.disconnect = function() {
|
813
|
+
if (this._machine.is('permanentlyClosed')) return;
|
782
814
|
|
783
815
|
if (this._machine.is('waiting')) {
|
784
816
|
this._machine.transition('permanentlyClosed');
|
@@ -823,15 +855,17 @@ Pusher.Channels.prototype = {
|
|
823
855
|
};
|
824
856
|
|
825
857
|
Pusher.Channel = function(channel_name, pusher) {
|
826
|
-
var
|
827
|
-
Pusher.EventsDispatcher.call(this)
|
858
|
+
var self = this;
|
859
|
+
Pusher.EventsDispatcher.call(this, function(event_name, event_data) {
|
860
|
+
Pusher.debug('No callbacks on ' + channel_name + ' for ' + event_name);
|
861
|
+
});
|
828
862
|
|
829
863
|
this.pusher = pusher;
|
830
864
|
this.name = channel_name;
|
831
865
|
this.subscribed = false;
|
832
866
|
|
833
|
-
this.bind('pusher_internal:subscription_succeeded', function(
|
834
|
-
|
867
|
+
this.bind('pusher_internal:subscription_succeeded', function(data) {
|
868
|
+
self.onSubscriptionSucceeded(data);
|
835
869
|
});
|
836
870
|
};
|
837
871
|
|
@@ -840,18 +874,9 @@ Pusher.Channel.prototype = {
|
|
840
874
|
init: function() {},
|
841
875
|
disconnect: function() {},
|
842
876
|
|
843
|
-
|
844
|
-
acknowledge_subscription: function(data){
|
877
|
+
onSubscriptionSucceeded: function(data) {
|
845
878
|
this.subscribed = true;
|
846
|
-
this.
|
847
|
-
},
|
848
|
-
|
849
|
-
is_private: function(){
|
850
|
-
return false;
|
851
|
-
},
|
852
|
-
|
853
|
-
is_presence: function(){
|
854
|
-
return false;
|
879
|
+
this.emit('pusher:subscription_succeeded');
|
855
880
|
},
|
856
881
|
|
857
882
|
authorize: function(pusher, callback){
|
@@ -897,7 +922,7 @@ Pusher.authorizers = {
|
|
897
922
|
callback(false, data);
|
898
923
|
}
|
899
924
|
} else {
|
900
|
-
Pusher.
|
925
|
+
Pusher.warn("Couldn't get auth info from your webapp", status);
|
901
926
|
callback(true, xhr.status);
|
902
927
|
}
|
903
928
|
}
|
@@ -919,27 +944,22 @@ Pusher.authorizers = {
|
|
919
944
|
};
|
920
945
|
|
921
946
|
Pusher.Channel.PrivateChannel = {
|
922
|
-
is_private: function(){
|
923
|
-
return true;
|
924
|
-
},
|
925
|
-
|
926
947
|
authorize: function(pusher, callback){
|
927
948
|
Pusher.authorizers[Pusher.channel_auth_transport].scopedTo(this)(pusher, callback);
|
928
949
|
}
|
929
950
|
};
|
930
951
|
|
931
952
|
Pusher.Channel.PresenceChannel = {
|
932
|
-
|
933
953
|
init: function(){
|
934
954
|
this.bind('pusher_internal:member_added', function(data){
|
935
955
|
var member = this.members.add(data.user_id, data.user_info);
|
936
|
-
this.
|
956
|
+
this.emit('pusher:member_added', member);
|
937
957
|
}.scopedTo(this))
|
938
958
|
|
939
959
|
this.bind('pusher_internal:member_removed', function(data){
|
940
960
|
var member = this.members.remove(data.user_id);
|
941
961
|
if (member) {
|
942
|
-
this.
|
962
|
+
this.emit('pusher:member_removed', member);
|
943
963
|
}
|
944
964
|
}.scopedTo(this))
|
945
965
|
},
|
@@ -948,16 +968,12 @@ Pusher.Channel.PresenceChannel = {
|
|
948
968
|
this.members.clear();
|
949
969
|
},
|
950
970
|
|
951
|
-
|
952
|
-
this.members._members_map =
|
953
|
-
this.members.count =
|
971
|
+
onSubscriptionSucceeded: function(data) {
|
972
|
+
this.members._members_map = data.presence.hash;
|
973
|
+
this.members.count = data.presence.count;
|
954
974
|
this.subscribed = true;
|
955
975
|
|
956
|
-
this.
|
957
|
-
},
|
958
|
-
|
959
|
-
is_presence: function(){
|
960
|
-
return true;
|
976
|
+
this.emit('pusher:subscription_succeeded', this.members);
|
961
977
|
},
|
962
978
|
|
963
979
|
members: {
|
@@ -1008,19 +1024,16 @@ Pusher.Channel.PresenceChannel = {
|
|
1008
1024
|
|
1009
1025
|
Pusher.Channel.factory = function(channel_name, pusher){
|
1010
1026
|
var channel = new Pusher.Channel(channel_name, pusher);
|
1011
|
-
if(channel_name.indexOf(
|
1027
|
+
if (channel_name.indexOf('private-') === 0) {
|
1012
1028
|
Pusher.Util.extend(channel, Pusher.Channel.PrivateChannel);
|
1013
|
-
} else if(channel_name.indexOf(
|
1029
|
+
} else if (channel_name.indexOf('presence-') === 0) {
|
1014
1030
|
Pusher.Util.extend(channel, Pusher.Channel.PrivateChannel);
|
1015
1031
|
Pusher.Util.extend(channel, Pusher.Channel.PresenceChannel);
|
1016
1032
|
};
|
1017
|
-
channel.init()
|
1033
|
+
channel.init();
|
1018
1034
|
return channel;
|
1019
1035
|
};
|
1020
1036
|
|
1021
|
-
Pusher.Channel.private_prefix = "private-";
|
1022
|
-
Pusher.Channel.presence_prefix = "presence-";
|
1023
|
-
|
1024
1037
|
var _require = (function () {
|
1025
1038
|
|
1026
1039
|
var handleScriptLoaded;
|
@@ -1074,20 +1087,20 @@ var _require = (function () {
|
|
1074
1087
|
var root = cdn + Pusher.VERSION;
|
1075
1088
|
var deps = [];
|
1076
1089
|
|
1077
|
-
if (
|
1090
|
+
if (window['JSON'] === undefined) {
|
1078
1091
|
deps.push(root + '/json2' + Pusher.dependency_suffix + '.js');
|
1079
1092
|
}
|
1080
|
-
if (
|
1093
|
+
if (window['WebSocket'] === undefined && window['MozWebSocket'] === undefined) {
|
1081
1094
|
// We manually initialize web-socket-js to iron out cross browser issues
|
1082
1095
|
window.WEB_SOCKET_DISABLE_AUTO_INITIALIZATION = true;
|
1083
1096
|
deps.push(root + '/flashfallback' + Pusher.dependency_suffix + '.js');
|
1084
1097
|
}
|
1085
1098
|
|
1086
1099
|
var initialize = function() {
|
1087
|
-
if (
|
1100
|
+
if (window['WebSocket'] === undefined && window['MozWebSocket'] === undefined) {
|
1088
1101
|
return function() {
|
1089
1102
|
// This runs after flashfallback.js has loaded
|
1090
|
-
if (
|
1103
|
+
if (window['WebSocket'] !== undefined && window['MozWebSocket'] === undefined) {
|
1091
1104
|
// window['WebSocket'] is a flash emulation of WebSocket
|
1092
1105
|
Pusher.Transport = window['WebSocket'];
|
1093
1106
|
Pusher.TransportType = 'flash';
|
@@ -1108,7 +1121,7 @@ var _require = (function () {
|
|
1108
1121
|
return function() {
|
1109
1122
|
// This is because Mozilla have decided to
|
1110
1123
|
// prefix the WebSocket constructor with "Moz".
|
1111
|
-
if (
|
1124
|
+
if (window['MozWebSocket'] !== undefined) {
|
1112
1125
|
Pusher.Transport = window['MozWebSocket'];
|
1113
1126
|
} else {
|
1114
1127
|
Pusher.Transport = window['WebSocket'];
|
metadata
CHANGED
@@ -1,35 +1,46 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: pusher_rails
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 6
|
9
|
+
version: 0.1.6
|
6
10
|
platform: ruby
|
7
|
-
authors:
|
11
|
+
authors:
|
8
12
|
- David Grandinetti
|
9
13
|
autorequire:
|
10
14
|
bindir: bin
|
11
15
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
16
|
+
|
17
|
+
date: 2012-01-23 00:00:00 +00:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: pusher
|
16
|
-
|
17
|
-
|
18
|
-
requirements:
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
19
25
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 8
|
30
|
+
- 4
|
21
31
|
version: 0.8.4
|
22
32
|
type: :runtime
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
to your app.
|
27
|
-
email:
|
33
|
+
version_requirements: *id001
|
34
|
+
description: Adds pusher.js/backpusher.js to the asset pipeline and pusher-gem to to your app.
|
35
|
+
email:
|
28
36
|
- dave@wegoto12.com
|
29
37
|
executables: []
|
38
|
+
|
30
39
|
extensions: []
|
40
|
+
|
31
41
|
extra_rdoc_files: []
|
32
|
-
|
42
|
+
|
43
|
+
files:
|
33
44
|
- .gitignore
|
34
45
|
- CHANGELOG.md
|
35
46
|
- README.md
|
@@ -37,28 +48,35 @@ files:
|
|
37
48
|
- pusher_rails.gemspec
|
38
49
|
- vendor/assets/javascripts/backpusher.js
|
39
50
|
- vendor/assets/javascripts/pusher.js
|
51
|
+
has_rdoc: true
|
40
52
|
homepage: https://github.com/dbgrandi/pusher_rails
|
41
53
|
licenses: []
|
54
|
+
|
42
55
|
post_install_message:
|
43
56
|
rdoc_options: []
|
44
|
-
|
57
|
+
|
58
|
+
require_paths:
|
45
59
|
- lib
|
46
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
requirements:
|
55
|
-
- -
|
56
|
-
- !ruby/object:Gem::Version
|
57
|
-
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
segments:
|
72
|
+
- 0
|
73
|
+
version: "0"
|
58
74
|
requirements: []
|
75
|
+
|
59
76
|
rubyforge_project:
|
60
|
-
rubygems_version: 1.
|
77
|
+
rubygems_version: 1.3.6
|
61
78
|
signing_key:
|
62
79
|
specification_version: 3
|
63
80
|
summary: Pusher integration for Rails 3.1+
|
64
81
|
test_files: []
|
82
|
+
|