66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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;
 | |
| };
 | |
| 
 | |
| 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) {
 | |
|   }
 | |
| }
 |