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
			| 
											3 years ago
										 | /*! | ||
|  |  * 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, '_') | ||
|  | } |