centrifuge 0.0.4 → 0.0.5
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/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
|