Skip to content

Commit 5c60cde

Browse files
committed
Bound each encoder to return NaN if index oob
1 parent 9e1545d commit 5c60cde

23 files changed

+158
-76
lines changed

src/lib/bits.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { EntropyByBytes, EntropyByValues, EntropyFunction, PuidBitsMuncher } from '../types/puid'
22

3-
import encoder from './encoder'
43
import { entropyBitsPerChar } from './entropy'
4+
import puidEncoder from './puidEncoder'
55

66
const { ceil, floor, log2, round } = Math
77

@@ -139,7 +139,7 @@ export default (puidLen: number, puidChars: string, entropyFunction: EntropyFunc
139139
const entropyBuffer = new ArrayBuffer(bufferLen)
140140
const entropyBytes = new Uint8Array(entropyBuffer)
141141

142-
const charsEncoder = encoder(puidChars)
142+
const charsEncoder = puidEncoder(puidChars)
143143
const nChars = puidChars.length
144144
const mapper = new Array(puidLen).fill(0).map((zero, ndx) => zero + ndx)
145145

src/lib/chars.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ test('valid custom characters', (t) => t.is(validChars('dingosky')[0], true))
3434
test('invalid characters', (t) => {
3535
t.regex(invalidChars('dingo sky'), /Invalid/)
3636
t.regex(invalidChars('dingo sky'), /Invalid/)
37+
t.regex(invalidChars('dingo"sky'), /Invalid/)
3738
t.regex(invalidChars("dingo'sky"), /Invalid/)
3839
t.regex(invalidChars('dingo\\sky'), /Invalid/)
3940
t.regex(invalidChars('dingo`sky'), /Invalid/)

src/lib/chars.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export enum Chars {
1717
Crockford32 = '0123456789ABCDEFGHJKMNPQRSTVWXYZ',
1818
Decimal = '0123456789',
1919
Hex = '0123456789abcdef',
20-
HexUpper = '0123456789ABCDEF',
20+
HexUpper = Base16,
2121
SafeAscii = '!#$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_abcdefghijklmnopqrstuvwxyz{|}~',
2222
Safe32 = '2346789bdfghjmnpqrtBDFGHJLMNPQRT',
2323
Safe64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
@@ -38,7 +38,6 @@ export const charsName = (chars: string): string => {
3838
if (chars === Chars.Base32HexUpper) return 'base32HexUpper'
3939
if (chars === Chars.Crockford32) return 'crockford32'
4040
if (chars === Chars.Hex) return 'hex'
41-
if (chars === Chars.HexUpper) return 'hexUpper'
4241
if (chars === Chars.Safe32) return 'safe32'
4342
if (chars === Chars.Safe64) return 'safe64'
4443
if (chars === Chars.SafeAscii) return 'safeAscii'
@@ -61,8 +60,6 @@ const validChar = (char: string): boolean => {
6160
if (codePoint <= codePointOf('~')) return true
6261
if (codePoint < codePointNonBreakSpace) return false
6362

64-
if (char.codePointAt(1)) return false
65-
6663
return true
6764
}
6865

src/lib/encoder.spec.ts

Lines changed: 0 additions & 31 deletions
This file was deleted.

src/lib/encoder/alpha.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import { PuidEncoder } from '../../types/puid'
22

3+
import boundEncoder from './boundEncoder'
4+
35
export default (): PuidEncoder => {
46
const upper = 'A'.charCodeAt(0)
5-
const lower = 'a'.charCodeAt(0) - 26
7+
const lower = 'a'.charCodeAt(0)
8+
9+
const puidEncoder = (n: number) => {
10+
if (n < 26) return n + upper
11+
return n - 26 + lower
12+
}
613

7-
return (n: number) => n + (n < 26 ? upper : lower)
14+
return boundEncoder(puidEncoder, 52)
815
}

src/lib/encoder/alphaCase.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import { PuidEncoder } from '../../types/puid'
22

3+
import boundEncoder from './boundEncoder'
4+
35
export default (uppercase = false): PuidEncoder => {
46
const alpha = (uppercase ? 'A' : 'a').charCodeAt(0)
57

6-
return (n: number) => n + alpha
8+
const puidEncoder = (n: number) => n + alpha
9+
10+
return boundEncoder(puidEncoder, 26)
711
}

src/lib/encoder/alphaNum.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import { PuidEncoder } from '../../types/puid'
22

3+
import boundEncoder from './boundEncoder'
4+
35
export default (): PuidEncoder => {
46
const upper = 'A'.charCodeAt(0)
5-
const lower = 'a'.charCodeAt(0) - 26
6-
const decimal = '0'.charCodeAt(0) - 52
7+
const lower = 'a'.charCodeAt(0)
8+
const decimal = '0'.charCodeAt(0)
79

8-
return (n: number) => {
10+
const puidEncoder = (n: number) => {
911
if (n < 26) return n + upper
10-
if (n < 52) return n + lower
11-
return n + decimal
12+
if (n < 52) return n - 26 + lower
13+
return n - 52 + decimal
1214
}
15+
16+
return boundEncoder(puidEncoder, 62)
1317
}

src/lib/encoder/alphaNumCase.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
import { PuidEncoder } from '../../types/puid'
22

3+
import boundEncoder from './boundEncoder'
4+
35
export default (uppercase = false): PuidEncoder => {
46
const decimal = '0'.charCodeAt(0)
5-
const alpha = (uppercase ? 'A' : 'a').charCodeAt(0) - 10
7+
const alpha = (uppercase ? 'A' : 'a').charCodeAt(0)
68

7-
return (n: number) => {
9+
const puidEncoder = (n: number) => {
810
if (n < 10) return n + decimal
9-
return n + alpha
11+
return n - 10 + alpha
1012
}
13+
14+
return boundEncoder(puidEncoder, 36)
1115
}

src/lib/encoder/base16.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import { PuidEncoder } from '../../types/puid'
22

3+
import boundEncoder from './boundEncoder'
4+
35
export default (): PuidEncoder => {
46
const decimal = '0'.charCodeAt(0)
5-
const alpha = 'A'.charCodeAt(0) - 10
7+
const alpha = 'A'.charCodeAt(0)
8+
9+
const puidEncoder = (n: number) => {
10+
if (n < 10) return n + decimal
11+
return n - 10 + alpha
12+
}
613

7-
return (n: number) => n + (n < 10 ? decimal : alpha)
14+
return boundEncoder(puidEncoder, 16)
815
}

src/lib/encoder/base32.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
import { PuidEncoder } from '../../types/puid'
22

3+
import boundEncoder from './boundEncoder'
4+
35
export default (): PuidEncoder => {
46
const alpha = 'A'.charCodeAt(0)
5-
const decimal = '2'.charCodeAt(0) - 26
7+
const decimal = '2'.charCodeAt(0)
8+
9+
const puidEncoder = (n: number) => {
10+
if (n < 26) return n + alpha
11+
return n - 26 + decimal
12+
}
613

7-
return (n: number) => n + (n < 26 ? alpha : decimal)
14+
return boundEncoder(puidEncoder, 32)
815
}

0 commit comments

Comments
 (0)