@martintsan/brorand
Version:
Random number generator for browsers and node.js
69 lines (58 loc) • 1.66 kB
JavaScript
var CryptoJS = require("crypto-js");
var r;
module.exports = function rand(len) {
if (!r) r = new Rand(null);
return r.generate(len);
};
function Rand(rand) {
this.rand = rand;
}
module.exports.Rand = Rand;
Rand.prototype.generate = function generate(len) {
return this._rand(len);
};
// Emulate crypto API using randy
// Rand.prototype._rand = function _rand(n) {
// if (this.rand.getBytes)
// return this.rand.getBytes(n);
// var res = new Uint8Array(n);
// for (var i = 0; i < res.length; i++)
// res[i] = this.rand.getByte();
// return res;
// };
Rand.prototype._rand = function _rand(n) {
return CryptoJS.lib.WordArray.random(n).words;
};
if (typeof self === "object") {
if (self.crypto && self.crypto.getRandomValues) {
// Modern browsers
Rand.prototype._rand = function _rand(n) {
var arr = new Uint8Array(n);
self.crypto.getRandomValues(arr);
return arr;
};
} else if (self.msCrypto && self.msCrypto.getRandomValues) {
// IE
Rand.prototype._rand = function _rand(n) {
var arr = new Uint8Array(n);
self.msCrypto.getRandomValues(arr);
return arr;
};
// Safari's WebWorkers do not have `crypto`
} else if (typeof window === "object") {
// Old junk
Rand.prototype._rand = function () {
throw new Error("Not implemented yet");
};
}
} else {
// Node.js or Web worker with no crypto support
try {
var crypto = require("crypto");
if (typeof crypto.randomBytes !== "function")
throw new Error("Not supported");
Rand.prototype._rand = function _rand(n) {
return crypto.randomBytes(n);
};
} catch (e) {}
}