AK-21/Graphite-Industrial-Intelligence
0
1let crypto = require('crypto')2 3let { urlAlphabet } = require('../url-alphabet/index.cjs')4 5let random = bytes =>6 new Promise((resolve, reject) => {7 crypto.randomFill(Buffer.allocUnsafe(bytes), (err, buf) => {8 if (err) {9 reject(err)10 } else {11 resolve(buf)12 }13 })14 })15 16let customAlphabet = (alphabet, defaultSize = 21) => {17 let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 118 19 20 let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)21 22 let tick = (id, size = defaultSize) =>23 random(step).then(bytes => {24 let i = step25 while (i--) {26 id += alphabet[bytes[i] & mask] || ''27 if (id.length >= size) return id28 }29 return tick(id, size)30 })31 32 return size => tick('', size)33}34 35let nanoid = (size = 21) =>36 random((size |= 0)).then(bytes => {37 let id = ''38 while (size--) {39 id += urlAlphabet[bytes[size] & 63]40 }41 return id42 })43 44module.exports = { nanoid, customAlphabet, random }45 