bufferbase 2.0.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.
Files changed (115) hide show
  1. package/README.md +151 -63
  2. package/dist/cjs/bases.d.ts +152 -45
  3. package/dist/cjs/bases.d.ts.map +1 -1
  4. package/dist/cjs/bases.js +90 -77
  5. package/dist/cjs/bases.js.map +1 -1
  6. package/dist/cjs/bufferbase.d.ts +21 -27
  7. package/dist/cjs/bufferbase.d.ts.map +1 -1
  8. package/dist/cjs/bufferbase.js +21 -31
  9. package/dist/cjs/bufferbase.js.map +1 -1
  10. package/dist/cjs/codec-base.d.ts +56 -0
  11. package/dist/cjs/codec-base.d.ts.map +1 -0
  12. package/dist/cjs/codec-base.js +132 -0
  13. package/dist/cjs/codec-base.js.map +1 -0
  14. package/dist/cjs/codec-block.d.ts +47 -0
  15. package/dist/cjs/codec-block.d.ts.map +1 -0
  16. package/dist/cjs/codec-block.js +213 -0
  17. package/dist/cjs/codec-block.js.map +1 -0
  18. package/dist/cjs/codec-block85.d.ts +56 -0
  19. package/dist/cjs/codec-block85.d.ts.map +1 -0
  20. package/dist/cjs/codec-block85.js +271 -0
  21. package/dist/cjs/codec-block85.js.map +1 -0
  22. package/dist/cjs/codec-radix.d.ts +46 -0
  23. package/dist/cjs/codec-radix.d.ts.map +1 -0
  24. package/dist/cjs/codec-radix.js +181 -0
  25. package/dist/cjs/codec-radix.js.map +1 -0
  26. package/dist/cjs/codec.d.ts +25 -111
  27. package/dist/cjs/codec.d.ts.map +1 -1
  28. package/dist/cjs/codec.js +50 -228
  29. package/dist/cjs/codec.js.map +1 -1
  30. package/dist/cjs/codecs.d.ts +8 -59
  31. package/dist/cjs/codecs.d.ts.map +1 -1
  32. package/dist/cjs/codecs.js +6 -79
  33. package/dist/cjs/codecs.js.map +1 -1
  34. package/dist/cjs/errors.d.ts +65 -48
  35. package/dist/cjs/errors.d.ts.map +1 -1
  36. package/dist/cjs/errors.js +89 -51
  37. package/dist/cjs/errors.js.map +1 -1
  38. package/dist/cjs/example.js +44 -21
  39. package/dist/cjs/example.js.map +1 -1
  40. package/dist/cjs/functions.d.ts +27 -31
  41. package/dist/cjs/functions.d.ts.map +1 -1
  42. package/dist/cjs/functions.js +25 -47
  43. package/dist/cjs/functions.js.map +1 -1
  44. package/dist/cjs/index.d.ts +7 -5
  45. package/dist/cjs/index.d.ts.map +1 -1
  46. package/dist/cjs/index.js +17 -7
  47. package/dist/cjs/index.js.map +1 -1
  48. package/dist/cjs/package.json +13 -7
  49. package/dist/cjs/types.d.ts +108 -71
  50. package/dist/cjs/types.d.ts.map +1 -1
  51. package/dist/esm/bases.d.ts +152 -45
  52. package/dist/esm/bases.d.ts.map +1 -1
  53. package/dist/esm/bases.js +88 -75
  54. package/dist/esm/bases.js.map +1 -1
  55. package/dist/esm/bufferbase.d.ts +21 -27
  56. package/dist/esm/bufferbase.d.ts.map +1 -1
  57. package/dist/esm/bufferbase.js +18 -30
  58. package/dist/esm/bufferbase.js.map +1 -1
  59. package/dist/esm/codec-base.d.ts +56 -0
  60. package/dist/esm/codec-base.d.ts.map +1 -0
  61. package/dist/esm/codec-base.js +127 -0
  62. package/dist/esm/codec-base.js.map +1 -0
  63. package/dist/esm/codec-block.d.ts +47 -0
  64. package/dist/esm/codec-block.d.ts.map +1 -0
  65. package/dist/esm/codec-block.js +209 -0
  66. package/dist/esm/codec-block.js.map +1 -0
  67. package/dist/esm/codec-block85.d.ts +56 -0
  68. package/dist/esm/codec-block85.d.ts.map +1 -0
  69. package/dist/esm/codec-block85.js +267 -0
  70. package/dist/esm/codec-block85.js.map +1 -0
  71. package/dist/esm/codec-radix.d.ts +46 -0
  72. package/dist/esm/codec-radix.d.ts.map +1 -0
  73. package/dist/esm/codec-radix.js +177 -0
  74. package/dist/esm/codec-radix.js.map +1 -0
  75. package/dist/esm/codec.d.ts +25 -111
  76. package/dist/esm/codec.d.ts.map +1 -1
  77. package/dist/esm/codec.js +44 -226
  78. package/dist/esm/codec.js.map +1 -1
  79. package/dist/esm/codecs.d.ts +8 -59
  80. package/dist/esm/codecs.d.ts.map +1 -1
  81. package/dist/esm/codecs.js +7 -80
  82. package/dist/esm/codecs.js.map +1 -1
  83. package/dist/esm/errors.d.ts +65 -48
  84. package/dist/esm/errors.d.ts.map +1 -1
  85. package/dist/esm/errors.js +83 -50
  86. package/dist/esm/errors.js.map +1 -1
  87. package/dist/esm/example.js +45 -22
  88. package/dist/esm/example.js.map +1 -1
  89. package/dist/esm/functions.d.ts +27 -31
  90. package/dist/esm/functions.d.ts.map +1 -1
  91. package/dist/esm/functions.js +26 -48
  92. package/dist/esm/functions.js.map +1 -1
  93. package/dist/esm/index.d.ts +7 -5
  94. package/dist/esm/index.d.ts.map +1 -1
  95. package/dist/esm/index.js +6 -6
  96. package/dist/esm/index.js.map +1 -1
  97. package/dist/esm/package.json +13 -7
  98. package/dist/esm/types.d.ts +108 -71
  99. package/dist/esm/types.d.ts.map +1 -1
  100. package/package.json +13 -7
  101. package/src/algorithms.test.ts +442 -0
  102. package/src/bases.ts +98 -76
  103. package/src/bufferbase.ts +26 -36
  104. package/src/codec-base.ts +181 -0
  105. package/src/codec-block.ts +258 -0
  106. package/src/codec-block85.ts +315 -0
  107. package/src/codec-radix.ts +206 -0
  108. package/src/codec.test.ts +17 -9
  109. package/src/codec.ts +48 -247
  110. package/src/codecs.ts +11 -105
  111. package/src/errors.ts +90 -50
  112. package/src/example.ts +47 -22
  113. package/src/functions.ts +34 -54
  114. package/src/index.ts +27 -7
  115. package/src/types.ts +113 -86
