bufferbase 1.3.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +186 -17
- package/dist/cjs/bases.d.ts +189 -0
- package/dist/cjs/bases.d.ts.map +1 -0
- package/dist/cjs/bases.js +134 -0
- package/dist/cjs/bases.js.map +1 -0
- package/dist/cjs/bufferbase.d.ts +22 -45
- package/dist/cjs/bufferbase.d.ts.map +1 -1
- package/dist/cjs/bufferbase.js +26 -120
- package/dist/cjs/bufferbase.js.map +1 -1
- package/dist/cjs/codec-base.d.ts +56 -0
- package/dist/cjs/codec-base.d.ts.map +1 -0
- package/dist/cjs/codec-base.js +132 -0
- package/dist/cjs/codec-base.js.map +1 -0
- package/dist/cjs/codec-block.d.ts +47 -0
- package/dist/cjs/codec-block.d.ts.map +1 -0
- package/dist/cjs/codec-block.js +213 -0
- package/dist/cjs/codec-block.js.map +1 -0
- package/dist/cjs/codec-block85.d.ts +56 -0
- package/dist/cjs/codec-block85.d.ts.map +1 -0
- package/dist/cjs/codec-block85.js +271 -0
- package/dist/cjs/codec-block85.js.map +1 -0
- package/dist/cjs/codec-radix.d.ts +46 -0
- package/dist/cjs/codec-radix.d.ts.map +1 -0
- package/dist/cjs/codec-radix.js +181 -0
- package/dist/cjs/codec-radix.js.map +1 -0
- package/dist/cjs/codec.d.ts +38 -0
- package/dist/cjs/codec.d.ts.map +1 -0
- package/dist/cjs/codec.js +69 -0
- package/dist/cjs/codec.js.map +1 -0
- package/dist/cjs/codecs.d.ts +20 -0
- package/dist/cjs/codecs.d.ts.map +1 -0
- package/dist/cjs/codecs.js +19 -0
- package/dist/cjs/codecs.js.map +1 -0
- package/dist/cjs/errors.d.ts +93 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +130 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/example.js +49 -33
- package/dist/cjs/example.js.map +1 -1
- package/dist/cjs/functions.d.ts +58 -0
- package/dist/cjs/functions.d.ts.map +1 -0
- package/dist/cjs/functions.js +71 -0
- package/dist/cjs/functions.js.map +1 -0
- package/dist/cjs/index.d.ts +10 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +35 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/package.json +17 -12
- package/dist/cjs/types.d.ts +144 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +3 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/bases.d.ts +189 -0
- package/dist/esm/bases.d.ts.map +1 -0
- package/dist/esm/bases.js +129 -0
- package/dist/esm/bases.js.map +1 -0
- package/dist/esm/bufferbase.d.ts +22 -45
- package/dist/esm/bufferbase.d.ts.map +1 -1
- package/dist/esm/bufferbase.js +21 -115
- package/dist/esm/bufferbase.js.map +1 -1
- package/dist/esm/codec-base.d.ts +56 -0
- package/dist/esm/codec-base.d.ts.map +1 -0
- package/dist/esm/codec-base.js +127 -0
- package/dist/esm/codec-base.js.map +1 -0
- package/dist/esm/codec-block.d.ts +47 -0
- package/dist/esm/codec-block.d.ts.map +1 -0
- package/dist/esm/codec-block.js +209 -0
- package/dist/esm/codec-block.js.map +1 -0
- package/dist/esm/codec-block85.d.ts +56 -0
- package/dist/esm/codec-block85.d.ts.map +1 -0
- package/dist/esm/codec-block85.js +267 -0
- package/dist/esm/codec-block85.js.map +1 -0
- package/dist/esm/codec-radix.d.ts +46 -0
- package/dist/esm/codec-radix.d.ts.map +1 -0
- package/dist/esm/codec-radix.js +177 -0
- package/dist/esm/codec-radix.js.map +1 -0
- package/dist/esm/codec.d.ts +38 -0
- package/dist/esm/codec.d.ts.map +1 -0
- package/dist/esm/codec.js +60 -0
- package/dist/esm/codec.js.map +1 -0
- package/dist/esm/codecs.d.ts +20 -0
- package/dist/esm/codecs.d.ts.map +1 -0
- package/dist/esm/codecs.js +16 -0
- package/dist/esm/codecs.js.map +1 -0
- package/dist/esm/errors.d.ts +93 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +119 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/example.js +48 -32
- package/dist/esm/example.js.map +1 -1
- package/dist/esm/functions.d.ts +58 -0
- package/dist/esm/functions.d.ts.map +1 -0
- package/dist/esm/functions.js +65 -0
- package/dist/esm/functions.js.map +1 -0
- package/dist/esm/index.d.ts +10 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/package.json +17 -12
- package/dist/esm/types.d.ts +144 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/package.json +19 -14
- package/src/algorithms.test.ts +442 -0
- package/src/bases.ts +142 -0
- package/src/bufferbase.test.ts +44 -27
- package/src/bufferbase.ts +32 -117
- package/src/codec-base.ts +181 -0
- package/src/codec-block.ts +258 -0
- package/src/codec-block85.ts +315 -0
- package/src/codec-radix.ts +206 -0
- package/src/codec.test.ts +328 -0
- package/src/codec.ts +67 -0
- package/src/codecs.ts +24 -0
- package/src/errors.ts +127 -0
- package/src/example.ts +49 -34
- package/src/functions.ts +73 -0
- package/src/index.ts +39 -6
- package/src/types.ts +156 -0
- package/dist/cjs/bufferbase.d.mts +0 -60
- package/dist/cjs/bufferbase.d.mts.map +0 -1
- package/dist/cjs/bufferbase.mjs +0 -150
- package/dist/cjs/bufferbase.mjs.map +0 -1
- package/dist/cjs/example.d.mts +0 -2
- package/dist/cjs/example.d.mts.map +0 -1
- package/dist/cjs/example.mjs +0 -39
- package/dist/cjs/example.mjs.map +0 -1
- package/dist/cjs/index.d.mts +0 -2
- package/dist/cjs/index.d.mts.map +0 -1
- package/dist/cjs/index.mjs +0 -11
- package/dist/cjs/index.mjs.map +0 -1
- package/dist/esm/bufferbase.d.mts +0 -60
- package/dist/esm/bufferbase.d.mts.map +0 -1
- package/dist/esm/bufferbase.mjs +0 -141
- package/dist/esm/bufferbase.mjs.map +0 -1
- package/dist/esm/example.d.mts +0 -2
- package/dist/esm/example.d.mts.map +0 -1
- package/dist/esm/example.mjs +0 -37
- package/dist/esm/example.mjs.map +0 -1
- package/dist/esm/index.d.mts +0 -2
- package/dist/esm/index.d.mts.map +0 -1
- package/dist/esm/index.mjs +0 -2
- package/dist/esm/index.mjs.map +0 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { BaseCodec, toBuffer } from './codec-base.js';
|
|
3
|
+
import { BufferSizeError, CheckSymbolError, InvalidCharacterError, InvalidCodecError, InvalidLengthError, } from './errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Reads the buffer as one big integer and rewrites it in base
|
|
6
|
+
* `alphabet.length`.
|
|
7
|
+
*
|
|
8
|
+
* This is the Base58 family of encodings. It accepts any alphabet and any
|
|
9
|
+
* input length, but it is not RFC 4648: the output length is not a fixed
|
|
10
|
+
* function of the input length, so it cannot be streamed, and encoding is
|
|
11
|
+
* O(n²) in the input size.
|
|
12
|
+
*
|
|
13
|
+
* Leading zero bytes carry no value in an integer, so they are recorded
|
|
14
|
+
* separately as leading `alphabet[0]` characters.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { RadixCodec } from 'bufferbase';
|
|
19
|
+
*
|
|
20
|
+
* const binary = new RadixCodec({ alphabet: '01', algorithm: 'radix' });
|
|
21
|
+
* binary.encode(Uint8Array.of(5)); // '101'
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export class RadixCodec extends BaseCodec {
|
|
25
|
+
constructor(spec) {
|
|
26
|
+
super(spec);
|
|
27
|
+
this.algorithm = 'radix';
|
|
28
|
+
const extra = spec.checkSymbols;
|
|
29
|
+
if (extra === undefined || extra === '') {
|
|
30
|
+
this.checkChars = null;
|
|
31
|
+
this.checkValues = new Map();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const combined = spec.alphabet + extra;
|
|
35
|
+
if (new Set(combined).size !== combined.length) {
|
|
36
|
+
throw new InvalidCodecError('checkSymbols repeat a character of the alphabet');
|
|
37
|
+
}
|
|
38
|
+
// The symbol is matched by value, so that a case-insensitive codec accepts
|
|
39
|
+
// it in either case just as it does the rest of the string.
|
|
40
|
+
const values = new Map();
|
|
41
|
+
for (let i = 0; i < combined.length; i++) {
|
|
42
|
+
const char = combined[i];
|
|
43
|
+
values.set(char, i);
|
|
44
|
+
if (spec.caseInsensitive === true) {
|
|
45
|
+
values.set(char.toLowerCase(), i);
|
|
46
|
+
values.set(char.toUpperCase(), i);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
this.checkChars = combined;
|
|
50
|
+
this.checkValues = values;
|
|
51
|
+
}
|
|
52
|
+
encode(input) {
|
|
53
|
+
const buffer = toBuffer(input);
|
|
54
|
+
const base = this.chars.length;
|
|
55
|
+
const digits = [];
|
|
56
|
+
for (const byte of buffer) {
|
|
57
|
+
let carry = byte;
|
|
58
|
+
for (let i = 0; i < digits.length; i++) {
|
|
59
|
+
carry += digits[i] * 256;
|
|
60
|
+
digits[i] = carry % base;
|
|
61
|
+
carry = Math.floor(carry / base);
|
|
62
|
+
}
|
|
63
|
+
while (carry > 0) {
|
|
64
|
+
digits.push(carry % base);
|
|
65
|
+
carry = Math.floor(carry / base);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (let i = 0; i < buffer.length && buffer[i] === 0; i++) {
|
|
69
|
+
digits.push(0);
|
|
70
|
+
}
|
|
71
|
+
let out = '';
|
|
72
|
+
for (let i = digits.length - 1; i >= 0; i--) {
|
|
73
|
+
out += this.chars[digits[i]];
|
|
74
|
+
}
|
|
75
|
+
if (this.checkChars !== null) {
|
|
76
|
+
out += this.checkChars[this.remainderOf(buffer, this.checkChars.length)];
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
decode(encoded, options) {
|
|
81
|
+
const bytes = this.read(this.strip(encoded));
|
|
82
|
+
const size = options?.size;
|
|
83
|
+
if (size === undefined) {
|
|
84
|
+
return Buffer.from(bytes);
|
|
85
|
+
}
|
|
86
|
+
if (bytes.length > size) {
|
|
87
|
+
throw new BufferSizeError(bytes.length, size);
|
|
88
|
+
}
|
|
89
|
+
const padded = Buffer.alloc(size);
|
|
90
|
+
Buffer.from(bytes).copy(padded, size - bytes.length);
|
|
91
|
+
return padded;
|
|
92
|
+
}
|
|
93
|
+
validate(input) {
|
|
94
|
+
const stripped = this.strip(input);
|
|
95
|
+
if (this.checkChars === null) {
|
|
96
|
+
// Every string over the alphabet decodes, so the characters settle it.
|
|
97
|
+
for (let i = 0; i < stripped.length; i++) {
|
|
98
|
+
if (this.valueAt(stripped, i) < 0) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
this.read(stripped);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Decodes the body, verifying the check symbol when the codec carries one.
|
|
114
|
+
*
|
|
115
|
+
* Everything `decode` can reject other than `DecodeOptions.size` is checked
|
|
116
|
+
* here, so `validate` and `decode` always agree.
|
|
117
|
+
*/
|
|
118
|
+
read(input) {
|
|
119
|
+
let body = input;
|
|
120
|
+
if (this.checkChars !== null) {
|
|
121
|
+
if (body.length === 0) {
|
|
122
|
+
throw new InvalidLengthError(0, 'a checked encoding always carries a check symbol');
|
|
123
|
+
}
|
|
124
|
+
const found = body.slice(-1);
|
|
125
|
+
body = body.slice(0, -1);
|
|
126
|
+
const bytes = this.toBytes(body);
|
|
127
|
+
const expected = this.remainderOf(bytes, this.checkChars.length);
|
|
128
|
+
if (this.checkValues.get(found) !== expected) {
|
|
129
|
+
throw new CheckSymbolError(found, this.checkChars[expected]);
|
|
130
|
+
}
|
|
131
|
+
return bytes;
|
|
132
|
+
}
|
|
133
|
+
return this.toBytes(input);
|
|
134
|
+
}
|
|
135
|
+
/** Rewrites the digits of `body` as bytes, most significant first. */
|
|
136
|
+
toBytes(body) {
|
|
137
|
+
const base = this.chars.length;
|
|
138
|
+
const bytes = [];
|
|
139
|
+
let leadingZeros = 0;
|
|
140
|
+
let stillLeading = true;
|
|
141
|
+
for (let at = 0; at < body.length; at++) {
|
|
142
|
+
const value = this.valueAt(body, at);
|
|
143
|
+
if (value < 0) {
|
|
144
|
+
throw new InvalidCharacterError(body[at]);
|
|
145
|
+
}
|
|
146
|
+
if (stillLeading && value === 0) {
|
|
147
|
+
leadingZeros++;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
stillLeading = false;
|
|
151
|
+
let carry = value;
|
|
152
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
153
|
+
carry += bytes[i] * base;
|
|
154
|
+
bytes[i] = carry % 256;
|
|
155
|
+
carry = Math.floor(carry / 256);
|
|
156
|
+
}
|
|
157
|
+
while (carry > 0) {
|
|
158
|
+
bytes.push(carry % 256);
|
|
159
|
+
carry = Math.floor(carry / 256);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
for (let i = 0; i < leadingZeros; i++) {
|
|
163
|
+
bytes.push(0);
|
|
164
|
+
}
|
|
165
|
+
bytes.reverse();
|
|
166
|
+
return bytes;
|
|
167
|
+
}
|
|
168
|
+
/** The value the bytes denote, modulo `divisor`. */
|
|
169
|
+
remainderOf(bytes, divisor) {
|
|
170
|
+
let remainder = 0;
|
|
171
|
+
for (const byte of bytes) {
|
|
172
|
+
remainder = (remainder * 256 + byte) % divisor;
|
|
173
|
+
}
|
|
174
|
+
return remainder;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=codec-radix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-radix.js","sourceRoot":"","sources":["../../src/codec-radix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { CodecSpec, ICodec } from './types.js';
|
|
2
|
+
import { RadixCodec } from './codec-radix.js';
|
|
3
|
+
/**
|
|
4
|
+
* Builds the codec described by a spec.
|
|
5
|
+
*
|
|
6
|
+
* A bare string is read as a custom alphabet for a radix conversion, which is
|
|
7
|
+
* the only algorithm that works with an alphabet of any length.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* import { createCodec } from 'bufferbase';
|
|
12
|
+
*
|
|
13
|
+
* const binary = createCodec('01');
|
|
14
|
+
* binary.encode(Uint8Array.of(5)); // '101'
|
|
15
|
+
*
|
|
16
|
+
* const paddedHex = createCodec({ alphabet: '0123456789abcdef', algorithm: 'block' });
|
|
17
|
+
* paddedHex.encode(Uint8Array.of(0, 1)); // '0001'
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function createCodec(spec: CodecSpec | string): ICodec;
|
|
21
|
+
/**
|
|
22
|
+
* Returns the codec for a spec, building it once per spec object.
|
|
23
|
+
*
|
|
24
|
+
* Named bases always resolve to the same spec object, so they are built once
|
|
25
|
+
* for the lifetime of the process.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getCodec(spec: CodecSpec): ICodec;
|
|
28
|
+
export { RadixCodec } from './codec-radix.js';
|
|
29
|
+
export { BlockCodec } from './codec-block.js';
|
|
30
|
+
export { Block85Codec } from './codec-block85.js';
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated Use `createCodec({ alphabet, algorithm: 'radix' })`, or
|
|
33
|
+
* `createCodec(alphabet)` for the same thing.
|
|
34
|
+
*/
|
|
35
|
+
export declare class Codec extends RadixCodec {
|
|
36
|
+
constructor(chars: string);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAY5D;AAID;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAQhD;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,qBAAa,KAAM,SAAQ,UAAU;gBACvB,KAAK,EAAE,MAAM;CAG1B"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { RadixCodec } from './codec-radix.js';
|
|
2
|
+
import { BlockCodec } from './codec-block.js';
|
|
3
|
+
import { Block85Codec } from './codec-block85.js';
|
|
4
|
+
/**
|
|
5
|
+
* Builds the codec described by a spec.
|
|
6
|
+
*
|
|
7
|
+
* A bare string is read as a custom alphabet for a radix conversion, which is
|
|
8
|
+
* the only algorithm that works with an alphabet of any length.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import { createCodec } from 'bufferbase';
|
|
13
|
+
*
|
|
14
|
+
* const binary = createCodec('01');
|
|
15
|
+
* binary.encode(Uint8Array.of(5)); // '101'
|
|
16
|
+
*
|
|
17
|
+
* const paddedHex = createCodec({ alphabet: '0123456789abcdef', algorithm: 'block' });
|
|
18
|
+
* paddedHex.encode(Uint8Array.of(0, 1)); // '0001'
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export function createCodec(spec) {
|
|
22
|
+
const resolved = typeof spec === 'string' ? { alphabet: spec, algorithm: 'radix' } : spec;
|
|
23
|
+
switch (resolved.algorithm) {
|
|
24
|
+
case 'radix':
|
|
25
|
+
return new RadixCodec(resolved);
|
|
26
|
+
case 'block':
|
|
27
|
+
return new BlockCodec(resolved);
|
|
28
|
+
case 'block85':
|
|
29
|
+
return new Block85Codec(resolved);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const cache = new WeakMap();
|
|
33
|
+
/**
|
|
34
|
+
* Returns the codec for a spec, building it once per spec object.
|
|
35
|
+
*
|
|
36
|
+
* Named bases always resolve to the same spec object, so they are built once
|
|
37
|
+
* for the lifetime of the process.
|
|
38
|
+
*/
|
|
39
|
+
export function getCodec(spec) {
|
|
40
|
+
const cached = cache.get(spec);
|
|
41
|
+
if (cached !== undefined) {
|
|
42
|
+
return cached;
|
|
43
|
+
}
|
|
44
|
+
const codec = createCodec(spec);
|
|
45
|
+
cache.set(spec, codec);
|
|
46
|
+
return codec;
|
|
47
|
+
}
|
|
48
|
+
export { RadixCodec } from './codec-radix.js';
|
|
49
|
+
export { BlockCodec } from './codec-block.js';
|
|
50
|
+
export { Block85Codec } from './codec-block85.js';
|
|
51
|
+
/**
|
|
52
|
+
* @deprecated Use `createCodec({ alphabet, algorithm: 'radix' })`, or
|
|
53
|
+
* `createCodec(alphabet)` for the same thing.
|
|
54
|
+
*/
|
|
55
|
+
export class Codec extends RadixCodec {
|
|
56
|
+
constructor(chars) {
|
|
57
|
+
super({ alphabet: chars, algorithm: 'radix' });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/codec.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAC,IAAwB;IAClD,MAAM,QAAQ,GACZ,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3E,QAAQ,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC3B,KAAK,OAAO;YACV,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,KAAK,OAAO;YACV,OAAO,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,KAAK,SAAS;YACZ,OAAO,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,KAAK,GAAG,IAAI,OAAO,EAAqB,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAe;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,OAAO,KAAM,SAAQ,UAAU;IACnC,YAAY,KAAa;QACvB,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ICodec } from './types.js';
|
|
2
|
+
import { type BaseName } from './bases.js';
|
|
3
|
+
/**
|
|
4
|
+
* A ready-made codec for every name in `Bases`.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { Codecs } from 'bufferbase';
|
|
9
|
+
*
|
|
10
|
+
* Codecs.base58.encode(Buffer.from('Hello')); // '9Ajdvzr'
|
|
11
|
+
* Codecs.base64.encode(Buffer.from('fo')); // 'Zm8='
|
|
12
|
+
* Codecs.base58.convertTo(Codecs.base64url, '9Ajdvzr');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare const Codecs: Record<BaseName, ICodec>;
|
|
16
|
+
/**
|
|
17
|
+
* Type representing valid codec names in the `Codecs` object.
|
|
18
|
+
*/
|
|
19
|
+
export type CodecName = BaseName;
|
|
20
|
+
//# sourceMappingURL=codecs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codecs.d.ts","sourceRoot":"","sources":["../../src/codecs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAS,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGlD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,MAAM,EAEd,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE9B;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Bases } from './bases.js';
|
|
2
|
+
import { getCodec } from './codec.js';
|
|
3
|
+
/**
|
|
4
|
+
* A ready-made codec for every name in `Bases`.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { Codecs } from 'bufferbase';
|
|
9
|
+
*
|
|
10
|
+
* Codecs.base58.encode(Buffer.from('Hello')); // '9Ajdvzr'
|
|
11
|
+
* Codecs.base64.encode(Buffer.from('fo')); // 'Zm8='
|
|
12
|
+
* Codecs.base58.convertTo(Codecs.base64url, '9Ajdvzr');
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const Codecs = Object.fromEntries(Object.entries(Bases).map(([name, spec]) => [name, getCodec(spec)]));
|
|
16
|
+
//# sourceMappingURL=codecs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codecs.js","sourceRoot":"","sources":["../../src/codecs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAiB,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CACtC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CACxC,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error thrown when an invalid character is encountered during decoding.
|
|
3
|
+
*/
|
|
4
|
+
export declare class InvalidCharacterError extends Error {
|
|
5
|
+
/**
|
|
6
|
+
* @param char - The invalid character that was encountered (optional)
|
|
7
|
+
*/
|
|
8
|
+
constructor(char?: string);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Error thrown when the decoded buffer does not have the size requested
|
|
12
|
+
* through `DecodeOptions.size`.
|
|
13
|
+
*/
|
|
14
|
+
export declare class BufferSizeError extends Error {
|
|
15
|
+
/**
|
|
16
|
+
* @param actual - The actual decoded buffer size
|
|
17
|
+
* @param expected - The expected (specified) buffer size
|
|
18
|
+
*/
|
|
19
|
+
constructor(actual: number, expected: number);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Error thrown when an unknown base name is provided.
|
|
23
|
+
*/
|
|
24
|
+
export declare class UnknownBaseError extends Error {
|
|
25
|
+
/**
|
|
26
|
+
* @param name - The unknown base name that was provided
|
|
27
|
+
*/
|
|
28
|
+
constructor(name: string);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Error thrown when a string cannot be the encoding of any byte sequence
|
|
32
|
+
* because of its length.
|
|
33
|
+
*
|
|
34
|
+
* A Base64 string of 5 characters, for example, describes 30 bits: too many
|
|
35
|
+
* for 3 bytes and too few for 4.
|
|
36
|
+
*/
|
|
37
|
+
export declare class InvalidLengthError extends Error {
|
|
38
|
+
/**
|
|
39
|
+
* @param length - The length that cannot occur
|
|
40
|
+
* @param detail - What the length should have been
|
|
41
|
+
*/
|
|
42
|
+
constructor(length: number, detail: string);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Error thrown when input is well-formed but is not the canonical encoding of
|
|
46
|
+
* the bytes it decodes to (RFC 4648 §3.5).
|
|
47
|
+
*
|
|
48
|
+
* Accepting such input makes decoding non-injective: `'Zm8='` and `'Zm9='`
|
|
49
|
+
* would both decode to `'fo'`. Pass `strict: false` in the codec spec to allow
|
|
50
|
+
* it.
|
|
51
|
+
*/
|
|
52
|
+
export declare class NonCanonicalError extends Error {
|
|
53
|
+
/**
|
|
54
|
+
* @param detail - What made the input non-canonical
|
|
55
|
+
*/
|
|
56
|
+
constructor(detail: string);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Error thrown when a codec spec cannot be realised, such as a `'block'`
|
|
60
|
+
* algorithm with an alphabet whose length is not a power of two.
|
|
61
|
+
*/
|
|
62
|
+
export declare class InvalidCodecError extends Error {
|
|
63
|
+
/**
|
|
64
|
+
* @param detail - Why the spec is unusable
|
|
65
|
+
*/
|
|
66
|
+
constructor(detail: string);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Error thrown when a group of characters denotes a number too large for the
|
|
70
|
+
* bytes it is supposed to encode.
|
|
71
|
+
*
|
|
72
|
+
* In an Ascii85 group, five characters must denote a value below 2^32; `'s8W-!'`
|
|
73
|
+
* does not, so it encodes nothing. Unlike `NonCanonicalError` this is never
|
|
74
|
+
* allowed, because there is no byte sequence to decode to.
|
|
75
|
+
*/
|
|
76
|
+
export declare class ValueRangeError extends Error {
|
|
77
|
+
/**
|
|
78
|
+
* @param group - The group of characters that is out of range
|
|
79
|
+
*/
|
|
80
|
+
constructor(group: string);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Error thrown when a trailing check symbol does not match the value it
|
|
84
|
+
* follows, which means the string was mistyped or corrupted.
|
|
85
|
+
*/
|
|
86
|
+
export declare class CheckSymbolError extends Error {
|
|
87
|
+
/**
|
|
88
|
+
* @param found - The check symbol present in the input
|
|
89
|
+
* @param expected - The check symbol the value calls for
|
|
90
|
+
*/
|
|
91
|
+
constructor(found: string, expected: string);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C;;OAEG;gBACS,IAAI,CAAC,EAAE,MAAM;CAK1B;AAED;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC;;;OAGG;gBACS,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAI7C;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC;;OAEG;gBACS,IAAI,EAAE,MAAM;CAOzB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C;;;OAGG;gBACS,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAI3C;AAED;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C;;OAEG;gBACS,MAAM,EAAE,MAAM;CAI3B;AAED;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C;;OAEG;gBACS,MAAM,EAAE,MAAM;CAI3B;AAED;;;;;;;GAOG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACxC;;OAEG;gBACS,KAAK,EAAE,MAAM;CAI1B;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC;;;OAGG;gBACS,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAI5C"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error thrown when an invalid character is encountered during decoding.
|
|
3
|
+
*/
|
|
4
|
+
export class InvalidCharacterError extends Error {
|
|
5
|
+
/**
|
|
6
|
+
* @param char - The invalid character that was encountered (optional)
|
|
7
|
+
*/
|
|
8
|
+
constructor(char) {
|
|
9
|
+
const message = char ? `Invalid character found: '${char}'` : 'Invalid character found';
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = 'InvalidCharacterError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown when the decoded buffer does not have the size requested
|
|
16
|
+
* through `DecodeOptions.size`.
|
|
17
|
+
*/
|
|
18
|
+
export class BufferSizeError extends Error {
|
|
19
|
+
/**
|
|
20
|
+
* @param actual - The actual decoded buffer size
|
|
21
|
+
* @param expected - The expected (specified) buffer size
|
|
22
|
+
*/
|
|
23
|
+
constructor(actual, expected) {
|
|
24
|
+
super(`Buffer size ${actual} does not match specified size ${expected}`);
|
|
25
|
+
this.name = 'BufferSizeError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Error thrown when an unknown base name is provided.
|
|
30
|
+
*/
|
|
31
|
+
export class UnknownBaseError extends Error {
|
|
32
|
+
/**
|
|
33
|
+
* @param name - The unknown base name that was provided
|
|
34
|
+
*/
|
|
35
|
+
constructor(name) {
|
|
36
|
+
super(`Unknown base encoding: '${name}'. ` +
|
|
37
|
+
'Pass a CodecSpec such as { alphabet, algorithm: \'radix\' } to use a custom alphabet.');
|
|
38
|
+
this.name = 'UnknownBaseError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Error thrown when a string cannot be the encoding of any byte sequence
|
|
43
|
+
* because of its length.
|
|
44
|
+
*
|
|
45
|
+
* A Base64 string of 5 characters, for example, describes 30 bits: too many
|
|
46
|
+
* for 3 bytes and too few for 4.
|
|
47
|
+
*/
|
|
48
|
+
export class InvalidLengthError extends Error {
|
|
49
|
+
/**
|
|
50
|
+
* @param length - The length that cannot occur
|
|
51
|
+
* @param detail - What the length should have been
|
|
52
|
+
*/
|
|
53
|
+
constructor(length, detail) {
|
|
54
|
+
super(`Invalid encoded length ${length}: ${detail}`);
|
|
55
|
+
this.name = 'InvalidLengthError';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Error thrown when input is well-formed but is not the canonical encoding of
|
|
60
|
+
* the bytes it decodes to (RFC 4648 §3.5).
|
|
61
|
+
*
|
|
62
|
+
* Accepting such input makes decoding non-injective: `'Zm8='` and `'Zm9='`
|
|
63
|
+
* would both decode to `'fo'`. Pass `strict: false` in the codec spec to allow
|
|
64
|
+
* it.
|
|
65
|
+
*/
|
|
66
|
+
export class NonCanonicalError extends Error {
|
|
67
|
+
/**
|
|
68
|
+
* @param detail - What made the input non-canonical
|
|
69
|
+
*/
|
|
70
|
+
constructor(detail) {
|
|
71
|
+
super(`Non-canonical encoding: ${detail}`);
|
|
72
|
+
this.name = 'NonCanonicalError';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Error thrown when a codec spec cannot be realised, such as a `'block'`
|
|
77
|
+
* algorithm with an alphabet whose length is not a power of two.
|
|
78
|
+
*/
|
|
79
|
+
export class InvalidCodecError extends Error {
|
|
80
|
+
/**
|
|
81
|
+
* @param detail - Why the spec is unusable
|
|
82
|
+
*/
|
|
83
|
+
constructor(detail) {
|
|
84
|
+
super(`Invalid codec: ${detail}`);
|
|
85
|
+
this.name = 'InvalidCodecError';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Error thrown when a group of characters denotes a number too large for the
|
|
90
|
+
* bytes it is supposed to encode.
|
|
91
|
+
*
|
|
92
|
+
* In an Ascii85 group, five characters must denote a value below 2^32; `'s8W-!'`
|
|
93
|
+
* does not, so it encodes nothing. Unlike `NonCanonicalError` this is never
|
|
94
|
+
* allowed, because there is no byte sequence to decode to.
|
|
95
|
+
*/
|
|
96
|
+
export class ValueRangeError extends Error {
|
|
97
|
+
/**
|
|
98
|
+
* @param group - The group of characters that is out of range
|
|
99
|
+
*/
|
|
100
|
+
constructor(group) {
|
|
101
|
+
super(`Encoded group '${group}' exceeds the maximum value for its block`);
|
|
102
|
+
this.name = 'ValueRangeError';
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Error thrown when a trailing check symbol does not match the value it
|
|
107
|
+
* follows, which means the string was mistyped or corrupted.
|
|
108
|
+
*/
|
|
109
|
+
export class CheckSymbolError extends Error {
|
|
110
|
+
/**
|
|
111
|
+
* @param found - The check symbol present in the input
|
|
112
|
+
* @param expected - The check symbol the value calls for
|
|
113
|
+
*/
|
|
114
|
+
constructor(found, expected) {
|
|
115
|
+
super(`Check symbol '${found}' does not match the expected '${expected}'`);
|
|
116
|
+
this.name = 'CheckSymbolError';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C;;OAEG;IACH,YAAY,IAAa;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,6BAA6B,IAAI,GAAG,CAAC,CAAC,CAAC,yBAAyB,CAAC;QACxF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC;;;OAGG;IACH,YAAY,MAAc,EAAE,QAAgB;QAC1C,KAAK,CAAC,eAAe,MAAM,kCAAkC,QAAQ,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;;OAEG;IACH,YAAY,IAAY;QACtB,KAAK,CACH,2BAA2B,IAAI,KAAK;YAClC,uFAAuF,CAC1F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;;;;GAMG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C;;;OAGG;IACH,YAAY,MAAc,EAAE,MAAc;QACxC,KAAK,CAAC,0BAA0B,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;;OAEG;IACH,YAAY,MAAc;QACxB,KAAK,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;;OAEG;IACH,YAAY,MAAc;QACxB,KAAK,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC;;OAEG;IACH,YAAY,KAAa;QACvB,KAAK,CAAC,kBAAkB,KAAK,2CAA2C,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;;;OAGG;IACH,YAAY,KAAa,EAAE,QAAgB;QACzC,KAAK,CAAC,iBAAiB,KAAK,kCAAkC,QAAQ,GAAG,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
|
package/dist/esm/example.js
CHANGED
|
@@ -1,37 +1,53 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { encode, decode, convert, validate, createCodec, Chars, Codecs } from './index.js';
|
|
3
3
|
const bytes = Buffer.from('Hello, World!', 'utf8');
|
|
4
|
-
//
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
const decoder = new BufferEncoder(Chars.Base64_URL_SAFE);
|
|
18
|
-
const decoded = decoder.decode(base64encoded);
|
|
4
|
+
// The same bytes under each algorithm.
|
|
5
|
+
console.log('=== Algorithms ===');
|
|
6
|
+
console.table({
|
|
7
|
+
'block base64': encode(bytes, 'base64'),
|
|
8
|
+
'block base32': encode(bytes, 'base32'),
|
|
9
|
+
'block85 ascii85': encode(bytes, 'ascii85'),
|
|
10
|
+
'radix base58': encode(bytes, 'base58'),
|
|
11
|
+
'radix base32crockford': encode(bytes, 'base32crockford'),
|
|
12
|
+
});
|
|
13
|
+
// Converting goes through the bytes, so any pair works.
|
|
14
|
+
console.log('\n=== Function API ===');
|
|
15
|
+
const base58 = encode(bytes, 'base58');
|
|
16
|
+
const base64url = convert(base58, 'base58', 'base64url');
|
|
19
17
|
console.table({
|
|
20
18
|
bytes: bytes.toString('utf8'),
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
base58,
|
|
20
|
+
base64url,
|
|
21
|
+
valid: validate(base64url, 'base64url'),
|
|
22
|
+
decoded: decode(base64url, 'base64url').toString('utf8'),
|
|
23
|
+
});
|
|
24
|
+
// validate() agrees with decode(): it checks length, padding and canonicality.
|
|
25
|
+
console.log('\n=== Rejected input ===');
|
|
26
|
+
console.table({
|
|
27
|
+
"'Zm8=' (canonical)": validate('Zm8=', 'base64'),
|
|
28
|
+
"'Zm9=' (spare bits set)": validate('Zm9=', 'base64'),
|
|
29
|
+
"'Zm9vd' (5 characters)": validate('Zm9vd', 'base64'),
|
|
30
|
+
});
|
|
31
|
+
// Crockford's Base32 reads what a person is likely to have written down.
|
|
32
|
+
console.log('\n=== Crockford ===');
|
|
33
|
+
const crockford = encode(bytes, 'base32crockfordcheck');
|
|
34
|
+
console.table({
|
|
35
|
+
encoded: crockford,
|
|
36
|
+
'as typed': decode(`${crockford.slice(0, 4)}-${crockford.slice(4)}`.toLowerCase(), 'base32crockfordcheck').toString('utf8'),
|
|
37
|
+
'one character changed': validate(`${crockford.slice(0, -2)}Z${crockford.slice(-1)}`, 'base32crockfordcheck'),
|
|
38
|
+
});
|
|
39
|
+
// Codecs, and a custom alphabet.
|
|
40
|
+
console.log('\n=== Codecs and custom alphabets ===');
|
|
41
|
+
const binary = createCodec('01');
|
|
42
|
+
const adobe = createCodec({
|
|
43
|
+
alphabet: Chars.Ascii85,
|
|
44
|
+
algorithm: 'block85',
|
|
45
|
+
zeroShortcut: true,
|
|
46
|
+
delimiters: true,
|
|
47
|
+
});
|
|
48
|
+
console.table({
|
|
49
|
+
'Codecs.base58': Codecs.base58.encode(bytes),
|
|
50
|
+
'binary of [5]': binary.encode(Uint8Array.of(5)),
|
|
51
|
+
'adobe ascii85': adobe.encode(bytes),
|
|
26
52
|
});
|
|
27
|
-
// ┌─────────────────┬─────────────────────────┐
|
|
28
|
-
// │ (index) │ Values │
|
|
29
|
-
// ├─────────────────┼─────────────────────────┤
|
|
30
|
-
// │ bytes │ 'Hello, World!' │
|
|
31
|
-
// │ base32encoded │ '4GSBCDHQJR82QDXS6RS11' │
|
|
32
|
-
// │ base58encoded │ '72k1xXWG59fYdzSNoA' │
|
|
33
|
-
// │ base64encoded │ 'BIZWxsbywgV29ybGQh' │
|
|
34
|
-
// │ isValidAsBase64 │ true │
|
|
35
|
-
// │ decoded │ 'Hello, World!' │
|
|
36
|
-
// └─────────────────┴─────────────────────────┘
|
|
37
53
|
//# sourceMappingURL=example.js.map
|