From 398fd904269507ad86d6ee0f7485f4df829ab289 Mon Sep 17 00:00:00 2001 From: Arutyunyan Artyom Date: Tue, 11 Jan 2022 10:50:58 +0000 Subject: [PATCH] fix collision by proxy number --- index.js | 4 ++-- test/index.test.js | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 19306b10..33968cb1 100644 --- a/index.js +++ b/index.js @@ -23,7 +23,7 @@ let fillPool = bytes => { } let random = bytes => { - fillPool(bytes) + fillPool((bytes -= 0)) return pool.subarray(poolOffset - bytes, poolOffset) } @@ -65,7 +65,7 @@ let customRandom = (alphabet, size, getRandom) => { let customAlphabet = (alphabet, size) => customRandom(alphabet, size, random) let nanoid = (size = 21) => { - fillPool(size) + fillPool((size -= 0)) let id = '' // We are reading directly from the random pool to avoid creating new array for (let i = poolOffset - size; i < poolOffset; i++) { diff --git a/test/index.test.js b/test/index.test.js index 18043e0f..7bb1e2dc 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -151,5 +151,43 @@ for (let type of ['node', 'browser']) { } }) }) + + if (type === 'node') { + describe('proxy number', () => { + it('prevent collision', () => { + let makeProxyNumberToReproducePreviousID = () => { + let step = 0 + return { + valueOf() { + // // if (!pool || pool.length < bytes) { + if (step === 0) { + step++ + return 0 + } + + // } else if (poolOffset + bytes > pool.length) { + if (step === 1) { + step++ + return -Infinity + } + + // poolOffset += bytes + if (step === 2) { + step++ + return 0 + } + + return 21 + } + } + } + + let ID1 = nanoid() + let ID2 = nanoid(makeProxyNumberToReproducePreviousID()) + + expect(ID1).not.toBe(ID2) + }) + }) + } }) }