index.native.js 908 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. import { getRandomBytesAsync } from 'expo-random'
  2. import { urlAlphabet } from '../url-alphabet/index.js'
  3. let random = getRandomBytesAsync
  4. let customAlphabet = (alphabet, defaultSize = 21) => {
  5. let mask = (2 << (31 - Math.clz32((alphabet.length - 1) | 1))) - 1
  6. let step = Math.ceil((1.6 * mask * defaultSize) / alphabet.length)
  7. let tick = (id, size = defaultSize) =>
  8. random(step).then(bytes => {
  9. let i = step
  10. while (i--) {
  11. id += alphabet[bytes[i] & mask] || ''
  12. if (id.length >= size) return id
  13. }
  14. return tick(id, size)
  15. })
  16. return (size = defaultSize) => {
  17. if (size <= 0) return Promise.resolve('')
  18. return tick('', size)
  19. }
  20. }
  21. let nanoid = (size = 21) =>
  22. random((size |= 0)).then(bytes => {
  23. let id = ''
  24. while (size--) {
  25. id += urlAlphabet[bytes[size] & 63]
  26. }
  27. return id
  28. })
  29. export { nanoid, customAlphabet, random }