You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
	
	
							108 lines
						
					
					
						
							1.9 KiB
						
					
					
				/*!
 | 
						|
 * uid-safe
 | 
						|
 * Copyright(c) 2014 Jonathan Ong
 | 
						|
 * Copyright(c) 2015-2017 Douglas Christopher Wilson
 | 
						|
 * MIT Licensed
 | 
						|
 */
 | 
						|
 | 
						|
'use strict'
 | 
						|
 | 
						|
/**
 | 
						|
 * Module dependencies.
 | 
						|
 * @private
 | 
						|
 */
 | 
						|
 | 
						|
var randomBytes = require('random-bytes')
 | 
						|
 | 
						|
/**
 | 
						|
 * Module variables.
 | 
						|
 * @private
 | 
						|
 */
 | 
						|
 | 
						|
var EQUAL_END_REGEXP = /=+$/
 | 
						|
var PLUS_GLOBAL_REGEXP = /\+/g
 | 
						|
var SLASH_GLOBAL_REGEXP = /\//g
 | 
						|
 | 
						|
/**
 | 
						|
 * Module exports.
 | 
						|
 * @public
 | 
						|
 */
 | 
						|
 | 
						|
module.exports = uid
 | 
						|
module.exports.sync = uidSync
 | 
						|
 | 
						|
/**
 | 
						|
 * Create a unique ID.
 | 
						|
 *
 | 
						|
 * @param {number} length
 | 
						|
 * @param {function} [callback]
 | 
						|
 * @return {Promise}
 | 
						|
 * @public
 | 
						|
 */
 | 
						|
 | 
						|
function uid (length, callback) {
 | 
						|
  // validate callback is a function, if provided
 | 
						|
  if (callback !== undefined && typeof callback !== 'function') {
 | 
						|
    throw new TypeError('argument callback must be a function')
 | 
						|
  }
 | 
						|
 | 
						|
  // require the callback without promises
 | 
						|
  if (!callback && !global.Promise) {
 | 
						|
    throw new TypeError('argument callback is required')
 | 
						|
  }
 | 
						|
 | 
						|
  if (callback) {
 | 
						|
    // classic callback style
 | 
						|
    return generateUid(length, callback)
 | 
						|
  }
 | 
						|
 | 
						|
  return new Promise(function executor (resolve, reject) {
 | 
						|
    generateUid(length, function onUid (err, str) {
 | 
						|
      if (err) return reject(err)
 | 
						|
      resolve(str)
 | 
						|
    })
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Create a unique ID sync.
 | 
						|
 *
 | 
						|
 * @param {number} length
 | 
						|
 * @return {string}
 | 
						|
 * @public
 | 
						|
 */
 | 
						|
 | 
						|
function uidSync (length) {
 | 
						|
  return toString(randomBytes.sync(length))
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Generate a unique ID string.
 | 
						|
 *
 | 
						|
 * @param {number} length
 | 
						|
 * @param {function} callback
 | 
						|
 * @private
 | 
						|
 */
 | 
						|
 | 
						|
function generateUid (length, callback) {
 | 
						|
  randomBytes(length, function (err, buf) {
 | 
						|
    if (err) return callback(err)
 | 
						|
    callback(null, toString(buf))
 | 
						|
  })
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Change a Buffer into a string.
 | 
						|
 *
 | 
						|
 * @param {Buffer} buf
 | 
						|
 * @return {string}
 | 
						|
 * @private
 | 
						|
 */
 | 
						|
 | 
						|
function toString (buf) {
 | 
						|
  return buf.toString('base64')
 | 
						|
    .replace(EQUAL_END_REGEXP, '')
 | 
						|
    .replace(PLUS_GLOBAL_REGEXP, '-')
 | 
						|
    .replace(SLASH_GLOBAL_REGEXP, '_')
 | 
						|
}
 |