mirror of https://github.com/calzoneman/sync.git
Fixes, rate limiting
This commit is contained in:
parent
cfc866400c
commit
2c57d2a8f2
|
@ -14,6 +14,23 @@ var NotWebsocket = function() {
|
||||||
this.handlers = {};
|
this.handlers = {};
|
||||||
this.room = "";
|
this.room = "";
|
||||||
this.lastpoll = Date.now();
|
this.lastpoll = Date.now();
|
||||||
|
this.noflood = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
NotWebsocket.prototype.checkFlood = function(id, rate) {
|
||||||
|
if(id in this.noflood) {
|
||||||
|
this.noflood[id].push(Date.now());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.noflood[id] = [Date.now()];
|
||||||
|
}
|
||||||
|
if(this.noflood[id].length > 10) {
|
||||||
|
this.noflood[id].shift();
|
||||||
|
var hz = 10000 / (this.noflood[id][9] - this.noflood[id][0]);
|
||||||
|
if(hz > rate) {
|
||||||
|
throw "Rate is too high: " + id;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NotWebsocket.prototype.emit = function(msg, data) {
|
NotWebsocket.prototype.emit = function(msg, data) {
|
||||||
|
@ -22,6 +39,7 @@ NotWebsocket.prototype.emit = function(msg, data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
NotWebsocket.prototype.poll = function() {
|
NotWebsocket.prototype.poll = function() {
|
||||||
|
this.checkFlood("poll", 100);
|
||||||
this.lastpoll = Date.now();
|
this.lastpoll = Date.now();
|
||||||
var q = [];
|
var q = [];
|
||||||
for(var i = 0; i < this.pktqueue.length; i++) {
|
for(var i = 0; i < this.pktqueue.length; i++) {
|
||||||
|
@ -38,6 +56,7 @@ NotWebsocket.prototype.on = function(msg, callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
NotWebsocket.prototype.recv = function(urlstr) {
|
NotWebsocket.prototype.recv = function(urlstr) {
|
||||||
|
this.checkFlood("recv", 100);
|
||||||
var msg, data;
|
var msg, data;
|
||||||
try {
|
try {
|
||||||
var js = JSON.parse(urlstr);
|
var js = JSON.parse(urlstr);
|
||||||
|
@ -115,12 +134,17 @@ function msgReceived(req, res) {
|
||||||
if(h in clients && clients[h] != null) {
|
if(h in clients && clients[h] != null) {
|
||||||
var str = req.params.str;
|
var str = req.params.str;
|
||||||
res.callback = req.query.callback;
|
res.callback = req.query.callback;
|
||||||
if(str == "poll") {
|
try {
|
||||||
sendJSON(res, clients[h].poll());
|
if(str == "poll") {
|
||||||
|
sendJSON(res, clients[h].poll());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
clients[h].recv(unescape(str));
|
||||||
|
sendJSON(res, "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
catch(e) {
|
||||||
clients[h].recv(unescape(str));
|
res.send(429); // 429 Too Many Requests
|
||||||
sendJSON(res, "");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -846,3 +846,9 @@ $.getScript(IO_URL+"/socket.io/socket.io.js", function() {
|
||||||
Callbacks.disconnect();
|
Callbacks.disconnect();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.setupNewSocket = function() {
|
||||||
|
for(var key in Callbacks) {
|
||||||
|
socket.on(key, Callbacks[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1129,6 +1129,9 @@ function saveOpts() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// To be overridden in callbacks.js
|
||||||
|
function setupNewSocket() { }
|
||||||
|
|
||||||
function applyOpts() {
|
function applyOpts() {
|
||||||
$("#usertheme").remove();
|
$("#usertheme").remove();
|
||||||
if(USEROPTS.theme != "default") {
|
if(USEROPTS.theme != "default") {
|
||||||
|
@ -1189,22 +1192,18 @@ function applyOpts() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if(USEROPTS.altsocket) {
|
if(USEROPTS.altsocket) {
|
||||||
socket.disconnect();
|
if(socket)
|
||||||
|
socket.disconnect();
|
||||||
socket = new NotWebsocket();
|
socket = new NotWebsocket();
|
||||||
for(var key in Callbacks) {
|
setupNewSocket();
|
||||||
socket.on(key, Callbacks[key]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Switch from NotWebsocket => Socket.io
|
// Switch from NotWebsocket => Socket.io
|
||||||
else if(socket && typeof socket.poll !== "undefined") {
|
else if(socket && typeof socket.poll !== "undefined") {
|
||||||
try {
|
try {
|
||||||
socket = io.connect(IO_URL);
|
socket = io.connect(IO_URL);
|
||||||
for(var key in Callbacks) {
|
setupNewSocket();
|
||||||
socket.on(key, Callbacks[key]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
catch(e) {
|
catch(e) {
|
||||||
Callbacks.disconnect();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,3 +118,4 @@ NotWebsocket.prototype.disconnect = function() {
|
||||||
this.reconnect();
|
this.reconnect();
|
||||||
}.bind(this), this.reconndelay);
|
}.bind(this), this.reconndelay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -310,10 +310,10 @@
|
||||||
<script src="./assets/js/jquery.js"></script>
|
<script src="./assets/js/jquery.js"></script>
|
||||||
<!-- My Javascript -->
|
<!-- My Javascript -->
|
||||||
<script src="./assets/js/iourl.js"></script>
|
<script src="./assets/js/iourl.js"></script>
|
||||||
|
<script src="./assets/js/notwebsocket.js"></script>
|
||||||
<script src="./assets/js/media.js"></script>
|
<script src="./assets/js/media.js"></script>
|
||||||
<script src="./assets/js/functions.js"></script>
|
<script src="./assets/js/functions.js"></script>
|
||||||
<script src="./assets/js/client.js"></script>
|
<script src="./assets/js/client.js"></script>
|
||||||
<script src="./assets/js/notwebsocket.js"></script>
|
|
||||||
<script src="./assets/js/callbacks.js"></script>
|
<script src="./assets/js/callbacks.js"></script>
|
||||||
<!-- APIs -->
|
<!-- APIs -->
|
||||||
<script src="http://api.dmcdn.net/all.js"></script>
|
<script src="http://api.dmcdn.net/all.js"></script>
|
||||||
|
|
Loading…
Reference in New Issue