3 * Copyright(c) 2014 Jonathan Ong
4 * Copyright(c) 2015 Douglas Christopher Wilson
11 * Module dependencies.
15 var crypto = require('crypto')
16 var escape = require('base64-url').escape
24 module.exports.sync = uidSync
29 * @param {number} length
30 * @param {function} [callback]
35 function uid(length, callback) {
36 // validate callback is a function, if provided
37 if (callback !== undefined && typeof callback !== 'function') {
38 throw new TypeError('argument callback must be a function')
41 // require the callback without promises
42 if (!callback && !global.Promise) {
43 throw new TypeError('argument callback is required')
47 // classic callback style
48 return generateUid(length, callback)
51 return new Promise(function executor(resolve, reject) {
52 generateUid(length, function onUid(err, str) {
53 if (err) return reject(err)
60 * Create a unique ID sync.
62 * @param {number} length
67 function uidSync(length) {
69 return toString(crypto.randomBytes(length))
71 return toString(crypto.pseudoRandomBytes(length))
76 * Generate a unique ID string.
78 * @param {number} length
79 * @param {function} callback
83 function generateUid(length, callback) {
84 randomBytes(length, function (err, buf) {
85 if (err) return callback(err)
86 callback(null, toString(buf))
91 * Get some random bytes.
93 * @param {number} length
94 * @param {function} callback
99 function randomBytes(length, callback) {
100 crypto.randomBytes(length, function (err, buf) {
101 if (!err) return callback(null, buf)
102 crypto.pseudoRandomBytes(length, function (err, buf) {
103 if (err) return callback(err)
110 * Change a Buffer into a string.
112 * @param {Buffer} buf
117 function toString(buf) {
118 return escape(buf.toString('base64'))