UNPKG

@martintsan/brorand

Version:

Random number generator for browsers and node.js

69 lines (58 loc) 1.66 kB
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) {} }