@helios-lang/effect 0.1.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/LICENSE +28 -0
- package/README.md +3 -0
- package/dist/Address.js +13 -0
- package/dist/Address.js.map +1 -0
- package/dist/Bech32.js +153 -0
- package/dist/Bech32.js.map +1 -0
- package/dist/Cbor.js +1171 -0
- package/dist/Cbor.js.map +1 -0
- package/dist/Uplc/Cek.js +3 -0
- package/dist/Uplc/Cek.js.map +1 -0
- package/dist/Uplc/Data.js +171 -0
- package/dist/Uplc/Data.js.map +1 -0
- package/dist/Uplc/DataSchema.js +118 -0
- package/dist/Uplc/DataSchema.js.map +1 -0
- package/dist/Uplc/Primitive.js +23 -0
- package/dist/Uplc/Primitive.js.map +1 -0
- package/dist/Uplc/index.js +4 -0
- package/dist/Uplc/index.js.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/Base32.js +201 -0
- package/dist/internal/Base32.js.map +1 -0
- package/dist/internal/BigEndian.js +56 -0
- package/dist/internal/BigEndian.js.map +1 -0
- package/dist/internal/Bits.js +300 -0
- package/dist/internal/Bits.js.map +1 -0
- package/dist/internal/Bytes.js +293 -0
- package/dist/internal/Bytes.js.map +1 -0
- package/dist/internal/Flat.js +298 -0
- package/dist/internal/Flat.js.map +1 -0
- package/dist/internal/Float.js +154 -0
- package/dist/internal/Float.js.map +1 -0
- package/dist/internal/Utf8.js +44 -0
- package/dist/internal/Utf8.js.map +1 -0
- package/eslint.config.mjs +30 -0
- package/package.json +36 -0
- package/src/Address.ts +20 -0
- package/src/Bech32.test.ts +117 -0
- package/src/Bech32.ts +198 -0
- package/src/Cbor.test.ts +1610 -0
- package/src/Cbor.ts +1704 -0
- package/src/Uplc/Cek.ts +92 -0
- package/src/Uplc/Data.ts +259 -0
- package/src/Uplc/DataSchema.test.ts +207 -0
- package/src/Uplc/DataSchema.ts +181 -0
- package/src/Uplc/Primitive.ts +56 -0
- package/src/Uplc/index.ts +3 -0
- package/src/index.ts +4 -0
- package/src/internal/Base32.test.ts +219 -0
- package/src/internal/Base32.ts +341 -0
- package/src/internal/BigEndian.test.ts +79 -0
- package/src/internal/BigEndian.ts +67 -0
- package/src/internal/Bits.test.ts +300 -0
- package/src/internal/Bits.ts +398 -0
- package/src/internal/Bytes.test.ts +369 -0
- package/src/internal/Bytes.ts +343 -0
- package/src/internal/Flat.test.ts +29 -0
- package/src/internal/Flat.ts +387 -0
- package/src/internal/Float.test.ts +51 -0
- package/src/internal/Float.ts +190 -0
- package/src/internal/Utf8.test.ts +69 -0
- package/src/internal/Utf8.ts +58 -0
- package/tsconfig.build.json +14 -0
- package/tsconfig.json +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Base32.js","sourceRoot":"","sources":["../../src/internal/Base32.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Either } from "effect";
|
|
2
|
+
import { DecodeException } from "./Bytes.js";
|
|
3
|
+
/**
|
|
4
|
+
* Converts a list of big endian uint8 numbers into an unbounded int
|
|
5
|
+
* @param bytes
|
|
6
|
+
* @returns
|
|
7
|
+
* @throws
|
|
8
|
+
* If `bytes` is empty
|
|
9
|
+
* @throws
|
|
10
|
+
* If any input number is out of range [0,256) or not a whole number
|
|
11
|
+
*/
|
|
12
|
+
export function decode(bytes) {
|
|
13
|
+
if (bytes.length == 0) {
|
|
14
|
+
return Either.left(DecodeException(bytes, "Empty bytes"));
|
|
15
|
+
}
|
|
16
|
+
let p = 1n;
|
|
17
|
+
let total = 0n;
|
|
18
|
+
for (let i = bytes.length - 1; i >= 0; i--) {
|
|
19
|
+
const b = bytes[i];
|
|
20
|
+
if (b < 0 || b > 255 || b % 1.0 != 0.0) {
|
|
21
|
+
return Either.left(DecodeException(bytes, `Invalide bytes '${b}' at position ${i}`));
|
|
22
|
+
}
|
|
23
|
+
total += BigInt(b) * p;
|
|
24
|
+
p *= 256n;
|
|
25
|
+
}
|
|
26
|
+
return Either.right(total);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Converts an unbounded integer into a list of big endian uint8 numbers.
|
|
30
|
+
* @param x
|
|
31
|
+
* @returns
|
|
32
|
+
* @throws
|
|
33
|
+
* If `x` isn't a whole number
|
|
34
|
+
* @throws
|
|
35
|
+
* If `x` is negative.
|
|
36
|
+
*/
|
|
37
|
+
export function encode(x) {
|
|
38
|
+
if (typeof x == "number") {
|
|
39
|
+
return encode(BigInt(x));
|
|
40
|
+
}
|
|
41
|
+
else if (x < 0n) {
|
|
42
|
+
throw new RangeError(`Unexpected negative number: ${x}`);
|
|
43
|
+
}
|
|
44
|
+
else if (x == 0n) {
|
|
45
|
+
return [0];
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const res = [];
|
|
49
|
+
while (x > 0n) {
|
|
50
|
+
res.unshift(Number(x % 256n));
|
|
51
|
+
x = x / 256n;
|
|
52
|
+
}
|
|
53
|
+
return res;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=BigEndian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigEndian.js","sourceRoot":"","sources":["../../src/internal/BigEndian.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE5C;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CACpB,KAA4B;IAE5B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAA;IACV,IAAI,KAAK,GAAG,EAAE,CAAA;IAEd,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAElB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YACvC,OAAO,MAAM,CAAC,IAAI,CAChB,eAAe,CAAC,KAAK,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,EAAE,CAAC,CACjE,CAAA;QACH,CAAC;QAED,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QAEtB,CAAC,IAAI,IAAI,CAAA;IACX,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,CAAkB;IACvC,IAAI,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;SAAM,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAA;IAC1D,CAAC;SAAM,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,CAAC,CAAC,CAAC,CAAA;IACZ,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAa,EAAE,CAAA;QAExB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;YACd,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;YAE7B,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;QACd,CAAC;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { Either } from "effect";
|
|
2
|
+
import * as Bytes from "./Bytes.js";
|
|
3
|
+
/**
|
|
4
|
+
* @param bytes
|
|
5
|
+
* @param truncate defaults to true
|
|
6
|
+
* @returns {BitReader}
|
|
7
|
+
*/
|
|
8
|
+
export function makeReader(bytes, truncate = true) {
|
|
9
|
+
return new ReaderImpl(bytes, truncate ?? true);
|
|
10
|
+
}
|
|
11
|
+
class ReaderImpl {
|
|
12
|
+
view;
|
|
13
|
+
/**
|
|
14
|
+
* bit position, not byte position
|
|
15
|
+
*/
|
|
16
|
+
pos;
|
|
17
|
+
/**
|
|
18
|
+
* If true then read last bits as low part of number, if false pad with zero bits (only applies when trying to read more bits than there are left )
|
|
19
|
+
*/
|
|
20
|
+
truncate;
|
|
21
|
+
/**
|
|
22
|
+
* @param bytes
|
|
23
|
+
* @param truncate determines behavior when reading too many bits
|
|
24
|
+
*/
|
|
25
|
+
constructor(bytes, truncate = true) {
|
|
26
|
+
this.view = Bytes.toUint8Array(bytes);
|
|
27
|
+
this.pos = 0;
|
|
28
|
+
this.truncate = truncate;
|
|
29
|
+
}
|
|
30
|
+
isAtEnd() {
|
|
31
|
+
return Math.trunc(this.pos / 8) >= this.view.length;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Moves position to next byte boundary
|
|
35
|
+
* @param force
|
|
36
|
+
* If true then move to next byte boundary if already at byte boundary
|
|
37
|
+
*/
|
|
38
|
+
moveToByteBoundary(force = false) {
|
|
39
|
+
if (this.pos % 8 != 0) {
|
|
40
|
+
const n = 8 - (this.pos % 8);
|
|
41
|
+
void this.readBits(n);
|
|
42
|
+
}
|
|
43
|
+
else if (force) {
|
|
44
|
+
this.readBits(8);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Reads a number of bits (<= 8) and returns the result as an unsigned number
|
|
49
|
+
* @param n number of bits to read
|
|
50
|
+
* @returns
|
|
51
|
+
* @throws
|
|
52
|
+
* If at end
|
|
53
|
+
* @throws
|
|
54
|
+
* If n is larger than 8
|
|
55
|
+
*/
|
|
56
|
+
readBits(n) {
|
|
57
|
+
if (n > 8) {
|
|
58
|
+
throw new RangeError(`Reading more than 1 byte (trying to read ${n} bits)`);
|
|
59
|
+
}
|
|
60
|
+
let leftShift = 0;
|
|
61
|
+
if (this.pos + n > this.view.length * 8) {
|
|
62
|
+
const newN = this.view.length * 8 - this.pos;
|
|
63
|
+
if (!this.truncate) {
|
|
64
|
+
leftShift = n - newN;
|
|
65
|
+
}
|
|
66
|
+
n = newN;
|
|
67
|
+
}
|
|
68
|
+
if (n == 0) {
|
|
69
|
+
throw new Error("Bits.Reader is at end");
|
|
70
|
+
}
|
|
71
|
+
// it is assumed we don't need to be at the byte boundary
|
|
72
|
+
let res = 0;
|
|
73
|
+
let i0 = this.pos;
|
|
74
|
+
for (let i = this.pos + 1; i <= this.pos + n; i++) {
|
|
75
|
+
if (i % 8 == 0) {
|
|
76
|
+
const nPart = i - i0;
|
|
77
|
+
res += mask(this.view[Math.trunc(i / 8) - 1], i0 % 8, 8) << (n - nPart);
|
|
78
|
+
i0 = i;
|
|
79
|
+
}
|
|
80
|
+
else if (i == this.pos + n) {
|
|
81
|
+
res += mask(this.view[Math.trunc(i / 8)], i0 % 8, i % 8);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
this.pos += n;
|
|
85
|
+
return res << leftShift;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Reads 8 bits
|
|
89
|
+
* @returns
|
|
90
|
+
*/
|
|
91
|
+
readByte() {
|
|
92
|
+
return this.readBits(8);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* @returns
|
|
97
|
+
* Writer instance
|
|
98
|
+
*/
|
|
99
|
+
export function makeWriter() {
|
|
100
|
+
return new WriterImpl();
|
|
101
|
+
}
|
|
102
|
+
class WriterImpl {
|
|
103
|
+
/**
|
|
104
|
+
* Concatenated and padded upon finalization
|
|
105
|
+
*/
|
|
106
|
+
parts;
|
|
107
|
+
/**
|
|
108
|
+
* Number of bits written so far
|
|
109
|
+
*/
|
|
110
|
+
n;
|
|
111
|
+
constructor() {
|
|
112
|
+
this.parts = [];
|
|
113
|
+
this.n = 0;
|
|
114
|
+
}
|
|
115
|
+
get length() {
|
|
116
|
+
return this.n;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Pads the Bits.Writer to align with the byte boundary and returns the resulting bytes.
|
|
120
|
+
* @param force force padding (will add one byte if already aligned)
|
|
121
|
+
* @returns
|
|
122
|
+
*/
|
|
123
|
+
finalize(force = true) {
|
|
124
|
+
this.padToByteBoundary(force);
|
|
125
|
+
const chars = this.parts.join("");
|
|
126
|
+
const bytes = [];
|
|
127
|
+
for (let i = 0; i < chars.length; i += 8) {
|
|
128
|
+
const byteChars = chars.slice(i, i + 8);
|
|
129
|
+
const byte = parseInt(byteChars, 2);
|
|
130
|
+
bytes.push(byte);
|
|
131
|
+
}
|
|
132
|
+
return bytes;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Add padding to the BitWriter in order to align with the byte boundary.
|
|
136
|
+
* @param force
|
|
137
|
+
* If 'force == true' then 8 bits are added if the Writer is already aligned.
|
|
138
|
+
*/
|
|
139
|
+
padToByteBoundary(force = false) {
|
|
140
|
+
let nPad = 0;
|
|
141
|
+
if (this.n % 8 != 0) {
|
|
142
|
+
nPad = 8 - (this.n % 8);
|
|
143
|
+
}
|
|
144
|
+
else if (force) {
|
|
145
|
+
nPad = 8;
|
|
146
|
+
}
|
|
147
|
+
if (nPad != 0) {
|
|
148
|
+
const padding = new Array(nPad).fill("0");
|
|
149
|
+
padding[nPad - 1] = "1";
|
|
150
|
+
this.parts.push(padding.join(""));
|
|
151
|
+
this.n += nPad;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Pop n bits of the end
|
|
156
|
+
* @param n
|
|
157
|
+
* @returns
|
|
158
|
+
*/
|
|
159
|
+
pop(n) {
|
|
160
|
+
if (n > this.n) {
|
|
161
|
+
throw new Error(`Too many bits to pop, only have ${this.n} bits, but want n=${n}`);
|
|
162
|
+
}
|
|
163
|
+
const n0 = n;
|
|
164
|
+
const parts = [];
|
|
165
|
+
while (n > 0) {
|
|
166
|
+
const last = this.parts.pop();
|
|
167
|
+
if (last !== undefined) {
|
|
168
|
+
if (last.length <= n) {
|
|
169
|
+
parts.unshift(last);
|
|
170
|
+
n -= last.length;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
parts.unshift(last.slice(last.length - n));
|
|
174
|
+
this.parts.push(last.slice(0, last.length - n));
|
|
175
|
+
n = 0;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
this.n -= n0;
|
|
180
|
+
const bits = parts.join("");
|
|
181
|
+
if (bits.length != n0) {
|
|
182
|
+
throw new Error(`Internal error: expected ${n0} bits popped, but popped ${bits.length}`);
|
|
183
|
+
}
|
|
184
|
+
return bits;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Write a string of '0's and '1's to the BitWriter.
|
|
188
|
+
* Returns the BitWriter to enable chaining
|
|
189
|
+
* @param bitChars
|
|
190
|
+
* @returns
|
|
191
|
+
* Self so these calls can be chain
|
|
192
|
+
*/
|
|
193
|
+
writeBits(bitChars) {
|
|
194
|
+
for (const c of bitChars) {
|
|
195
|
+
if (c != "0" && c != "1") {
|
|
196
|
+
throw new Error(`Bit string contains invalid chars: ${bitChars}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
this.parts.push(bitChars);
|
|
200
|
+
this.n += bitChars.length;
|
|
201
|
+
return this;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Returns the BitWriter to enable chaining
|
|
205
|
+
* @param byte
|
|
206
|
+
* @returns
|
|
207
|
+
* Self so these calls can be chain
|
|
208
|
+
*/
|
|
209
|
+
writeByte(byte) {
|
|
210
|
+
if (byte < 0 || byte > 255) {
|
|
211
|
+
throw new Error(`Invalid byte: ${byte}`);
|
|
212
|
+
}
|
|
213
|
+
this.writeBits(pad(byte.toString(2), 8));
|
|
214
|
+
return this;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Converts a 8 bit integer number into a bit string with an optional "0b" prefix.
|
|
219
|
+
* The result is padded with leading zeroes to become 'n' chars long ('2 + n' chars long if you count the "0b" prefix).
|
|
220
|
+
* @example
|
|
221
|
+
* byteToBits(7) == "0b00000111"
|
|
222
|
+
* @param {number} b
|
|
223
|
+
* @param {number} n
|
|
224
|
+
* @param {boolean} prefix
|
|
225
|
+
* @returns {string}
|
|
226
|
+
*/
|
|
227
|
+
export function fromByte(b, n = 8, prefix = true) {
|
|
228
|
+
if (b < 0 || b > 255) {
|
|
229
|
+
return Either.left(new RangeError(`Invalid byte: ${b}`));
|
|
230
|
+
}
|
|
231
|
+
const bits = b.toString(2);
|
|
232
|
+
if (n < bits.length) {
|
|
233
|
+
return Either.left(new RangeError(`n is smaller than the number of bits: ${n} < ${bits.length}`));
|
|
234
|
+
}
|
|
235
|
+
const s = pad(bits, n);
|
|
236
|
+
if (prefix) {
|
|
237
|
+
return Either.right("0b" + s);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
return Either.right(s);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* @param bytes
|
|
245
|
+
* @param i
|
|
246
|
+
* bit index
|
|
247
|
+
* @returns
|
|
248
|
+
* 0 or 1
|
|
249
|
+
*/
|
|
250
|
+
export function getBit(bytes, i) {
|
|
251
|
+
return ((bytes[Math.floor(i / 8)] >> (i % 8)) & 1);
|
|
252
|
+
}
|
|
253
|
+
const BIT_MASKS = [
|
|
254
|
+
0b11111111, 0b01111111, 0b00111111, 0b00011111, 0b00001111, 0b00000111,
|
|
255
|
+
0b00000011, 0b00000001
|
|
256
|
+
];
|
|
257
|
+
/**
|
|
258
|
+
* Masks bits of `b` by setting bits outside the range `[i0, i1)` to 0.
|
|
259
|
+
* `b` is an 8 bit integer (i.e. number between 0 and 255).
|
|
260
|
+
* The return value is also an 8 bit integer, shifted right by `i1`.
|
|
261
|
+
* @example
|
|
262
|
+
* maskBits(0b11111111, 1, 4) == 0b0111 // (i.e. 7)
|
|
263
|
+
* @param b
|
|
264
|
+
* @param i0
|
|
265
|
+
* @param i1
|
|
266
|
+
* @returns
|
|
267
|
+
*/
|
|
268
|
+
export function mask(b, i0, i1) {
|
|
269
|
+
if (i0 >= i1 || i0 < 0 || i0 > 7 || i1 > 8 || b < 0 || b > 255) {
|
|
270
|
+
throw new RangeError(`Invalid Bits.mask arguments: b=${b}, i0=${i0}, i1=${i1}`);
|
|
271
|
+
}
|
|
272
|
+
return (b & BIT_MASKS[i0]) >> (8 - i1);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Prepends zeroes to a bit-string so that 'result.length == n'.
|
|
276
|
+
* If `n < nCurrent`, pad to next multiple of `n`.
|
|
277
|
+
* @example
|
|
278
|
+
* padBits("1111", 8) == "00001111"
|
|
279
|
+
* @param bits
|
|
280
|
+
* @param n
|
|
281
|
+
* @returns
|
|
282
|
+
* @throws
|
|
283
|
+
* If n is zero or negative
|
|
284
|
+
*/
|
|
285
|
+
export function pad(bits, n) {
|
|
286
|
+
const nBits = bits.length;
|
|
287
|
+
if (nBits == n) {
|
|
288
|
+
return bits;
|
|
289
|
+
}
|
|
290
|
+
else if (n <= 0) {
|
|
291
|
+
throw new RangeError(`Expected pad length n to be > 0, got n=${n}`);
|
|
292
|
+
}
|
|
293
|
+
else if (nBits % n != 0) {
|
|
294
|
+
// padded to multiple of n
|
|
295
|
+
const nPad = n - (nBits % n);
|
|
296
|
+
bits = new Array(nPad).fill("0").join("") + bits;
|
|
297
|
+
}
|
|
298
|
+
return bits;
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=Bits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Bits.js","sourceRoot":"","sources":["../../src/internal/Bits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { Data, Effect, Encoding } from "effect";
|
|
2
|
+
import { encode as encodeIntBE } from "./BigEndian";
|
|
3
|
+
export class EndOfStreamError extends Data.TaggedError("EndOfStreamError") {
|
|
4
|
+
constructor(stream) {
|
|
5
|
+
super({ message: `Bytes.Stream is at end (pos=${stream.pos})` });
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Doesn't throw an error if any input number is outside the range [0,256)
|
|
10
|
+
* @param bytes
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
export function toArray(bytes) {
|
|
14
|
+
if (bytes instanceof Uint8Array) {
|
|
15
|
+
return Array.from(bytes);
|
|
16
|
+
}
|
|
17
|
+
else if (typeof bytes == "string") {
|
|
18
|
+
const result = Encoding.decodeHex(bytes);
|
|
19
|
+
if (result._tag == "Left") {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/only-throw-error
|
|
21
|
+
throw result.left;
|
|
22
|
+
}
|
|
23
|
+
return Array.from(result.right);
|
|
24
|
+
}
|
|
25
|
+
else if (Array.isArray(bytes)) {
|
|
26
|
+
return bytes;
|
|
27
|
+
}
|
|
28
|
+
else if ("peekRemaining" in bytes) {
|
|
29
|
+
return bytes.peekRemaining();
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
throw new Error("Expected BytesLike");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function toHex(bytes) {
|
|
36
|
+
if (bytes instanceof Uint8Array) {
|
|
37
|
+
return Encoding.encodeHex(bytes);
|
|
38
|
+
}
|
|
39
|
+
else if (typeof bytes == "string") {
|
|
40
|
+
return bytes;
|
|
41
|
+
}
|
|
42
|
+
else if (Array.isArray(bytes)) {
|
|
43
|
+
return Encoding.encodeHex(Uint8Array.from(bytes));
|
|
44
|
+
}
|
|
45
|
+
else if ("peekRemaining" in bytes) {
|
|
46
|
+
return Encoding.encodeHex(Uint8Array.from(bytes.peekRemaining()));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw new Error("Expected BytesLike");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Doesn't throw an error if any input number is outside the range [0,256)
|
|
54
|
+
* @param bytes
|
|
55
|
+
* @returns
|
|
56
|
+
*/
|
|
57
|
+
export function toUint8Array(bytes) {
|
|
58
|
+
if (bytes instanceof Uint8Array) {
|
|
59
|
+
return bytes;
|
|
60
|
+
}
|
|
61
|
+
else if (typeof bytes == "string") {
|
|
62
|
+
const result = Encoding.decodeHex(bytes);
|
|
63
|
+
if (result._tag == "Left") {
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/only-throw-error
|
|
65
|
+
throw result.left;
|
|
66
|
+
}
|
|
67
|
+
return result.right;
|
|
68
|
+
}
|
|
69
|
+
else if (Array.isArray(bytes)) {
|
|
70
|
+
return Uint8Array.from(bytes);
|
|
71
|
+
}
|
|
72
|
+
else if ("peekRemaining" in bytes) {
|
|
73
|
+
return bytes.bytes.slice(bytes.pos);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw new Error(`Expected BytesLike`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* @param arg
|
|
81
|
+
* @returns
|
|
82
|
+
*/
|
|
83
|
+
export function makeStream(arg) {
|
|
84
|
+
if (arg instanceof StreamImpl) {
|
|
85
|
+
// most common case
|
|
86
|
+
return arg;
|
|
87
|
+
}
|
|
88
|
+
else if (typeof arg == "string" || Array.isArray(arg)) {
|
|
89
|
+
return new StreamImpl(toUint8Array(arg));
|
|
90
|
+
}
|
|
91
|
+
else if ("pos" in arg && "bytes" in arg) {
|
|
92
|
+
return arg;
|
|
93
|
+
}
|
|
94
|
+
else if (arg instanceof Uint8Array) {
|
|
95
|
+
return new StreamImpl(arg);
|
|
96
|
+
}
|
|
97
|
+
return makeStream(arg.bytes);
|
|
98
|
+
}
|
|
99
|
+
class StreamImpl {
|
|
100
|
+
bytes;
|
|
101
|
+
pos;
|
|
102
|
+
/**
|
|
103
|
+
* @param bytes
|
|
104
|
+
* @param pos
|
|
105
|
+
*/
|
|
106
|
+
constructor(bytes, pos = 0) {
|
|
107
|
+
this.bytes = bytes;
|
|
108
|
+
this.pos = pos;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Copy ByteStream so mutations doesn't change original ByteStream
|
|
112
|
+
* @returns
|
|
113
|
+
*/
|
|
114
|
+
copy() {
|
|
115
|
+
return new StreamImpl(this.bytes, this.pos);
|
|
116
|
+
}
|
|
117
|
+
isAtEnd() {
|
|
118
|
+
return this.pos >= this.bytes.length;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* @returns
|
|
122
|
+
* The byte at the current position
|
|
123
|
+
*/
|
|
124
|
+
peekOne() {
|
|
125
|
+
if (this.pos < this.bytes.length) {
|
|
126
|
+
return Effect.succeed(this.bytes[this.pos]);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
return Effect.fail(new EndOfStreamError(this));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* @param n
|
|
134
|
+
* @returns
|
|
135
|
+
* @throws
|
|
136
|
+
* If n is negative
|
|
137
|
+
*/
|
|
138
|
+
peekMany(n) {
|
|
139
|
+
if (n < 0) {
|
|
140
|
+
throw new RangeError(`Unexpected negative n: ${n}`);
|
|
141
|
+
}
|
|
142
|
+
if (this.pos + n <= this.bytes.length) {
|
|
143
|
+
return Effect.succeed(Array.from(this.bytes.slice(this.pos, this.pos + n)));
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
return Effect.fail(new EndOfStreamError(this));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
peekRemaining() {
|
|
150
|
+
return Array.from(this.bytes.slice(this.pos));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @returns
|
|
154
|
+
* @throws
|
|
155
|
+
* If at end
|
|
156
|
+
*/
|
|
157
|
+
shiftOne() {
|
|
158
|
+
if (this.pos < this.bytes.length) {
|
|
159
|
+
const b = this.bytes[this.pos];
|
|
160
|
+
this.pos += 1;
|
|
161
|
+
return Effect.succeed(b);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
return Effect.fail(new EndOfStreamError(this));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* @param n
|
|
169
|
+
* @returns {number[]}
|
|
170
|
+
* @throws
|
|
171
|
+
* If n is negative
|
|
172
|
+
*/
|
|
173
|
+
shiftMany(n) {
|
|
174
|
+
if (n < 0) {
|
|
175
|
+
throw new RangeError(`Unexpected negative n: ${n}`);
|
|
176
|
+
}
|
|
177
|
+
if (this.pos + n <= this.bytes.length) {
|
|
178
|
+
const res = Array.from(this.bytes.slice(this.pos, this.pos + n));
|
|
179
|
+
this.pos += n;
|
|
180
|
+
return Effect.succeed(res);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
return Effect.fail(new EndOfStreamError(this));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
shiftRemaining() {
|
|
187
|
+
const res = Array.from(this.bytes.slice(this.pos));
|
|
188
|
+
this.pos = this.bytes.length;
|
|
189
|
+
return res;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* @param a
|
|
194
|
+
* @param b
|
|
195
|
+
* @param shortestFirst defaults to false (strictly lexicographic comparison)
|
|
196
|
+
* @returns
|
|
197
|
+
* -1 if a < b, 0 if a == b, 1 if a > b
|
|
198
|
+
*/
|
|
199
|
+
export function compare(a, b, shortestFirst = false) {
|
|
200
|
+
const la = toArray(a);
|
|
201
|
+
const lb = toArray(b);
|
|
202
|
+
const na = la.length;
|
|
203
|
+
const nb = lb.length;
|
|
204
|
+
if (shortestFirst && na != nb) {
|
|
205
|
+
return na < nb ? -1 : 1;
|
|
206
|
+
}
|
|
207
|
+
for (let i = 0; i < Math.min(na, nb); i++) {
|
|
208
|
+
if (la[i] < lb[i]) {
|
|
209
|
+
return -1;
|
|
210
|
+
}
|
|
211
|
+
else if (la[i] > lb[i]) {
|
|
212
|
+
return 1;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (na != nb) {
|
|
216
|
+
return na < nb ? -1 : 1;
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
return 0;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Used to create dummy hashes for testing
|
|
224
|
+
* @param n
|
|
225
|
+
* @param seed
|
|
226
|
+
* @returns
|
|
227
|
+
*/
|
|
228
|
+
export function dummy(n, seed = 0) {
|
|
229
|
+
return pad(encodeIntBE(seed), n).slice(0, n);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* @param a
|
|
233
|
+
* @param b
|
|
234
|
+
* @returns
|
|
235
|
+
*/
|
|
236
|
+
export function equals(a, b) {
|
|
237
|
+
return compare(a, b) == 0;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Pad by appending zeroes.
|
|
241
|
+
* If `n < nCurrent`, pad to next multiple of `n`.
|
|
242
|
+
* @param bytes
|
|
243
|
+
* @param n pad length
|
|
244
|
+
* @returns
|
|
245
|
+
* @throws
|
|
246
|
+
* If pad length is zero or negative
|
|
247
|
+
*/
|
|
248
|
+
export function pad(bytes, n) {
|
|
249
|
+
const nBytes = bytes.length;
|
|
250
|
+
if (nBytes == n) {
|
|
251
|
+
return bytes;
|
|
252
|
+
}
|
|
253
|
+
else if (n <= 0) {
|
|
254
|
+
throw new Error(`Invalid pad length (must be > 0, got ${n})`);
|
|
255
|
+
}
|
|
256
|
+
else if (nBytes % n != 0 || nBytes == 0) {
|
|
257
|
+
// padded to multiple of n
|
|
258
|
+
const nPad = n - (nBytes % n);
|
|
259
|
+
bytes = bytes.concat(new Array(nPad).fill(0));
|
|
260
|
+
}
|
|
261
|
+
return bytes;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Pad by prepending zeroes.
|
|
265
|
+
* Throws an error
|
|
266
|
+
* @param bytes
|
|
267
|
+
* @param n prepad length
|
|
268
|
+
* @returns
|
|
269
|
+
* @throws
|
|
270
|
+
* If prepad length is zero or negative
|
|
271
|
+
* @throws
|
|
272
|
+
* if bytes.length > n
|
|
273
|
+
*/
|
|
274
|
+
export function prepad(bytes, n) {
|
|
275
|
+
const nBytes = bytes.length;
|
|
276
|
+
if (nBytes == n) {
|
|
277
|
+
return bytes;
|
|
278
|
+
}
|
|
279
|
+
else if (n <= 0) {
|
|
280
|
+
throw new Error(`Invalid prepad length (must be > 0, got ${n})`);
|
|
281
|
+
}
|
|
282
|
+
else if (nBytes > n) {
|
|
283
|
+
throw new Error(`Padding goal length smaller than bytes length (${n} < ${nBytes})`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
const nPad = n - nBytes;
|
|
287
|
+
return new Array(nPad).fill(0).concat(bytes);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
export function DecodeException(bytes, message) {
|
|
291
|
+
return Encoding.DecodeException(toHex(bytes), message);
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=Bytes.js.map
|