centrifuge 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/centrifuge/version.rb +1 -1
- data/vendor/assets/javascripts/centrifuge.js +380 -74
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 09218a5c452092b2bd0c00132c2031d8fd21af6b
|
4
|
+
data.tar.gz: bb4e9c00f0859455b30bbb1dd21e163e6f8bdaed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f3d5e00f2b98b8449adc2d0ba3cb68ee3fa75ea2f2756c1356f53d7101310cd4b53f9792301a308b130e5d8de8abb8ac8a4c4ded3c4c0aabf9dbd34e29c6056
|
7
|
+
data.tar.gz: f87ab041ef3e1d061a69d4e525481aa4203dce1f3957277daad053a1003b6dfdfa5d9aa6cfcab952029d0a4d5a84b21cb5001f566f25f3f50e9d738729d66c8e
|
data/lib/centrifuge/version.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
|
2
|
-
* Centrifuge javascript client
|
3
|
-
* v0.5.2
|
4
|
-
*/
|
1
|
+
// v0.7.0
|
5
2
|
;(function () {
|
6
3
|
'use strict';
|
7
4
|
|
@@ -564,10 +561,102 @@
|
|
564
561
|
}
|
565
562
|
}
|
566
563
|
|
564
|
+
// http://krasimirtsonev.com/blog/article/Cross-browser-handling-of-Ajax-requests-in-absurdjs
|
565
|
+
var AJAX = {
|
566
|
+
request: function(url, method, ops) {
|
567
|
+
ops.data = ops.data || {};
|
568
|
+
|
569
|
+
var getParams = function(data, request_url) {
|
570
|
+
var arr = [], str;
|
571
|
+
for(var name in data) {
|
572
|
+
if (typeof data[name] === 'object') {
|
573
|
+
for (var i in data[name]) {
|
574
|
+
arr.push(name + '=' + encodeURIComponent(data[name][i]));
|
575
|
+
}
|
576
|
+
} else {
|
577
|
+
arr.push(name + '=' + encodeURIComponent(data[name]));
|
578
|
+
}
|
579
|
+
}
|
580
|
+
str = arr.join('&');
|
581
|
+
if(str != '') {
|
582
|
+
return request_url ? (request_url.indexOf('?') < 0 ? '?' + str : '&' + str) : str;
|
583
|
+
}
|
584
|
+
return '';
|
585
|
+
};
|
586
|
+
var api = {
|
587
|
+
host: {},
|
588
|
+
setHeaders: function(headers) {
|
589
|
+
for(var name in headers) {
|
590
|
+
this.xhr && this.xhr.setRequestHeader(name, headers[name]);
|
591
|
+
}
|
592
|
+
},
|
593
|
+
process: function(ops) {
|
594
|
+
var self = this;
|
595
|
+
this.xhr = null;
|
596
|
+
if (window.ActiveXObject) {
|
597
|
+
this.xhr = new ActiveXObject('Microsoft.XMLHTTP');
|
598
|
+
}
|
599
|
+
else if (window.XMLHttpRequest) {
|
600
|
+
this.xhr = new XMLHttpRequest();
|
601
|
+
}
|
602
|
+
if(this.xhr) {
|
603
|
+
this.xhr.onreadystatechange = function() {
|
604
|
+
if(self.xhr.readyState == 4 && self.xhr.status == 200) {
|
605
|
+
var result = self.xhr.responseText;
|
606
|
+
if (typeof JSON != 'undefined') {
|
607
|
+
result = JSON.parse(result);
|
608
|
+
} else {
|
609
|
+
throw "JSON undefined";
|
610
|
+
}
|
611
|
+
self.doneCallback && self.doneCallback.apply(self.host, [result, self.xhr]);
|
612
|
+
} else if(self.xhr.readyState == 4) {
|
613
|
+
self.failCallback && self.failCallback.apply(self.host, [self.xhr]);
|
614
|
+
}
|
615
|
+
self.alwaysCallback && self.alwaysCallback.apply(self.host, [self.xhr]);
|
616
|
+
}
|
617
|
+
}
|
618
|
+
if(method == 'get') {
|
619
|
+
this.xhr.open("GET", url + getParams(ops.data, url), true);
|
620
|
+
} else {
|
621
|
+
this.xhr.open(method, url, true);
|
622
|
+
this.setHeaders({
|
623
|
+
'X-Requested-With': 'XMLHttpRequest',
|
624
|
+
'Content-type': 'application/x-www-form-urlencoded'
|
625
|
+
});
|
626
|
+
}
|
627
|
+
if(ops.headers && typeof ops.headers == 'object') {
|
628
|
+
this.setHeaders(ops.headers);
|
629
|
+
}
|
630
|
+
setTimeout(function() {
|
631
|
+
method == 'get' ? self.xhr.send() : self.xhr.send(getParams(ops.data));
|
632
|
+
}, 20);
|
633
|
+
return this;
|
634
|
+
},
|
635
|
+
done: function(callback) {
|
636
|
+
this.doneCallback = callback;
|
637
|
+
return this;
|
638
|
+
},
|
639
|
+
fail: function(callback) {
|
640
|
+
this.failCallback = callback;
|
641
|
+
return this;
|
642
|
+
},
|
643
|
+
always: function(callback) {
|
644
|
+
this.alwaysCallback = callback;
|
645
|
+
return this;
|
646
|
+
}
|
647
|
+
};
|
648
|
+
return api.process(ops);
|
649
|
+
}
|
650
|
+
};
|
651
|
+
|
567
652
|
function endsWith(value, suffix) {
|
568
653
|
return value.indexOf(suffix, value.length - suffix.length) !== -1;
|
569
654
|
}
|
570
655
|
|
656
|
+
function startsWith(value, prefix) {
|
657
|
+
return value.lastIndexOf(prefix, 0) === 0;
|
658
|
+
}
|
659
|
+
|
571
660
|
function stripSlash(value) {
|
572
661
|
if (value.substring(value.length - 1) == "/") {
|
573
662
|
value = value.substring(0, value.length - 1);
|
@@ -608,10 +697,14 @@
|
|
608
697
|
this._subscriptions = {};
|
609
698
|
this._messages = [];
|
610
699
|
this._isBatching = false;
|
700
|
+
this._isAuthBatching = false;
|
701
|
+
this._authChannels = {};
|
702
|
+
this._refreshTimeout = null;
|
611
703
|
this._config = {
|
612
704
|
retry: 3000,
|
613
705
|
info: null,
|
614
706
|
debug: false,
|
707
|
+
insecure: false,
|
615
708
|
server: null,
|
616
709
|
protocols_whitelist: [
|
617
710
|
'websocket',
|
@@ -623,7 +716,12 @@
|
|
623
716
|
'xhr-polling',
|
624
717
|
'iframe-xhr-polling',
|
625
718
|
'jsonp-polling'
|
626
|
-
]
|
719
|
+
],
|
720
|
+
privateChannelPrefix: "$",
|
721
|
+
refreshEndpoint: "/centrifuge/refresh",
|
722
|
+
authEndpoint: "/centrifuge/auth",
|
723
|
+
authHeaders: {},
|
724
|
+
refreshHeaders: {}
|
627
725
|
};
|
628
726
|
if (options) {
|
629
727
|
this.configure(options);
|
@@ -632,15 +730,15 @@
|
|
632
730
|
|
633
731
|
extend(Centrifuge, EventEmitter);
|
634
732
|
|
635
|
-
var
|
733
|
+
var centrifugeProto = Centrifuge.prototype;
|
636
734
|
|
637
|
-
|
735
|
+
centrifugeProto._debug = function () {
|
638
736
|
if (this._config.debug === true) {
|
639
737
|
log('debug', arguments);
|
640
738
|
}
|
641
739
|
};
|
642
740
|
|
643
|
-
|
741
|
+
centrifugeProto._configure = function (configuration) {
|
644
742
|
this._debug('Configuring centrifuge object with', configuration);
|
645
743
|
|
646
744
|
if (!configuration) {
|
@@ -653,20 +751,33 @@
|
|
653
751
|
throw 'Missing required configuration parameter \'url\' specifying the Centrifuge server URL';
|
654
752
|
}
|
655
753
|
|
656
|
-
if (!this._config.token) {
|
657
|
-
throw 'Missing required configuration parameter \'token\' specifying the sign of authorization request';
|
658
|
-
}
|
659
|
-
|
660
754
|
if (!this._config.project) {
|
661
755
|
throw 'Missing required configuration parameter \'project\' specifying project ID in Centrifuge';
|
662
756
|
}
|
663
757
|
|
664
758
|
if (!this._config.user && this._config.user !== '') {
|
665
|
-
|
759
|
+
if (!this._config.insecure) {
|
760
|
+
throw 'Missing required configuration parameter \'user\' specifying user\'s unique ID in your application';
|
761
|
+
} else {
|
762
|
+
this._debug("user not found but this is OK for insecure mode - anonymous access will be used");
|
763
|
+
this._config.user = "";
|
764
|
+
}
|
666
765
|
}
|
667
766
|
|
668
767
|
if (!this._config.timestamp) {
|
669
|
-
|
768
|
+
if (!this._config.insecure) {
|
769
|
+
throw 'Missing required configuration parameter \'timestamp\'';
|
770
|
+
} else {
|
771
|
+
this._debug("token not found but this is OK for insecure mode");
|
772
|
+
}
|
773
|
+
}
|
774
|
+
|
775
|
+
if (!this._config.token) {
|
776
|
+
if (!this._config.insecure) {
|
777
|
+
throw 'Missing required configuration parameter \'token\' specifying the sign of authorization request';
|
778
|
+
} else {
|
779
|
+
this._debug("timestamp not found but this is OK for insecure mode");
|
780
|
+
}
|
670
781
|
}
|
671
782
|
|
672
783
|
this._config.url = stripSlash(this._config.url);
|
@@ -680,30 +791,34 @@
|
|
680
791
|
}
|
681
792
|
};
|
682
793
|
|
683
|
-
|
794
|
+
centrifugeProto._setStatus = function (newStatus) {
|
684
795
|
if (this._status !== newStatus) {
|
685
796
|
this._debug('Status', this._status, '->', newStatus);
|
686
797
|
this._status = newStatus;
|
687
798
|
}
|
688
799
|
};
|
689
800
|
|
690
|
-
|
801
|
+
centrifugeProto._isDisconnected = function () {
|
691
802
|
return this._isConnected() === false;
|
692
803
|
};
|
693
804
|
|
694
|
-
|
805
|
+
centrifugeProto._isConnected = function () {
|
695
806
|
return this._status === 'connected';
|
696
807
|
};
|
697
808
|
|
698
|
-
|
809
|
+
centrifugeProto._isConnecting = function () {
|
810
|
+
return this._status === 'connecting';
|
811
|
+
};
|
812
|
+
|
813
|
+
centrifugeProto._nextMessageId = function () {
|
699
814
|
return ++this._messageId;
|
700
815
|
};
|
701
816
|
|
702
|
-
|
817
|
+
centrifugeProto._clearSubscriptions = function () {
|
703
818
|
this._subscriptions = {};
|
704
819
|
};
|
705
820
|
|
706
|
-
|
821
|
+
centrifugeProto._send = function (messages) {
|
707
822
|
// We must be sure that the messages have a clientId.
|
708
823
|
// This is not guaranteed since the handshake may take time to return
|
709
824
|
// (and hence the clientId is not known yet) and the application
|
@@ -721,7 +836,11 @@
|
|
721
836
|
}
|
722
837
|
};
|
723
838
|
|
724
|
-
|
839
|
+
centrifugeProto._connect = function (callback) {
|
840
|
+
|
841
|
+
if (this.isConnected()) {
|
842
|
+
return;
|
843
|
+
}
|
725
844
|
|
726
845
|
this._clientId = null;
|
727
846
|
|
@@ -759,18 +878,18 @@
|
|
759
878
|
var centrifugeMessage = {
|
760
879
|
'method': 'connect',
|
761
880
|
'params': {
|
762
|
-
'token': self._config.token,
|
763
881
|
'user': self._config.user,
|
764
|
-
'project': self._config.project
|
765
|
-
'timestamp': self._config.timestamp
|
882
|
+
'project': self._config.project
|
766
883
|
}
|
767
884
|
};
|
768
885
|
|
769
886
|
if (self._config.info !== null) {
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
887
|
+
centrifugeMessage["params"]["info"] = self._config.info;
|
888
|
+
}
|
889
|
+
|
890
|
+
if (!self._config.insecure) {
|
891
|
+
centrifugeMessage["params"]["timestamp"] = self._config.timestamp;
|
892
|
+
centrifugeMessage["params"]["token"] = self._config.token;
|
774
893
|
}
|
775
894
|
self.send(centrifugeMessage);
|
776
895
|
};
|
@@ -799,7 +918,7 @@
|
|
799
918
|
};
|
800
919
|
};
|
801
920
|
|
802
|
-
|
921
|
+
centrifugeProto._disconnect = function () {
|
803
922
|
this._clientId = null;
|
804
923
|
this._setStatus('disconnected');
|
805
924
|
this._subscriptions = {};
|
@@ -807,7 +926,7 @@
|
|
807
926
|
this._transport.close();
|
808
927
|
};
|
809
928
|
|
810
|
-
|
929
|
+
centrifugeProto._getSubscription = function (channel) {
|
811
930
|
var subscription;
|
812
931
|
subscription = this._subscriptions[channel];
|
813
932
|
if (!subscription) {
|
@@ -816,37 +935,60 @@
|
|
816
935
|
return subscription;
|
817
936
|
};
|
818
937
|
|
819
|
-
|
938
|
+
centrifugeProto._removeSubscription = function (channel) {
|
820
939
|
try {
|
821
940
|
delete this._subscriptions[channel];
|
822
941
|
} catch (e) {
|
823
942
|
this._debug('nothing to delete for channel ', channel);
|
824
943
|
}
|
944
|
+
try {
|
945
|
+
delete this._authChannels[channel];
|
946
|
+
} catch (e) {
|
947
|
+
this._debug('nothing to delete from authChannels for channel ', channel);
|
948
|
+
}
|
825
949
|
};
|
826
950
|
|
827
|
-
|
951
|
+
centrifugeProto._connectResponse = function (message) {
|
952
|
+
if (this.isConnected()) {
|
953
|
+
return;
|
954
|
+
}
|
828
955
|
if (message.error === null) {
|
829
|
-
|
956
|
+
if (!message.body) {
|
957
|
+
return;
|
958
|
+
}
|
959
|
+
var isExpired = message.body.expired;
|
960
|
+
if (isExpired) {
|
961
|
+
this.refresh();
|
962
|
+
return;
|
963
|
+
}
|
964
|
+
this._clientId = message.body.client;
|
830
965
|
this._setStatus('connected');
|
831
966
|
this.trigger('connect', [message]);
|
967
|
+
if (this._refreshTimeout) {
|
968
|
+
window.clearTimeout(this._refreshTimeout);
|
969
|
+
}
|
970
|
+
if (message.body.ttl !== null) {
|
971
|
+
var self = this;
|
972
|
+
this._refreshTimeout = window.setTimeout(function() {
|
973
|
+
self.refresh.call(self);
|
974
|
+
}, message.body.ttl * 1000);
|
975
|
+
}
|
832
976
|
} else {
|
833
977
|
this.trigger('error', [message]);
|
834
978
|
this.trigger('connect:error', [message]);
|
835
979
|
}
|
836
980
|
};
|
837
981
|
|
838
|
-
|
982
|
+
centrifugeProto._disconnectResponse = function (message) {
|
839
983
|
if (message.error === null) {
|
840
984
|
this.disconnect();
|
841
|
-
//this.trigger('disconnect', [message]);
|
842
|
-
//this.trigger('disconnect:success', [message]);
|
843
985
|
} else {
|
844
986
|
this.trigger('error', [message]);
|
845
987
|
this.trigger('disconnect:error', [message.error]);
|
846
988
|
}
|
847
989
|
};
|
848
990
|
|
849
|
-
|
991
|
+
centrifugeProto._subscribeResponse = function (message) {
|
850
992
|
if (message.error !== null) {
|
851
993
|
this.trigger('error', [message]);
|
852
994
|
}
|
@@ -868,7 +1010,7 @@
|
|
868
1010
|
}
|
869
1011
|
};
|
870
1012
|
|
871
|
-
|
1013
|
+
centrifugeProto._unsubscribeResponse = function (message) {
|
872
1014
|
var body = message.body;
|
873
1015
|
var channel = body.channel;
|
874
1016
|
var subscription = this.getSubscription(channel);
|
@@ -881,7 +1023,7 @@
|
|
881
1023
|
}
|
882
1024
|
};
|
883
1025
|
|
884
|
-
|
1026
|
+
centrifugeProto._publishResponse = function (message) {
|
885
1027
|
var body = message.body;
|
886
1028
|
var channel = body.channel;
|
887
1029
|
var subscription = this.getSubscription(channel);
|
@@ -896,7 +1038,7 @@
|
|
896
1038
|
}
|
897
1039
|
};
|
898
1040
|
|
899
|
-
|
1041
|
+
centrifugeProto._presenceResponse = function (message) {
|
900
1042
|
var body = message.body;
|
901
1043
|
var channel = body.channel;
|
902
1044
|
var subscription = this.getSubscription(channel);
|
@@ -912,7 +1054,7 @@
|
|
912
1054
|
}
|
913
1055
|
};
|
914
1056
|
|
915
|
-
|
1057
|
+
centrifugeProto._historyResponse = function (message) {
|
916
1058
|
var body = message.body;
|
917
1059
|
var channel = body.channel;
|
918
1060
|
var subscription = this.getSubscription(channel);
|
@@ -928,7 +1070,7 @@
|
|
928
1070
|
}
|
929
1071
|
};
|
930
1072
|
|
931
|
-
|
1073
|
+
centrifugeProto._joinResponse = function(message) {
|
932
1074
|
var body = message.body;
|
933
1075
|
var channel = body.channel;
|
934
1076
|
var subscription = this.getSubscription(channel);
|
@@ -938,7 +1080,7 @@
|
|
938
1080
|
subscription.trigger('join', [body]);
|
939
1081
|
};
|
940
1082
|
|
941
|
-
|
1083
|
+
centrifugeProto._leaveResponse = function(message) {
|
942
1084
|
var body = message.body;
|
943
1085
|
var channel = body.channel;
|
944
1086
|
var subscription = this.getSubscription(channel);
|
@@ -948,7 +1090,7 @@
|
|
948
1090
|
subscription.trigger('leave', [body]);
|
949
1091
|
};
|
950
1092
|
|
951
|
-
|
1093
|
+
centrifugeProto._messageResponse = function (message) {
|
952
1094
|
var body = message.body;
|
953
1095
|
var channel = body.channel;
|
954
1096
|
var subscription = this.getSubscription(channel);
|
@@ -958,7 +1100,19 @@
|
|
958
1100
|
subscription.trigger('message', [body]);
|
959
1101
|
};
|
960
1102
|
|
961
|
-
|
1103
|
+
centrifugeProto._refreshResponse = function (message) {
|
1104
|
+
if (this._refreshTimeout) {
|
1105
|
+
window.clearTimeout(this._refreshTimeout);
|
1106
|
+
}
|
1107
|
+
if (message.body.ttl !== null) {
|
1108
|
+
var self = this;
|
1109
|
+
self._refreshTimeout = window.setTimeout(function () {
|
1110
|
+
self.refresh.call(self);
|
1111
|
+
}, message.body.ttl * 1000);
|
1112
|
+
}
|
1113
|
+
};
|
1114
|
+
|
1115
|
+
centrifugeProto._dispatchMessage = function(message) {
|
962
1116
|
if (message === undefined || message === null) {
|
963
1117
|
return;
|
964
1118
|
}
|
@@ -999,6 +1153,9 @@
|
|
999
1153
|
break;
|
1000
1154
|
case 'ping':
|
1001
1155
|
break;
|
1156
|
+
case 'refresh':
|
1157
|
+
this._refreshResponse(message);
|
1158
|
+
break;
|
1002
1159
|
case 'message':
|
1003
1160
|
this._messageResponse(message);
|
1004
1161
|
break;
|
@@ -1007,7 +1164,7 @@
|
|
1007
1164
|
}
|
1008
1165
|
};
|
1009
1166
|
|
1010
|
-
|
1167
|
+
centrifugeProto._receive = function (data) {
|
1011
1168
|
if (Object.prototype.toString.call(data) === Object.prototype.toString.call([])) {
|
1012
1169
|
for (var i in data) {
|
1013
1170
|
if (data.hasOwnProperty(i)) {
|
@@ -1020,13 +1177,13 @@
|
|
1020
1177
|
}
|
1021
1178
|
};
|
1022
1179
|
|
1023
|
-
|
1180
|
+
centrifugeProto._flush = function() {
|
1024
1181
|
var messages = this._messages.slice(0);
|
1025
1182
|
this._messages = [];
|
1026
1183
|
this._send(messages);
|
1027
1184
|
};
|
1028
1185
|
|
1029
|
-
|
1186
|
+
centrifugeProto._ping = function () {
|
1030
1187
|
var centrifugeMessage = {
|
1031
1188
|
"method": "ping",
|
1032
1189
|
"params": {}
|
@@ -1036,27 +1193,29 @@
|
|
1036
1193
|
|
1037
1194
|
/* PUBLIC API */
|
1038
1195
|
|
1039
|
-
|
1196
|
+
centrifugeProto.getClientId = function () {
|
1040
1197
|
return this._clientId;
|
1041
1198
|
};
|
1042
1199
|
|
1043
|
-
|
1200
|
+
centrifugeProto.isConnected = centrifugeProto._isConnected;
|
1044
1201
|
|
1045
|
-
|
1202
|
+
centrifugeProto.isConnecting = centrifugeProto._isConnecting;
|
1046
1203
|
|
1047
|
-
|
1204
|
+
centrifugeProto.isDisconnected = centrifugeProto._isDisconnected;
|
1205
|
+
|
1206
|
+
centrifugeProto.configure = function (configuration) {
|
1048
1207
|
this._configure.call(this, configuration);
|
1049
1208
|
};
|
1050
1209
|
|
1051
|
-
|
1210
|
+
centrifugeProto.connect = centrifugeProto._connect;
|
1052
1211
|
|
1053
|
-
|
1212
|
+
centrifugeProto.disconnect = centrifugeProto._disconnect;
|
1054
1213
|
|
1055
|
-
|
1214
|
+
centrifugeProto.getSubscription = centrifugeProto._getSubscription;
|
1056
1215
|
|
1057
|
-
|
1216
|
+
centrifugeProto.ping = centrifugeProto._ping;
|
1058
1217
|
|
1059
|
-
|
1218
|
+
centrifugeProto.send = function (message) {
|
1060
1219
|
if (this._isBatching === true) {
|
1061
1220
|
this._messages.push(message);
|
1062
1221
|
} else {
|
@@ -1064,13 +1223,13 @@
|
|
1064
1223
|
}
|
1065
1224
|
};
|
1066
1225
|
|
1067
|
-
|
1226
|
+
centrifugeProto.startBatching = function () {
|
1068
1227
|
// start collecting messages without sending them to Centrifuge until flush
|
1069
1228
|
// method called
|
1070
1229
|
this._isBatching = true;
|
1071
1230
|
};
|
1072
1231
|
|
1073
|
-
|
1232
|
+
centrifugeProto.stopBatching = function(flush) {
|
1074
1233
|
// stop collecting messages
|
1075
1234
|
flush = flush || false;
|
1076
1235
|
this._isBatching = false;
|
@@ -1079,11 +1238,96 @@
|
|
1079
1238
|
}
|
1080
1239
|
};
|
1081
1240
|
|
1082
|
-
|
1241
|
+
centrifugeProto.flush = function() {
|
1242
|
+
// send batched messages to Centrifuge
|
1083
1243
|
this._flush();
|
1084
1244
|
};
|
1085
1245
|
|
1086
|
-
|
1246
|
+
centrifugeProto.startAuthBatching = function() {
|
1247
|
+
// start collecting private channels to create bulk authentication
|
1248
|
+
// request to authEndpoint when stopAuthBatching will be called
|
1249
|
+
this._isAuthBatching = true;
|
1250
|
+
};
|
1251
|
+
|
1252
|
+
centrifugeProto.stopAuthBatching = function(callback) {
|
1253
|
+
// create request to authEndpoint with collected private channels
|
1254
|
+
// to ask if this client can subscribe on each channel
|
1255
|
+
this._isAuthBatching = false;
|
1256
|
+
var authChannels = this._authChannels;
|
1257
|
+
this._authChannels = {};
|
1258
|
+
var channels = [];
|
1259
|
+
|
1260
|
+
for (var channel in authChannels) {
|
1261
|
+
var subscription = this.getSubscription(channel);
|
1262
|
+
if (!subscription) {
|
1263
|
+
continue;
|
1264
|
+
}
|
1265
|
+
channels.push(channel);
|
1266
|
+
}
|
1267
|
+
|
1268
|
+
if (channels.length == 0) {
|
1269
|
+
if (callback) {
|
1270
|
+
callback();
|
1271
|
+
}
|
1272
|
+
return;
|
1273
|
+
}
|
1274
|
+
|
1275
|
+
var data = {
|
1276
|
+
"client": this.getClientId(),
|
1277
|
+
"channels": channels
|
1278
|
+
};
|
1279
|
+
|
1280
|
+
var self = this;
|
1281
|
+
|
1282
|
+
AJAX.request(this._config.authEndpoint, "post", {
|
1283
|
+
"headers": this._config.authHeaders,
|
1284
|
+
"data": data
|
1285
|
+
}).done(function(data) {
|
1286
|
+
for (var i in channels) {
|
1287
|
+
var channel = channels[i];
|
1288
|
+
var channelResponse = data[channel];
|
1289
|
+
if (!channelResponse) {
|
1290
|
+
// subscription:error
|
1291
|
+
self._subscribeResponse({
|
1292
|
+
"error": 404,
|
1293
|
+
"body": {
|
1294
|
+
"channel": channel
|
1295
|
+
}
|
1296
|
+
});
|
1297
|
+
continue;
|
1298
|
+
}
|
1299
|
+
if (!channelResponse.status || channelResponse.status === 200) {
|
1300
|
+
var centrifugeMessage = {
|
1301
|
+
"method": "subscribe",
|
1302
|
+
"params": {
|
1303
|
+
"channel": channel,
|
1304
|
+
"client": self.getClientId(),
|
1305
|
+
"info": channelResponse.info,
|
1306
|
+
"sign": channelResponse.sign
|
1307
|
+
}
|
1308
|
+
};
|
1309
|
+
self.send(centrifugeMessage);
|
1310
|
+
} else {
|
1311
|
+
self._subscribeResponse({
|
1312
|
+
"error": channelResponse.status,
|
1313
|
+
"body": {
|
1314
|
+
"channel": channel
|
1315
|
+
}
|
1316
|
+
});
|
1317
|
+
}
|
1318
|
+
}
|
1319
|
+
}).fail(function() {
|
1320
|
+
log("info", "authorization request failed");
|
1321
|
+
return false;
|
1322
|
+
}).always(function(){
|
1323
|
+
if (callback) {
|
1324
|
+
callback();
|
1325
|
+
}
|
1326
|
+
})
|
1327
|
+
|
1328
|
+
};
|
1329
|
+
|
1330
|
+
centrifugeProto.subscribe = function (channel, callback) {
|
1087
1331
|
|
1088
1332
|
if (arguments.length < 1) {
|
1089
1333
|
throw 'Illegal arguments number: required 1, got ' + arguments.length;
|
@@ -1107,7 +1351,7 @@
|
|
1107
1351
|
}
|
1108
1352
|
};
|
1109
1353
|
|
1110
|
-
|
1354
|
+
centrifugeProto.unsubscribe = function (channel) {
|
1111
1355
|
if (arguments.length < 1) {
|
1112
1356
|
throw 'Illegal arguments number: required 1, got ' + arguments.length;
|
1113
1357
|
}
|
@@ -1124,7 +1368,7 @@
|
|
1124
1368
|
}
|
1125
1369
|
};
|
1126
1370
|
|
1127
|
-
|
1371
|
+
centrifugeProto.publish = function (channel, data, callback) {
|
1128
1372
|
var subscription = this.getSubscription(channel);
|
1129
1373
|
if (subscription === null) {
|
1130
1374
|
this._debug("subscription not found for channel " + channel);
|
@@ -1134,7 +1378,7 @@
|
|
1134
1378
|
return subscription;
|
1135
1379
|
};
|
1136
1380
|
|
1137
|
-
|
1381
|
+
centrifugeProto.presence = function (channel, callback) {
|
1138
1382
|
var subscription = this.getSubscription(channel);
|
1139
1383
|
if (subscription === null) {
|
1140
1384
|
this._debug("subscription not found for channel " + channel);
|
@@ -1144,7 +1388,7 @@
|
|
1144
1388
|
return subscription;
|
1145
1389
|
};
|
1146
1390
|
|
1147
|
-
|
1391
|
+
centrifugeProto.history = function (channel, callback) {
|
1148
1392
|
var subscription = this.getSubscription(channel);
|
1149
1393
|
if (subscription === null) {
|
1150
1394
|
this._debug("subscription not found for channel " + channel);
|
@@ -1154,6 +1398,49 @@
|
|
1154
1398
|
return subscription;
|
1155
1399
|
};
|
1156
1400
|
|
1401
|
+
centrifugeProto.refresh = function () {
|
1402
|
+
// ask web app for connection parameters - project ID, user ID,
|
1403
|
+
// timestamp, info and token
|
1404
|
+
var self = this;
|
1405
|
+
this._debug('refresh');
|
1406
|
+
AJAX.request(this._config.refreshEndpoint, "post", {
|
1407
|
+
"headers": this._config.refreshHeaders,
|
1408
|
+
"data": {}
|
1409
|
+
}).done(function(data) {
|
1410
|
+
self._config.user = data.user;
|
1411
|
+
self._config.project = data.project;
|
1412
|
+
self._config.timestamp = data.timestamp;
|
1413
|
+
self._config.info = data.info;
|
1414
|
+
self._config.token = data.token;
|
1415
|
+
if (self._reconnect && self.isDisconnected()) {
|
1416
|
+
self.connect();
|
1417
|
+
} else {
|
1418
|
+
var centrifugeMessage = {
|
1419
|
+
"method": "refresh",
|
1420
|
+
"params": {
|
1421
|
+
'user': self._config.user,
|
1422
|
+
'project': self._config.project,
|
1423
|
+
'timestamp': self._config.timestamp,
|
1424
|
+
'info': self._config.info,
|
1425
|
+
'token': self._config.token
|
1426
|
+
}
|
1427
|
+
};
|
1428
|
+
self.send(centrifugeMessage);
|
1429
|
+
}
|
1430
|
+
}).fail(function(xhr){
|
1431
|
+
// 403 or 500 - does not matter - if connection check activated then Centrifuge
|
1432
|
+
// will disconnect client eventually
|
1433
|
+
self._debug(xhr);
|
1434
|
+
self._debug("error getting connect parameters");
|
1435
|
+
if (self._refreshTimeout) {
|
1436
|
+
window.clearTimeout(self._refreshTimeout);
|
1437
|
+
}
|
1438
|
+
self._refreshTimeout = window.setTimeout(function(){
|
1439
|
+
self.refresh.call(self);
|
1440
|
+
}, 3000);
|
1441
|
+
});
|
1442
|
+
};
|
1443
|
+
|
1157
1444
|
function Subscription(centrifuge, channel) {
|
1158
1445
|
/**
|
1159
1446
|
* The constructor for a centrifuge object, identified by an optional name.
|
@@ -1166,30 +1453,49 @@
|
|
1166
1453
|
|
1167
1454
|
extend(Subscription, EventEmitter);
|
1168
1455
|
|
1169
|
-
var
|
1456
|
+
var subscriptionProto = Subscription.prototype;
|
1170
1457
|
|
1171
|
-
|
1458
|
+
subscriptionProto.getChannel = function () {
|
1172
1459
|
return this.channel;
|
1173
1460
|
};
|
1174
1461
|
|
1175
|
-
|
1462
|
+
subscriptionProto.getCentrifuge = function () {
|
1176
1463
|
return this._centrifuge;
|
1177
1464
|
};
|
1178
1465
|
|
1179
|
-
|
1466
|
+
subscriptionProto.subscribe = function (callback) {
|
1467
|
+
/*
|
1468
|
+
If channel name does not start with privateChannelPrefix - then we
|
1469
|
+
can just send subscription message to Centrifuge. If channel name
|
1470
|
+
starts with privateChannelPrefix - then this is a private channel
|
1471
|
+
and we should ask web application backend for permission first.
|
1472
|
+
*/
|
1180
1473
|
var centrifugeMessage = {
|
1181
1474
|
"method": "subscribe",
|
1182
1475
|
"params": {
|
1183
1476
|
"channel": this.channel
|
1184
1477
|
}
|
1185
1478
|
};
|
1186
|
-
|
1479
|
+
|
1480
|
+
if (startsWith(this.channel, this._centrifuge._config.privateChannelPrefix)) {
|
1481
|
+
// private channel
|
1482
|
+
if (this._centrifuge._isAuthBatching) {
|
1483
|
+
this._centrifuge._authChannels[this.channel] = true;
|
1484
|
+
} else {
|
1485
|
+
this._centrifuge.startAuthBatching();
|
1486
|
+
this.subscribe(callback);
|
1487
|
+
this._centrifuge.stopAuthBatching();
|
1488
|
+
}
|
1489
|
+
} else {
|
1490
|
+
this._centrifuge.send(centrifugeMessage);
|
1491
|
+
}
|
1492
|
+
|
1187
1493
|
if (callback) {
|
1188
1494
|
this.on('message', callback);
|
1189
1495
|
}
|
1190
1496
|
};
|
1191
1497
|
|
1192
|
-
|
1498
|
+
subscriptionProto.unsubscribe = function () {
|
1193
1499
|
this._centrifuge._removeSubscription(this.channel);
|
1194
1500
|
var centrifugeMessage = {
|
1195
1501
|
"method": "unsubscribe",
|
@@ -1200,7 +1506,7 @@
|
|
1200
1506
|
this._centrifuge.send(centrifugeMessage);
|
1201
1507
|
};
|
1202
1508
|
|
1203
|
-
|
1509
|
+
subscriptionProto.publish = function (data, callback) {
|
1204
1510
|
var centrifugeMessage = {
|
1205
1511
|
"method": "publish",
|
1206
1512
|
"params": {
|
@@ -1214,7 +1520,7 @@
|
|
1214
1520
|
this._centrifuge.send(centrifugeMessage);
|
1215
1521
|
};
|
1216
1522
|
|
1217
|
-
|
1523
|
+
subscriptionProto.presence = function (callback) {
|
1218
1524
|
var centrifugeMessage = {
|
1219
1525
|
"method": "presence",
|
1220
1526
|
"params": {
|
@@ -1227,7 +1533,7 @@
|
|
1227
1533
|
this._centrifuge.send(centrifugeMessage);
|
1228
1534
|
};
|
1229
1535
|
|
1230
|
-
|
1536
|
+
subscriptionProto.history = function (callback) {
|
1231
1537
|
var centrifugeMessage = {
|
1232
1538
|
"method": "history",
|
1233
1539
|
"params": {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: centrifuge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oleg Bovykin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|