sync/lib/utilities.js

234 lines
5.8 KiB
JavaScript
Raw Normal View History

2014-02-15 06:12:11 +00:00
(function () {
var root, crypto = false;
if (typeof window === "undefined") {
root = module.exports;
} else {
root = window.utils = {};
}
if (typeof require === "function") {
crypto = require("crypto");
2013-10-16 22:36:05 +00:00
}
2014-03-09 16:24:57 +00:00
2014-02-15 06:12:11 +00:00
var Set = function (items) {
this._items = {};
var self = this;
if (items instanceof Array)
items.forEach(function (it) { self.add(it); });
};
Set.prototype.contains = function (what) {
return (what in this._items);
};
Set.prototype.add = function (what) {
this._items[what] = true;
};
Set.prototype.remove = function (what) {
if (what in this._items)
delete this._items[what];
};
Set.prototype.clear = function () {
this._items = {};
};
Set.prototype.forEach = function (fn) {
for (var k in this._items) {
fn(k);
}
};
2013-10-16 22:36:05 +00:00
2014-02-15 06:12:11 +00:00
root.Set = Set;
root.isValidChannelName = function (name) {
2014-01-23 21:53:53 +00:00
return name.match(/^[\w-]{1,30}$/);
2013-08-16 15:37:26 +00:00
},
2014-02-15 06:12:11 +00:00
root.isValidUserName = function (name) {
2014-01-23 21:53:53 +00:00
return name.match(/^[\w-]{1,20}$/);
},
2014-02-15 06:12:11 +00:00
root.isValidEmail = function (email) {
if (email.length > 255) {
return false;
}
if (!email.match(/^[^@]+?@[^@]+$/)) {
return false;
}
if (email.match(/^[^@]+?@(localhost|127\.0\.0\.1)$/)) {
return false;
}
return true;
},
2014-02-15 06:12:11 +00:00
root.randomSalt = function (length) {
var chars = "abcdefgihjklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789!@#$%^&*_+=~";
var salt = [];
for(var i = 0; i < length; i++) {
salt.push(chars[parseInt(Math.random()*chars.length)]);
}
return salt.join('');
2013-08-18 22:58:16 +00:00
},
2014-02-15 06:12:11 +00:00
root.maskIP = function (ip) {
2013-08-18 22:58:16 +00:00
if(ip.match(/^\d+\.\d+\.\d+\.\d+$/)) {
// standard 32 bit IP
return ip.replace(/\d+\.\d+\.(\d+\.\d+)/, "x.x.$1");
} else if(ip.match(/^\d+\.\d+\.\d+/)) {
// /24 range
return ip.replace(/\d+\.\d+\.(\d+)/, "x.x.$1.*");
}
},
2014-02-15 06:12:11 +00:00
root.formatTime = function (sec) {
if(sec === "--:--")
return sec;
sec = Math.floor(+sec);
var h = "", m = "", s = "";
if(sec >= 3600) {
h = "" + Math.floor(sec / 3600);
if(h.length < 2)
h = "0" + h;
sec %= 3600;
}
m = "" + Math.floor(sec / 60);
if(m.length < 2)
m = "0" + m;
s = "" + (sec % 60);
if(s.length < 2)
s = "0" + s;
2013-08-29 00:25:53 +00:00
if(h === "")
return [m, s].join(":");
return [h, m, s].join(":");
2013-08-29 00:25:53 +00:00
},
2014-03-09 16:24:57 +00:00
root.parseTime = function (time) {
var parts = time.split(":");
var seconds = 0;
switch (parts.length) {
case 3:
seconds += parseInt(parts[2]) * 3600;
case 2:
seconds += parseInt(parts[1]) * 60;
case 1:
seconds += parseInt(parts[0]);
break;
default:
break;
}
return seconds;
},
2014-02-15 06:12:11 +00:00
root.newRateLimiter = function () {
2013-08-29 00:25:53 +00:00
return {
count: 0,
lastTime: 0,
throttle: function (opts) {
if (typeof opts === "undefined")
opts = {};
var burst = +opts.burst,
sustained = +opts.sustained,
cooldown = +opts.cooldown;
if (isNaN(burst))
burst = 10;
if (isNaN(sustained))
sustained = 2;
if (isNaN(cooldown))
cooldown = burst / sustained;
2013-09-06 20:53:23 +00:00
// Cooled down, allow and clear buffer
if (this.lastTime < Date.now() - cooldown*1000) {
this.count = 1;
2013-08-29 00:25:53 +00:00
this.lastTime = Date.now();
return false;
}
2013-09-06 20:53:23 +00:00
// Haven't reached burst cap yet, allow
if (this.count < burst) {
this.count++;
2013-08-29 00:25:53 +00:00
this.lastTime = Date.now();
return false;
}
var diff = Date.now() - this.lastTime;
if (diff < 1000/sustained)
return true;
this.lastTime = Date.now();
return false;
}
};
2013-10-06 06:43:25 +00:00
},
2014-02-15 06:12:11 +00:00
root.formatLink = function (id, type) {
2013-10-06 06:43:25 +00:00
switch (type) {
case "yt":
return "http://youtu.be/" + id;
case "vi":
return "http://vimeo.com/" + id;
case "dm":
return "http://dailymotion.com/video/" + id;
case "sc":
return id;
case "li":
return "http://livestream.com/" + id;
case "tw":
return "http://twitch.tv/" + id;
case "jt":
return "http://justin.tv/" + id;
case "rt":
return id;
case "jw":
return id;
case "im":
return "http://imgur.com/a/" + id;
case "us":
return "http://ustream.tv/" + id;
default:
return "";
}
2013-10-16 22:36:05 +00:00
},
2014-02-15 06:12:11 +00:00
root.isLive = function (type) {
2014-01-06 15:55:12 +00:00
switch (type) {
case "li":
case "tw":
case "jt":
case "us":
case "rt":
case "cu":
case "im":
2014-01-06 15:55:12 +00:00
case "jw":
return true;
default:
return false;
}
},
2014-02-15 06:12:11 +00:00
root.sha1 = function (data) {
if (!crypto) {
return "";
}
var shasum = crypto.createHash("sha1");
shasum.update(data);
return shasum.digest("hex");
}
2014-02-15 06:12:11 +00:00
})();