diff --git a/README_js.md b/README_js.md index e20f6580..2eb1a7e4 100644 --- a/README_js.md +++ b/README_js.md @@ -8,9 +8,8 @@ runmd.onRequire = (path) => { runmd.Date.now = () => 1551914748172; let seed = 0xdefaced; -require('crypto').randomBytes = function () { - const a = []; - for (let i = 0; i < 16; i++) a.push((seed = (seed * 0x41a7) & 0x7fffffff) & 0xff); +require('crypto').randomFillSync = function (a) { + for (let i = 0; i < 16; i++) a[i] = (seed = (seed * 0x41a7) & 0x7fffffff) & 0xff; return a; }; ``` diff --git a/src/rng.js b/src/rng.js index 33513bb8..53e5bcd9 100644 --- a/src/rng.js +++ b/src/rng.js @@ -1,5 +1,7 @@ import crypto from 'crypto'; +const rnds8 = new Uint8Array(16); + export default function rng() { - return crypto.randomBytes(16); + return crypto.randomFillSync(rnds8); } diff --git a/src/v4.js b/src/v4.js index 63daa5a4..44bfa947 100644 --- a/src/v4.js +++ b/src/v4.js @@ -2,10 +2,8 @@ import rng from './rng.js'; import bytesToUuid from './bytesToUuid.js'; function v4(options, buf, offset) { - const i = (buf && offset) || 0; - if (typeof options === 'string') { - buf = options === 'binary' ? new Uint32Array(16) : null; + buf = options === 'binary' ? new Uint8Array(16) : null; options = null; } @@ -19,12 +17,16 @@ function v4(options, buf, offset) { // Copy bytes to buffer, if provided if (buf) { - for (let ii = 0; ii < 16; ++ii) { - buf[i + ii] = rnds[ii]; + const start = offset || 0; + + for (let i = 0; i < 16; ++i) { + buf[start + i] = rnds[i]; } + + return buf; } - return buf || bytesToUuid(rnds); + return bytesToUuid(rnds); } export default v4; diff --git a/test/unit/v4.test.js b/test/unit/v4.test.js index d18f7ea5..6275dd40 100644 --- a/test/unit/v4.test.js +++ b/test/unit/v4.test.js @@ -45,13 +45,14 @@ describe('v4', () => { test('fills one UUID into a buffer as expected', () => { const buffer = []; - v4( + const result = v4( { random: randomBytesFixture, }, buffer, ); assert.deepEqual(buffer, expectedBytes); + assert.strictEqual(buffer, result); }); test('fills two UUIDs into a buffer as expected', () => {