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, '_')
 | |
| }
 |