keygen
Version:
url-friendly, random, unique key/token generation
82 lines (74 loc) • 1.99 kB
JavaScript
(function() {
/*
* keygen
* https://github.com/bitbutcher/keygen
*
* Copyright (c) 2015 Sean M. Duncan
* Licensed under the MIT license.
*/
var crypto, gen_for, large, medium, small;
crypto = require('crypto');
small = 11;
medium = small * 2;
large = medium * 2;
gen_for = function(alpha) {
var async, generate, it, sync;
alpha = ((function() {
var i, ref, results;
results = [];
for (it = i = 0, ref = 256 / alpha.length + 1; (0 <= ref ? i <= ref : i >= ref); it = 0 <= ref ? ++i : --i) {
results.push(alpha);
}
return results;
})()).join('').split('');
generate = function(bytes) {
var byte, i, key, len;
key = '';
for (i = 0, len = bytes.length; i < len; i++) {
byte = bytes[i];
key += alpha[byte];
}
return key;
};
sync = function(length) {
var ex;
try {
return generate(crypto.randomBytes(length));
} catch (error) {
ex = error;
return generate(crypto.pseudoRandomBytes(length));
}
};
async = function(length, callback) {
crypto.randomBytes(length, function(err, bytes) {
if (err == null) {
return callback(generate(bytes));
}
return crypto.pseudoRandomBytes(length, function(err, bytes) {
return callback(generate(bytes));
});
});
};
return function(length, callback) {
if ((length != null ? length.constructor : void 0) === Function) {
[length, callback] = [callback, length];
}
if (length == null) {
length = medium;
}
if (callback != null) {
return async(length, callback);
} else {
return sync(length);
}
};
};
module.exports = {
gen_for: gen_for,
hex: gen_for('0123456789abcdef'),
url: gen_for('23456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'),
small,
medium,
large
};
}).call(this);