@@ -0,0 +1,47 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import type { BlockSpec, BufferLike, DecodeOptions } from './types.js';
3
+ import { BaseCodec } from './codec-base.js';
4
+ /**
5
+ * Regroups the bit stream into fixed-width chunks, as specified by RFC 4648.
6
+ *
7
+ * Each character carries `log2(alphabet.length)` bits, so the alphabet must
8
+ * hold 2, 4, 8, 16, 32, or 64 characters. Unlike a radix conversion the output
9
+ * length is a fixed function of the input length, which is what makes Base64
10
+ * and Base32 splittable and streamable.
11
+ *
12
+ * A trailing partial block leaves spare bits in the final character. RFC 4648
13
+ * §3.5 requires those bits to be zero for the encoding to be canonical; input
14
+ * that sets them is rejected unless the spec passes `strict: false`.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { Codecs } from 'bufferbase';
19
+ *
20
+ * Codecs.base64.encode(Buffer.from('fo')); // 'Zm8='
21
+ * Codecs.base64.validate('Zm9='); // false — spare bits are not zero
22
+ * ```
23
+ */
24
+ export declare class BlockCodec extends BaseCodec {
25
+ readonly algorithm: "block";
26
+ /** Bits carried by one character. */
27
+ private readonly bitsPerChar;
28
+ /** Characters in a whole block. */
29
+ private readonly charsPerBlock;
30
+ private readonly padChar;
31
+ private readonly native;
32
+ constructor(spec: BlockSpec);
33
+ encode(input: BufferLike): string;
34
+ /** The character-by-character path, for an alphabet that is not single-byte. */
35
+ private encodeAsText;
36
+ decode(encoded: string, options?: DecodeOptions): Buffer;
37
+ validate(input: string): boolean;
38
+ /**
39
+ * Strips and checks the padding, then verifies that what remains can be the
40
+ * encoding of some byte sequence. Returns the data characters.
41
+ *
42
+ * Everything `decode` can reject other than `DecodeOptions.size` is checked
43
+ * here, so `validate` and `decode` always agree.
44
+ */
45
+ private checkStructure;
46
+ }
47
+ //# sourceMappingURL=codec-block.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-block.d.ts","sourceRoot":"","sources":["../../src/codec-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,SAAS,EAAY,MAAM,iBAAiB,CAAC;AAwCtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,UAAW,SAAQ,SAAS;IACvC,QAAQ,CAAC,SAAS,EAAG,OAAO,CAAU;IAEtC,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,mCAAmC;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;gBAElC,IAAI,EAAE,SAAS;IA0B3B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;IA4CjC,gFAAgF;IAChF,OAAO,CAAC,YAAY;IA0BpB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM;IA4BxD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAShC;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;CA4CvB"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BlockCodec = void 0;
4
+ const node_buffer_1 = require("node:buffer");
5
+ const codec_base_js_1 = require("./codec-base.js");
6
+ const errors_js_1 = require("./errors.js");
7
+ const RFC_BASE64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
8
+ const RFC_BASE64URL = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
9
+ const HEX_LOWER = '0123456789abcdef';
10
+ const HEX_UPPER = '0123456789ABCDEF';
11
+ /**
12
+ * Finds the Node encoding equivalent to a spec, if there is one.
13
+ *
14
+ * Node's encoders are 100-250x faster than the loop below and always emit
15
+ * canonical output, so an exact match is handed off. Decoding is never handed
16
+ * off: Node's decoders are lenient, and rejecting non-canonical input is the
17
+ * point of this codec.
18
+ */
19
+ function nativeEncoderFor(alphabet, pad) {
20
+ if (alphabet === RFC_BASE64 && pad === '=') {
21
+ return { encoding: 'base64', upper: false };
22
+ }
23
+ if (alphabet === RFC_BASE64URL && pad === false) {
24
+ return { encoding: 'base64url', upper: false };
25
+ }
26
+ if (pad === false && (alphabet === HEX_LOWER || alphabet === HEX_UPPER)) {
27
+ return { encoding: 'hex', upper: alphabet === HEX_UPPER };
28
+ }
29
+ return null;
30
+ }
31
+ const gcd = (a, b) => (b === 0 ? a : gcd(b, a % b));
32
+ /**
33
+ * Regroups the bit stream into fixed-width chunks, as specified by RFC 4648.
34
+ *
35
+ * Each character carries `log2(alphabet.length)` bits, so the alphabet must
36
+ * hold 2, 4, 8, 16, 32, or 64 characters. Unlike a radix conversion the output
37
+ * length is a fixed function of the input length, which is what makes Base64
38
+ * and Base32 splittable and streamable.
39
+ *
40
+ * A trailing partial block leaves spare bits in the final character. RFC 4648
41
+ * §3.5 requires those bits to be zero for the encoding to be canonical; input
42
+ * that sets them is rejected unless the spec passes `strict: false`.
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * import { Codecs } from 'bufferbase';
47
+ *
48
+ * Codecs.base64.encode(Buffer.from('fo')); // 'Zm8='
49
+ * Codecs.base64.validate('Zm9='); // false — spare bits are not zero
50
+ * ```
51
+ */
52
+ class BlockCodec extends codec_base_js_1.BaseCodec {
53
+ constructor(spec) {
54
+ super(spec);
55
+ this.algorithm = 'block';
56
+ const bits = Math.log2(spec.alphabet.length);
57
+ if (!Number.isInteger(bits)) {
58
+ throw new errors_js_1.InvalidCodecError(`'block' needs an alphabet of 2, 4, 8, 16, 32, or 64 characters, got ${spec.alphabet.length}`);
59
+ }
60
+ const pad = spec.pad ?? '=';
61
+ if (pad !== false) {
62
+ if (pad.length !== 1) {
63
+ throw new errors_js_1.InvalidCodecError(`pad must be a single character, got '${pad}'`);
64
+ }
65
+ if (this.valueOf(pad) !== undefined) {
66
+ throw new errors_js_1.InvalidCodecError(`pad character '${pad}' is part of the alphabet`);
67
+ }
68
+ }
69
+ this.bitsPerChar = bits;
70
+ this.charsPerBlock = 8 / gcd(8, bits);
71
+ this.padChar = pad;
72
+ this.native = nativeEncoderFor(spec.alphabet, pad);
73
+ }
74
+ encode(input) {
75
+ const buffer = (0, codec_base_js_1.toBuffer)(input);
76
+ if (this.native !== null) {
77
+ const encoded = buffer.toString(this.native.encoding);
78
+ return this.native.upper ? encoded.toUpperCase() : encoded;
79
+ }
80
+ const bits = this.bitsPerChar;
81
+ const mask = this.chars.length - 1;
82
+ const codes = this.codes;
83
+ if (codes === null) {
84
+ return this.encodeAsText(buffer);
85
+ }
86
+ const dataChars = Math.ceil((buffer.length * 8) / bits);
87
+ const total = this.padChar === false
88
+ ? dataChars
89
+ : Math.ceil(dataChars / this.charsPerBlock) * this.charsPerBlock;
90
+ const written = new Uint8Array(total);
91
+ let at = 0;
92
+ let acc = 0;
93
+ let held = 0;
94
+ for (let i = 0; i < buffer.length; i++) {
95
+ acc = ((acc << 8) | buffer[i]) & 0xffff;
96
+ held += 8;
97
+ while (held >= bits) {
98
+ held -= bits;
99
+ written[at++] = codes[(acc >>> held) & mask];
100
+ }
101
+ }
102
+ if (held > 0) {
103
+ written[at++] = codes[(acc << (bits - held)) & mask];
104
+ }
105
+ if (this.padChar !== false) {
106
+ const padCode = this.padChar.charCodeAt(0);
107
+ while (at < total) {
108
+ written[at++] = padCode;
109
+ }
110
+ }
111
+ return this.textFrom(written, at);
112
+ }
113
+ /** The character-by-character path, for an alphabet that is not single-byte. */
114
+ encodeAsText(buffer) {
115
+ const bits = this.bitsPerChar;
116
+ const mask = this.chars.length - 1;
117
+ let out = '';
118
+ let acc = 0;
119
+ let held = 0;
120
+ for (const byte of buffer) {
121
+ acc = ((acc << 8) | byte) & 0xffff;
122
+ held += 8;
123
+ while (held >= bits) {
124
+ held -= bits;
125
+ out += this.chars[(acc >>> held) & mask];
126
+ }
127
+ }
128
+ if (held > 0) {
129
+ out += this.chars[(acc << (bits - held)) & mask];
130
+ }
131
+ if (this.padChar !== false) {
132
+ while (out.length % this.charsPerBlock !== 0) {
133
+ out += this.padChar;
134
+ }
135
+ }
136
+ return out;
137
+ }
138
+ decode(encoded, options) {
139
+ const data = this.checkStructure(this.strip(encoded));
140
+ const bits = this.bitsPerChar;
141
+ const bytes = node_buffer_1.Buffer.alloc(Math.floor((data.length * bits) / 8));
142
+ let at = 0;
143
+ let acc = 0;
144
+ let held = 0;
145
+ for (let i = 0; i < data.length; i++) {
146
+ const value = this.valueAt(data, i);
147
+ if (value < 0) {
148
+ throw new errors_js_1.InvalidCharacterError(data[i]);
149
+ }
150
+ acc = ((acc << bits) | value) & 0xffff;
151
+ held += bits;
152
+ if (held >= 8) {
153
+ held -= 8;
154
+ bytes[at++] = (acc >>> held) & 0xff;
155
+ }
156
+ }
157
+ const size = options?.size;
158
+ if (size !== undefined && bytes.length !== size) {
159
+ throw new errors_js_1.BufferSizeError(bytes.length, size);
160
+ }
161
+ return bytes;
162
+ }
163
+ validate(input) {
164
+ try {
165
+ this.checkStructure(this.strip(input));
166
+ return true;
167
+ }
168
+ catch {
169
+ return false;
170
+ }
171
+ }
172
+ /**
173
+ * Strips and checks the padding, then verifies that what remains can be the
174
+ * encoding of some byte sequence. Returns the data characters.
175
+ *
176
+ * Everything `decode` can reject other than `DecodeOptions.size` is checked
177
+ * here, so `validate` and `decode` always agree.
178
+ */
179
+ checkStructure(input) {
180
+ let data = input;
181
+ if (this.padChar !== false) {
182
+ let dataLength = input.length;
183
+ while (dataLength > 0 && input[dataLength - 1] === this.padChar) {
184
+ dataLength--;
185
+ }
186
+ data = input.slice(0, dataLength);
187
+ if (input.length % this.charsPerBlock !== 0) {
188
+ throw new errors_js_1.InvalidLengthError(input.length, `padded input must be a multiple of ${this.charsPerBlock} characters`);
189
+ }
190
+ if (input.length - dataLength >= this.charsPerBlock) {
191
+ throw new errors_js_1.InvalidLengthError(input.length, 'too many padding characters');
192
+ }
193
+ }
194
+ const bits = this.bitsPerChar;
195
+ const spare = (data.length * bits) % 8;
196
+ if (spare >= bits) {
197
+ throw new errors_js_1.InvalidLengthError(data.length, `${data.length} characters carry ${data.length * bits} bits, which is not a whole number of bytes`);
198
+ }
199
+ let last = -1;
200
+ for (let i = 0; i < data.length; i++) {
201
+ last = this.valueAt(data, i);
202
+ if (last < 0) {
203
+ throw new errors_js_1.InvalidCharacterError(data[i]);
204
+ }
205
+ }
206
+ if (this.strict && spare > 0 && last >= 0 && (last & ((1 << spare) - 1)) !== 0) {
207
+ throw new errors_js_1.NonCanonicalError(`the final character carries ${spare} spare bits that must be zero`);
208
+ }
209
+ return data;
210
+ }
211
+ }
212
+ exports.BlockCodec = BlockCodec;
213
+ //# sourceMappingURL=codec-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-block.js","sourceRoot":"","sources":["../../src/codec-block.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { Buffer } from 'node:buffer';
2
+ import type { Block85Spec, BufferLike, DecodeOptions } from './types.js';
3
+ import { BaseCodec } from './codec-base.js';
4
+ /**
5
+ * Converts each 4-byte block to 5 characters, the Ascii85 and Z85 family.
6
+ *
7
+ * 85^5 is the smallest power of 85 above 2^32, so five characters are enough
8
+ * for four bytes and the expansion is 25% instead of Base64's 33%.
9
+ *
10
+ * Several mutually incompatible encodings share this algorithm and alphabet,
11
+ * differing only in the shortcuts and framing they add. They are options here
12
+ * rather than separate codecs: the btoa form is `zeroShortcut` plus
13
+ * `spaceShortcut`, and the Adobe form is `zeroShortcut` plus `delimiters`. The
14
+ * default, `zeroShortcut` alone, matches Python's `base64.a85encode`.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { Codecs } from 'bufferbase';
19
+ *
20
+ * Codecs.ascii85.encode(Buffer.from('Man ')); // '9jqo^'
21
+ * Codecs.ascii85.encode(Buffer.alloc(4)); // 'z'
22
+ * ```
23
+ */
24
+ export declare class Block85Codec extends BaseCodec {
25
+ readonly algorithm: "block85";
26
+ private readonly zeroShortcut;
27
+ private readonly spaceShortcut;
28
+ private readonly delimiters;
29
+ private readonly requireFullBlocks;
30
+ constructor(spec: Block85Spec);
31
+ encode(input: BufferLike): string;
32
+ decode(encoded: string, options?: DecodeOptions): Buffer;
33
+ validate(input: string): boolean;
34
+ /** Writes an ASCII marker, returning how many bytes it took. */
35
+ private writeAscii;
36
+ /** The character-by-character path, for an alphabet that is not single-byte. */
37
+ private encodeAsText;
38
+ /** Renders a block value as its five characters, most significant first. */
39
+ private digitsOf;
40
+ /** Removes the framing, rejecting input that is missing or misplacing it. */
41
+ private undelimit;
42
+ /**
43
+ * Decodes the body. Everything `decode` can reject other than
44
+ * `DecodeOptions.size` is checked here, so `validate` and `decode` agree.
45
+ */
46
+ private readBytes;
47
+ /**
48
+ * Decodes a trailing group of 2..4 characters into 1..3 bytes.
49
+ *
50
+ * The group is padded to a whole block with the highest digit so that the
51
+ * missing low-order bytes cannot round the value down, then the bytes the
52
+ * group actually carries are kept.
53
+ */
54
+ private readPartial;
55
+ }
56
+ //# sourceMappingURL=codec-block85.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-block85.d.ts","sourceRoot":"","sources":["../../src/codec-block85.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACzE,OAAO,EAAE,SAAS,EAAY,MAAM,iBAAiB,CAAC;AAqBtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAa,SAAQ,SAAS;IACzC,QAAQ,CAAC,SAAS,EAAG,SAAS,CAAU;IAExC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;gBAEhC,IAAI,EAAE,WAAW;IAuB7B,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;IAsEjC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM;IASxD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAShC,gEAAgE;IAChE,OAAO,CAAC,UAAU;IAOlB,gFAAgF;IAChF,OAAO,CAAC,YAAY;IAmBpB,4EAA4E;IAC5E,OAAO,CAAC,QAAQ;IAUhB,6EAA6E;IAC7E,OAAO,CAAC,SAAS;IAUjB;;;OAGG;IACH,OAAO,CAAC,SAAS;IA8CjB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;CA6CpB"}
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Block85Codec = void 0;
4
+ const node_buffer_1 = require("node:buffer");
5
+ const codec_base_js_1 = require("./codec-base.js");
6
+ const errors_js_1 = require("./errors.js");
7
+ const BYTES_PER_BLOCK = 4;
8
+ const CHARS_PER_BLOCK = 5;
9
+ const BLOCK_LIMIT = 4294967296;
10
+ const ZERO_CHAR = 'z';
11
+ const ZERO_CODE = ZERO_CHAR.charCodeAt(0);
12
+ const SPACE_CHAR = 'y';
13
+ const SPACE_CODE = SPACE_CHAR.charCodeAt(0);
14
+ const SPACE_BLOCK = 0x20202020;
15
+ const OPEN = '<~';
16
+ const CLOSE = '~>';
17
+ /**
18
+ * Converts each 4-byte block to 5 characters, the Ascii85 and Z85 family.
19
+ *
20
+ * 85^5 is the smallest power of 85 above 2^32, so five characters are enough
21
+ * for four bytes and the expansion is 25% instead of Base64's 33%.
22
+ *
23
+ * Several mutually incompatible encodings share this algorithm and alphabet,
24
+ * differing only in the shortcuts and framing they add. They are options here
25
+ * rather than separate codecs: the btoa form is `zeroShortcut` plus
26
+ * `spaceShortcut`, and the Adobe form is `zeroShortcut` plus `delimiters`. The
27
+ * default, `zeroShortcut` alone, matches Python's `base64.a85encode`.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * import { Codecs } from 'bufferbase';
32
+ *
33
+ * Codecs.ascii85.encode(Buffer.from('Man ')); // '9jqo^'
34
+ * Codecs.ascii85.encode(Buffer.alloc(4)); // 'z'
35
+ * ```
36
+ */
37
+ class Block85Codec extends codec_base_js_1.BaseCodec {
38
+ constructor(spec) {
39
+ super(spec);
40
+ this.algorithm = 'block85';
41
+ if (spec.alphabet.length !== 85) {
42
+ throw new errors_js_1.InvalidCodecError(`'block85' needs an alphabet of exactly 85 characters, got ${spec.alphabet.length}`);
43
+ }
44
+ for (const [enabled, char] of [
45
+ [spec.zeroShortcut, ZERO_CHAR],
46
+ [spec.spaceShortcut, SPACE_CHAR],
47
+ ]) {
48
+ if (enabled === true && this.valueOf(char) !== undefined) {
49
+ throw new errors_js_1.InvalidCodecError(`shortcut character '${char}' is part of the alphabet`);
50
+ }
51
+ }
52
+ this.zeroShortcut = spec.zeroShortcut ?? false;
53
+ this.spaceShortcut = spec.spaceShortcut ?? false;
54
+ this.delimiters = spec.delimiters ?? false;
55
+ this.requireFullBlocks = spec.requireFullBlocks ?? false;
56
+ }
57
+ encode(input) {
58
+ const buffer = (0, codec_base_js_1.toBuffer)(input);
59
+ if (this.requireFullBlocks && buffer.length % BYTES_PER_BLOCK !== 0) {
60
+ throw new errors_js_1.InvalidLengthError(buffer.length, `this codec encodes whole ${BYTES_PER_BLOCK}-byte blocks only`);
61
+ }
62
+ const codes = this.codes;
63
+ if (codes === null) {
64
+ return this.encodeAsText(buffer);
65
+ }
66
+ const blocks = Math.ceil(buffer.length / BYTES_PER_BLOCK);
67
+ const written = new Uint8Array(blocks * CHARS_PER_BLOCK + OPEN.length + CLOSE.length);
68
+ let at = 0;
69
+ if (this.delimiters) {
70
+ at += this.writeAscii(written, at, OPEN);
71
+ }
72
+ // Whole blocks, with the five divisions unrolled. Dividing a float by 85
73
+ // and truncating with `>>> 0` is several times quicker than `%` paired
74
+ // with `Math.floor`, because every quotient here still fits in 32 bits.
75
+ const whole = buffer.length - (buffer.length % BYTES_PER_BLOCK);
76
+ for (let from = 0; from < whole; from += BYTES_PER_BLOCK) {
77
+ const value = buffer.readUInt32BE(from);
78
+ if (this.zeroShortcut && value === 0) {
79
+ written[at++] = ZERO_CODE;
80
+ continue;
81
+ }
82
+ if (this.spaceShortcut && value === SPACE_BLOCK) {
83
+ written[at++] = SPACE_CODE;
84
+ continue;
85
+ }
86
+ const q1 = (value / 85) >>> 0;
87
+ const q2 = (q1 / 85) >>> 0;
88
+ const q3 = (q2 / 85) >>> 0;
89
+ const q4 = (q3 / 85) >>> 0;
90
+ written[at] = codes[q4];
91
+ written[at + 1] = codes[q3 - q4 * 85];
92
+ written[at + 2] = codes[q2 - q3 * 85];
93
+ written[at + 3] = codes[q1 - q2 * 85];
94
+ written[at + 4] = codes[value - q1 * 85];
95
+ at += CHARS_PER_BLOCK;
96
+ }
97
+ // The trailing partial block, encoded as `size + 1` characters.
98
+ if (whole < buffer.length) {
99
+ const size = buffer.length - whole;
100
+ let value = 0;
101
+ for (let i = 0; i < BYTES_PER_BLOCK; i++) {
102
+ value = value * 256 + (whole + i < buffer.length ? buffer[whole + i] : 0);
103
+ }
104
+ const digits = new Uint8Array(CHARS_PER_BLOCK);
105
+ for (let i = CHARS_PER_BLOCK - 1; i >= 0; i--) {
106
+ const quotient = (value / 85) >>> 0;
107
+ digits[i] = codes[value - quotient * 85];
108
+ value = quotient;
109
+ }
110
+ for (let i = 0; i <= size; i++) {
111
+ written[at++] = digits[i];
112
+ }
113
+ }
114
+ if (this.delimiters) {
115
+ at += this.writeAscii(written, at, CLOSE);
116
+ }
117
+ return this.textFrom(written, at);
118
+ }
119
+ decode(encoded, options) {
120
+ const bytes = this.readBytes(this.undelimit(this.strip(encoded)));
121
+ const size = options?.size;
122
+ if (size !== undefined && bytes.length !== size) {
123
+ throw new errors_js_1.BufferSizeError(bytes.length, size);
124
+ }
125
+ return node_buffer_1.Buffer.from(bytes);
126
+ }
127
+ validate(input) {
128
+ try {
129
+ this.readBytes(this.undelimit(this.strip(input)));
130
+ return true;
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ }
136
+ /** Writes an ASCII marker, returning how many bytes it took. */
137
+ writeAscii(into, at, text) {
138
+ for (let i = 0; i < text.length; i++) {
139
+ into[at + i] = text.charCodeAt(i);
140
+ }
141
+ return text.length;
142
+ }
143
+ /** The character-by-character path, for an alphabet that is not single-byte. */
144
+ encodeAsText(buffer) {
145
+ let out = '';
146
+ for (let at = 0; at < buffer.length; at += BYTES_PER_BLOCK) {
147
+ const size = Math.min(BYTES_PER_BLOCK, buffer.length - at);
148
+ let value = 0;
149
+ for (let i = 0; i < BYTES_PER_BLOCK; i++) {
150
+ value = value * 256 + (at + i < buffer.length ? buffer[at + i] : 0);
151
+ }
152
+ if (size === BYTES_PER_BLOCK && this.zeroShortcut && value === 0) {
153
+ out += ZERO_CHAR;
154
+ }
155
+ else if (size === BYTES_PER_BLOCK && this.spaceShortcut && value === SPACE_BLOCK) {
156
+ out += SPACE_CHAR;
157
+ }
158
+ else {
159
+ out += this.digitsOf(value).slice(0, size === BYTES_PER_BLOCK ? CHARS_PER_BLOCK : size + 1);
160
+ }
161
+ }
162
+ return this.delimiters ? OPEN + out + CLOSE : out;
163
+ }
164
+ /** Renders a block value as its five characters, most significant first. */
165
+ digitsOf(value) {
166
+ let rest = value;
167
+ const digits = [];
168
+ for (let i = 0; i < CHARS_PER_BLOCK; i++) {
169
+ digits.unshift(this.chars[rest % 85]);
170
+ rest = Math.floor(rest / 85);
171
+ }
172
+ return digits.join('');
173
+ }
174
+ /** Removes the framing, rejecting input that is missing or misplacing it. */
175
+ undelimit(input) {
176
+ if (!this.delimiters) {
177
+ return input;
178
+ }
179
+ if (!input.startsWith(OPEN) || !input.endsWith(CLOSE) || input.length < OPEN.length + CLOSE.length) {
180
+ throw new errors_js_1.InvalidCharacterError();
181
+ }
182
+ return input.slice(OPEN.length, input.length - CLOSE.length);
183
+ }
184
+ /**
185
+ * Decodes the body. Everything `decode` can reject other than
186
+ * `DecodeOptions.size` is checked here, so `validate` and `decode` agree.
187
+ */
188
+ readBytes(body) {
189
+ const bytes = [];
190
+ let held = 0;
191
+ let value = 0;
192
+ let groupAt = 0;
193
+ for (let i = 0; i < body.length; i++) {
194
+ if (held === 0) {
195
+ const code = body.charCodeAt(i);
196
+ if (this.zeroShortcut && code === ZERO_CODE) {
197
+ bytes.push(0, 0, 0, 0);
198
+ continue;
199
+ }
200
+ if (this.spaceShortcut && code === SPACE_CODE) {
201
+ bytes.push(0x20, 0x20, 0x20, 0x20);
202
+ continue;
203
+ }
204
+ groupAt = i;
205
+ }
206
+ const digit = this.valueAt(body, i);
207
+ if (digit < 0) {
208
+ throw new errors_js_1.InvalidCharacterError(body[i]);
209
+ }
210
+ value = value * 85 + digit;
211
+ held++;
212
+ if (held === CHARS_PER_BLOCK) {
213
+ if (value >= BLOCK_LIMIT) {
214
+ throw new errors_js_1.ValueRangeError(body.slice(groupAt, i + 1));
215
+ }
216
+ bytes.push((value / 0x1000000) & 0xff, (value / 0x10000) & 0xff, (value / 0x100) & 0xff, value & 0xff);
217
+ held = 0;
218
+ value = 0;
219
+ }
220
+ }
221
+ if (held > 0) {
222
+ this.readPartial(body.slice(groupAt), bytes);
223
+ }
224
+ return bytes;
225
+ }
226
+ /**
227
+ * Decodes a trailing group of 2..4 characters into 1..3 bytes.
228
+ *
229
+ * The group is padded to a whole block with the highest digit so that the
230
+ * missing low-order bytes cannot round the value down, then the bytes the
231
+ * group actually carries are kept.
232
+ */
233
+ readPartial(group, bytes) {
234
+ if (this.requireFullBlocks) {
235
+ throw new errors_js_1.InvalidLengthError(group.length, `this codec decodes whole ${CHARS_PER_BLOCK}-character blocks only`);
236
+ }
237
+ if (group.length < 2) {
238
+ throw new errors_js_1.InvalidLengthError(group.length, `a trailing group needs at least 2 characters to carry a byte`);
239
+ }
240
+ const padded = group.padEnd(CHARS_PER_BLOCK, this.chars[84]);
241
+ let value = 0;
242
+ for (let i = 0; i < CHARS_PER_BLOCK; i++) {
243
+ const digit = this.valueAt(padded, i);
244
+ if (digit < 0) {
245
+ throw new errors_js_1.InvalidCharacterError(padded[i]);
246
+ }
247
+ value = value * 85 + digit;
248
+ }
249
+ if (value >= BLOCK_LIMIT) {
250
+ throw new errors_js_1.ValueRangeError(group);
251
+ }
252
+ const carried = group.length - 1;
253
+ const block = [];
254
+ for (let shift = 24; shift >= 0; shift -= 8) {
255
+ block.push((value / 2 ** shift) & 0xff);
256
+ }
257
+ const kept = block.slice(0, carried);
258
+ if (this.strict) {
259
+ let padded = 0;
260
+ for (let i = 0; i < BYTES_PER_BLOCK; i++) {
261
+ padded = padded * 256 + (i < carried ? kept[i] : 0);
262
+ }
263
+ if (this.digitsOf(padded).slice(0, group.length) !== group) {
264
+ throw new errors_js_1.NonCanonicalError(`'${group}' is not the shortest encoding of its bytes`);
265
+ }
266
+ }
267
+ bytes.push(...kept);
268
+ }
269
+ }
270
+ exports.Block85Codec = Block85Codec;
271
+ //# sourceMappingURL=codec-block85.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-block85.js","sourceRoot":"","sources":["../../src/codec-block85.ts"],"names":[],"mappings":"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"}