| | |
| | | let random = bytes => |
| | | Promise.resolve(crypto.getRandomValues(new Uint8Array(bytes))) |
| | | let customAlphabet = (alphabet, size) => { |
| | | let random = async bytes => crypto.getRandomValues(new Uint8Array(bytes)) |
| | | let customAlphabet = (alphabet, defaultSize = 21) => { |
| | | let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1 |
| | | let step = -~((1.6 * mask * size) / alphabet.length) |
| | | return () => { |
| | | let step = -~((1.6 * mask * defaultSize) / alphabet.length) |
| | | return async (size = defaultSize) => { |
| | | let id = '' |
| | | while (true) { |
| | | let bytes = crypto.getRandomValues(new Uint8Array(step)) |
| | | let i = step |
| | | while (i--) { |
| | | id += alphabet[bytes[i] & mask] || '' |
| | | if (id.length === size) return Promise.resolve(id) |
| | | if (id.length === size) return id |
| | | } |
| | | } |
| | | } |
| | | } |
| | | let nanoid = (size = 21) => { |
| | | let nanoid = async (size = 21) => { |
| | | let id = '' |
| | | let bytes = crypto.getRandomValues(new Uint8Array(size)) |
| | | while (size--) { |
| | |
| | | id += '-' |
| | | } |
| | | } |
| | | return Promise.resolve(id) |
| | | return id |
| | | } |
| | | export { nanoid, customAlphabet, random } |