3 * Copyright(c) 2014 Jonathan Ong
4 * Copyright(c) 2015-2016 Douglas Christopher Wilson
11 * Module dependencies.
15 var escape = require('base64-url').escape
16 var randomBytes = require('random-bytes')
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) {
68 return toString(randomBytes.sync(length))
72 * Generate a unique ID string.
74 * @param {number} length
75 * @param {function} callback
79 function generateUid (length, callback) {
80 randomBytes(length, function (err, buf) {
81 if (err) return callback(err)
82 callback(null, toString(buf))
87 * Change a Buffer into a string.
94 function toString (buf) {
95 return escape(buf.toString('base64'))