Skip to content

Commit

Permalink
v3.0.3 Released
Browse files Browse the repository at this point in the history
Maintenance:

- Refactored default random number generator to defer detection Web Crypto API
  until creation of `Scru128Generator`
- Fixed wrong test case
  • Loading branch information
LiosK committed Aug 1, 2023
2 parents 48243ec + 90b0f55 commit 9118884
Show file tree
Hide file tree
Showing 10 changed files with 102 additions and 93 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## v3.0.3 - 2023-08-01

### Maintenance

- Refactored default random number generator to defer detection Web Crypto API
until creation of `Scru128Generator`
- Fixed wrong test case

## v3.0.2 - 2023-07-17

Most notably, v3 switches the letter case of generated IDs from uppercase (e.g.,
Expand Down
43 changes: 22 additions & 21 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ export class Scru128Generator {
this.counterLo = 0;
/** The timestamp at the last renewal of `counter_hi` field. */
this.tsCounterHi = 0;
this.rng = randomNumberGenerator || new DefaultRandom();
this.rng = randomNumberGenerator || getDefaultRandom();
}
/**
* Generates a new SCRU128 ID object from the current `timestamp`, or resets
Expand Down Expand Up @@ -536,36 +536,37 @@ export class Scru128Generator {
return { value: this.generate(), done: false };
}
}
/** Stores `crypto.getRandomValues()` available in the environment. */
let getRandomValues = (buffer) => {
// fall back on Math.random() unless the flag is set to true
if (typeof SCRU128_DENY_WEAK_RNG !== "undefined" && SCRU128_DENY_WEAK_RNG) {
throw new Error("no cryptographically strong RNG available");
/** Returns the default random number generator available in the environment. */
const getDefaultRandom = () => {
// detect Web Crypto API
if (typeof crypto !== "undefined" &&
typeof crypto.getRandomValues !== "undefined") {
return new BufferedCryptoRandom();
}
for (let i = 0; i < buffer.length; i++) {
buffer[i] =
Math.trunc(Math.random() * 65536) * 65536 +
Math.trunc(Math.random() * 65536);
else {
// fall back on Math.random() unless the flag is set to true
if (typeof SCRU128_DENY_WEAK_RNG !== "undefined" && SCRU128_DENY_WEAK_RNG) {
throw new Error("no cryptographically strong RNG available");
}
return {
nextUint32: () => Math.trunc(Math.random() * 65536) * 65536 +
Math.trunc(Math.random() * 65536),
};
}
return buffer;
};
// detect Web Crypto API
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
getRandomValues = (buffer) => crypto.getRandomValues(buffer);
}
/**
* Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this
* uses a small buffer by default to avoid unbearable throughput decline in some
* environments as well as the waste of time and space for unused values.
* Wraps `crypto.getRandomValues()` to enable buffering; this uses a small
* buffer by default to avoid both unbearable throughput decline in some
* environments and the waste of time and space for unused values.
*/
class DefaultRandom {
class BufferedCryptoRandom {
constructor() {
this.buffer = new Uint32Array(8);
this.cursor = Infinity;
this.cursor = 0xffff;
}
nextUint32() {
if (this.cursor >= this.buffer.length) {
getRandomValues(this.buffer);
crypto.getRandomValues(this.buffer);
this.cursor = 0;
}
return this.buffer[this.cursor++];
Expand Down
30 changes: 15 additions & 15 deletions docs/classes/Scru128Generator.html
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ <h4>Hierarchy</h4>
<ul class="tsd-hierarchy">
<li><span class="target">Scru128Generator</span></li></ul></section><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L454">index.ts:454</a></li></ul></aside>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L454">index.ts:454</a></li></ul></aside>
<section class="tsd-panel-group tsd-index-group">
<section class="tsd-panel tsd-index-panel">
<details class="tsd-index-content tsd-index-accordion" open><summary class="tsd-accordion-summary tsd-index-summary">
Expand Down Expand Up @@ -120,23 +120,23 @@ <h5><span class="tsd-kind-method">next<wbr/>Uint32</span><span class="tsd-signat
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">number</span></h4>
<div class="tsd-comment tsd-typography"></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L472">index.ts:472</a></li></ul></aside></li></ul></li></ul></li></ul></div>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L472">index.ts:472</a></li></ul></aside></li></ul></li></ul></li></ul></div>
<h4 class="tsd-returns-title">Returns <a href="Scru128Generator.html" class="tsd-signature-type tsd-kind-class">Scru128Generator</a></h4>
<div class="tsd-comment tsd-typography"></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L470">index.ts:470</a></li></ul></aside></li></ul></section></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L470">index.ts:470</a></li></ul></aside></li></ul></section></section>
<section class="tsd-panel-group tsd-member-group">
<h2>Properties</h2>
<section class="tsd-panel tsd-member tsd-is-private"><a id="counterHi" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagPrivate">Private</code> <span>counter<wbr/>Hi</span><a href="#counterHi" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<div class="tsd-signature"><span class="tsd-kind-property">counter<wbr/>Hi</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = 0</span></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L456">index.ts:456</a></li></ul></aside></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L456">index.ts:456</a></li></ul></aside></section>
<section class="tsd-panel tsd-member tsd-is-private"><a id="counterLo" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagPrivate">Private</code> <span>counter<wbr/>Lo</span><a href="#counterLo" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<div class="tsd-signature"><span class="tsd-kind-property">counter<wbr/>Lo</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = 0</span></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L457">index.ts:457</a></li></ul></aside></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L457">index.ts:457</a></li></ul></aside></section>
<section class="tsd-panel tsd-member tsd-is-private"><a id="rng" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagPrivate">Private</code> <span>rng</span><a href="#rng" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<div class="tsd-signature"><span class="tsd-kind-property">rng</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span><br/><span>    </span><span class="tsd-kind-call-signature">nextUint32</span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> =&gt; </span><span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">; </span><br/><span class="tsd-signature-symbol">}</span></div>
Expand All @@ -152,23 +152,23 @@ <h5><span class="tsd-kind-method">next<wbr/>Uint32</span><span class="tsd-signat
<li class="tsd-description">
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">number</span></h4><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L463">index.ts:463</a></li></ul></aside></li></ul></li></ul></div>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L463">index.ts:463</a></li></ul></aside></li></ul></li></ul></div>
<div class="tsd-comment tsd-typography"></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L463">index.ts:463</a></li></ul></aside></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L463">index.ts:463</a></li></ul></aside></section>
<section class="tsd-panel tsd-member tsd-is-private"><a id="timestamp" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagPrivate">Private</code> <span>timestamp</span><a href="#timestamp" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<div class="tsd-signature"><span class="tsd-kind-property">timestamp</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = 0</span></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L455">index.ts:455</a></li></ul></aside></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L455">index.ts:455</a></li></ul></aside></section>
<section class="tsd-panel tsd-member tsd-is-private"><a id="tsCounterHi" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><code class="tsd-tag ts-flagPrivate">Private</code> <span>ts<wbr/>Counter<wbr/>Hi</span><a href="#tsCounterHi" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<div class="tsd-signature"><span class="tsd-kind-property">ts<wbr/>Counter<wbr/>Hi</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol"> = 0</span></div>
<div class="tsd-comment tsd-typography"><p>The timestamp at the last renewal of <code>counter_hi</code> field.</p>
</div>
<div class="tsd-comment tsd-typography"></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L460">index.ts:460</a></li></ul></aside></section></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L460">index.ts:460</a></li></ul></aside></section></section>
<section class="tsd-panel-group tsd-member-group">
<h2>Methods</h2>
<section class="tsd-panel tsd-member"><a id="_iterator_" class="tsd-anchor"></a>
Expand All @@ -185,7 +185,7 @@ <h4>Example</h4><pre><code class="language-javascript"><span class="hl-0">import
</code><button>Copy</button></pre>
</div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L603">index.ts:603</a></li></ul></aside></li></ul></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L603">index.ts:603</a></li></ul></aside></li></ul></section>
<section class="tsd-panel tsd-member"><a id="generate" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><span>generate</span><a href="#generate" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<ul class="tsd-signatures">
Expand All @@ -198,7 +198,7 @@ <h3 class="tsd-anchor-link"><span>generate</span><a href="#generate" aria-label=
<h4 class="tsd-returns-title">Returns <a href="Scru128Id.html" class="tsd-signature-type tsd-kind-class">Scru128Id</a></h4>
<div class="tsd-comment tsd-typography"></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L483">index.ts:483</a></li></ul></aside></li></ul></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L483">index.ts:483</a></li></ul></aside></li></ul></section>
<section class="tsd-panel tsd-member"><a id="generateOrAbort" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><span>generate<wbr/>Or<wbr/>Abort</span><a href="#generateOrAbort" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<ul class="tsd-signatures">
Expand All @@ -214,7 +214,7 @@ <h4>Example</h4><pre><code class="language-javascript"><span class="hl-0">import
</code><button>Copy</button></pre>
</div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L506">index.ts:506</a></li></ul></aside></li></ul></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L506">index.ts:506</a></li></ul></aside></li></ul></section>
<section class="tsd-panel tsd-member"><a id="generateOrAbortCore" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><span>generate<wbr/>Or<wbr/>Abort<wbr/>Core</span><a href="#generateOrAbortCore" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<ul class="tsd-signatures">
Expand All @@ -240,7 +240,7 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">undefined
<h4>Throws</h4><p>RangeError if <code>timestamp</code> is not a 48-bit positive integer.</p>
</div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L541">index.ts:541</a></li></ul></aside></li></ul></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L541">index.ts:541</a></li></ul></aside></li></ul></section>
<section class="tsd-panel tsd-member"><a id="generateOrResetCore" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><span>generate<wbr/>Or<wbr/>Reset<wbr/>Core</span><a href="#generateOrResetCore" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<ul class="tsd-signatures">
Expand All @@ -266,7 +266,7 @@ <h4 class="tsd-returns-title">Returns <a href="Scru128Id.html" class="tsd-signat
<h4>Throws</h4><p>RangeError if <code>timestamp</code> is not a 48-bit positive integer.</p>
</div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L520">index.ts:520</a></li></ul></aside></li></ul></section>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L520">index.ts:520</a></li></ul></aside></li></ul></section>
<section class="tsd-panel tsd-member"><a id="next" class="tsd-anchor"></a>
<h3 class="tsd-anchor-link"><span>next</span><a href="#next" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24"><use href="#icon-anchor"></use></svg></a></h3>
<ul class="tsd-signatures">
Expand All @@ -279,7 +279,7 @@ <h3 class="tsd-anchor-link"><span>next</span><a href="#next" aria-label="Permali
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type ">IteratorResult</span><span class="tsd-signature-symbol">&lt;</span><a href="Scru128Id.html" class="tsd-signature-type tsd-kind-class">Scru128Id</a><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">undefined</span><span class="tsd-signature-symbol">&gt;</span></h4>
<div class="tsd-comment tsd-typography"></div><aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.2/src/index.ts#L615">index.ts:615</a></li></ul></aside></li></ul></section></section></div>
<li>Defined in <a href="https://github.com/scru128/javascript/blob/v3.0.3/src/index.ts#L615">index.ts:615</a></li></ul></aside></li></ul></section></section></div>
<div class="col-sidebar">
<div class="page-menu">
<div class="tsd-navigation settings">
Expand Down
Loading

0 comments on commit 9118884

Please sign in to comment.