@nnilky/structo 1.0.0 → 1.0.1
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/package.json +31 -7
- package/structo/datatypes/containers/__snapshots__/list.test.ts.snap +0 -25
- package/structo/datatypes/containers/__snapshots__/object.test.ts.snap +0 -37
- package/structo/datatypes/containers/array.test.ts +0 -28
- package/structo/datatypes/containers/array.ts +0 -24
- package/structo/datatypes/containers/fastObject.ts +0 -66
- package/structo/datatypes/containers/list.test.ts +0 -44
- package/structo/datatypes/containers/list.ts +0 -29
- package/structo/datatypes/containers/object.test.ts +0 -42
- package/structo/datatypes/containers/object.ts +0 -40
- package/structo/datatypes/containers/sizedbuffer.test.ts +0 -34
- package/structo/datatypes/containers/sizedbuffer.ts +0 -20
- package/structo/datatypes/index.ts +0 -18
- package/structo/datatypes/lazy.ts +0 -0
- package/structo/datatypes/numbers/__snapshots__/bigints.test.ts.snap +0 -261
- package/structo/datatypes/numbers/__snapshots__/floats.test.ts.snap +0 -191
- package/structo/datatypes/numbers/__snapshots__/sints.test.ts.snap +0 -321
- package/structo/datatypes/numbers/__snapshots__/uints.test.ts.snap +0 -321
- package/structo/datatypes/numbers/bigints.test.ts +0 -85
- package/structo/datatypes/numbers/bigints.ts +0 -48
- package/structo/datatypes/numbers/floats.test.ts +0 -91
- package/structo/datatypes/numbers/floats.ts +0 -33
- package/structo/datatypes/numbers/sints.test.ts +0 -109
- package/structo/datatypes/numbers/sints.ts +0 -83
- package/structo/datatypes/numbers/uints.test.ts +0 -110
- package/structo/datatypes/numbers/uints.ts +0 -82
- package/structo/datatypes/transforms/pipe.test.ts +0 -17
- package/structo/datatypes/transforms/pipe.ts +0 -88
- package/structo/datatypes/transforms/readOffset.ts +0 -20
- package/structo/datatypes/transforms/transform.ts +0 -15
- package/structo/datatypes/utils.test.ts +0 -39
- package/structo/datatypes/values/buffer.test.ts +0 -52
- package/structo/datatypes/values/buffer.ts +0 -20
- package/structo/datatypes/values/byteliteral.ts +0 -24
- package/structo/datatypes/values/string.test.ts +0 -22
- package/structo/datatypes/values/string.ts +0 -28
- package/structo/index.ts +0 -11
- package/structo/read.ts +0 -14
- package/structo/types.ts +0 -21
- package/structo/utils.test.ts +0 -0
- package/structo/write.ts +0 -43
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
//@ts-ignore TODO
|
|
2
|
-
import type { Serializer } from "../../types";
|
|
3
|
-
|
|
4
|
-
const checkValue = (value: number | bigint, start: bigint, end: bigint) => {
|
|
5
|
-
if (value < start || value >= end) {
|
|
6
|
-
throw new Error("Out of Range");
|
|
7
|
-
}
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export function u64Bigint(
|
|
11
|
-
endian: "little" | "big" = "little",
|
|
12
|
-
): Serializer<number | bigint, bigint> {
|
|
13
|
-
return {
|
|
14
|
-
size: 8,
|
|
15
|
-
write: (ctx, value) => {
|
|
16
|
-
checkValue(value, 0n, 2n ** 64n);
|
|
17
|
-
|
|
18
|
-
ctx.alloc(8);
|
|
19
|
-
ctx.view.setBigUint64(ctx.offset, BigInt(value), endian === "little");
|
|
20
|
-
ctx.offset += 8;
|
|
21
|
-
},
|
|
22
|
-
read: (ctx) => {
|
|
23
|
-
const value = ctx.view.getBigUint64(ctx.offset, endian === "little");
|
|
24
|
-
ctx.offset += 8;
|
|
25
|
-
return value;
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function s64Bigint(
|
|
31
|
-
endian: "little" | "big" = "little",
|
|
32
|
-
): Serializer<number | bigint, bigint> {
|
|
33
|
-
return {
|
|
34
|
-
size: 8,
|
|
35
|
-
write: (ctx, value) => {
|
|
36
|
-
checkValue(value, -(2n ** 63n), 2n ** 63n);
|
|
37
|
-
|
|
38
|
-
ctx.alloc(8);
|
|
39
|
-
ctx.view.setBigInt64(ctx.offset, BigInt(value), endian === "little");
|
|
40
|
-
ctx.offset += 8;
|
|
41
|
-
},
|
|
42
|
-
read: (ctx) => {
|
|
43
|
-
const value = ctx.view.getBigInt64(ctx.offset, endian === "little");
|
|
44
|
-
ctx.offset += 8;
|
|
45
|
-
return value;
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
//@ts-ignore TODO
|
|
2
|
-
import { describe, it, expect } from "bun:test";
|
|
3
|
-
import { expectEncode, expectEncodeSnapshot, expectError, randint } from "../utils.test";
|
|
4
|
-
|
|
5
|
-
import * as st from "../../index";
|
|
6
|
-
|
|
7
|
-
function test_sint(options: {
|
|
8
|
-
name: string;
|
|
9
|
-
serializer: st.Serializer<number>;
|
|
10
|
-
range: [number, number];
|
|
11
|
-
size: number;
|
|
12
|
-
}) {
|
|
13
|
-
const {
|
|
14
|
-
name,
|
|
15
|
-
range: [start, end],
|
|
16
|
-
serializer,
|
|
17
|
-
size,
|
|
18
|
-
} = options;
|
|
19
|
-
|
|
20
|
-
describe(name, () => {
|
|
21
|
-
it(`works in bounds`, () => {
|
|
22
|
-
expectEncode(serializer, start);
|
|
23
|
-
for (let i = 0; i < 100; i++) {
|
|
24
|
-
expectEncode(serializer, randint(start, end));
|
|
25
|
-
}
|
|
26
|
-
expectEncode(serializer, end);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it(`errors outside bounds`, () => {
|
|
30
|
-
expectError(() => st.write(serializer, start - 1));
|
|
31
|
-
expectError(() => st.write(serializer, end + 1));
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it(`errors on decimal`, () => {
|
|
35
|
-
expectError(() => st.write(serializer, 0.1));
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it(`is right size`, () => {
|
|
39
|
-
const expectValueSize = (value: number) => {
|
|
40
|
-
const data = st.write(serializer, value);
|
|
41
|
-
expect(data.byteLength).toBe(size);
|
|
42
|
-
};
|
|
43
|
-
for (let i = 0; i < 100; i++) {
|
|
44
|
-
expectValueSize(randint(start, end));
|
|
45
|
-
}
|
|
46
|
-
expectValueSize(start);
|
|
47
|
-
expectValueSize(end);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it(`matches snapshots`, () => {
|
|
51
|
-
expectEncodeSnapshot(serializer, 0);
|
|
52
|
-
expectEncodeSnapshot(serializer, start);
|
|
53
|
-
expectEncodeSnapshot(serializer, start + 10);
|
|
54
|
-
expectEncodeSnapshot(serializer, end - 10);
|
|
55
|
-
expectEncodeSnapshot(serializer, end);
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
test_sint({
|
|
61
|
-
name: "st.s8",
|
|
62
|
-
serializer: st.s8(),
|
|
63
|
-
range: [-128, 127],
|
|
64
|
-
size: 1,
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
test_sint({
|
|
68
|
-
name: "st.s16(little)",
|
|
69
|
-
serializer: st.s16("little"),
|
|
70
|
-
range: [-32_768, 32_767],
|
|
71
|
-
size: 2,
|
|
72
|
-
});
|
|
73
|
-
test_sint({
|
|
74
|
-
name: "st.s16(big)",
|
|
75
|
-
serializer: st.s16("big"),
|
|
76
|
-
range: [-32_768, 32_767],
|
|
77
|
-
size: 2,
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test_sint({
|
|
81
|
-
name: "st.s32(little)",
|
|
82
|
-
serializer: st.s32("little"),
|
|
83
|
-
range: [-2_147_483_648, 2_147_483_647],
|
|
84
|
-
size: 4,
|
|
85
|
-
});
|
|
86
|
-
test_sint({
|
|
87
|
-
name: "st.s32(big)",
|
|
88
|
-
serializer: st.s32("big"),
|
|
89
|
-
range: [-2_147_483_648, 2_147_483_647],
|
|
90
|
-
size: 4,
|
|
91
|
-
});
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import type { Serializer } from "../../types";
|
|
2
|
-
|
|
3
|
-
export function f32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
4
|
-
return {
|
|
5
|
-
size: 4,
|
|
6
|
-
write: (ctx, value) => {
|
|
7
|
-
ctx.alloc(4);
|
|
8
|
-
ctx.view.setFloat32(ctx.offset, value, endian === "little");
|
|
9
|
-
ctx.offset += 4;
|
|
10
|
-
},
|
|
11
|
-
read: (ctx) => {
|
|
12
|
-
const value = ctx.view.getFloat32(ctx.offset, endian === "little");
|
|
13
|
-
ctx.offset += 4;
|
|
14
|
-
return value;
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function f64(endian: "little" | "big" = "little"): Serializer<number> {
|
|
20
|
-
return {
|
|
21
|
-
size: 8,
|
|
22
|
-
write: (ctx, value) => {
|
|
23
|
-
ctx.alloc(8);
|
|
24
|
-
ctx.view.setFloat64(ctx.offset, value, endian === "little");
|
|
25
|
-
ctx.offset += 8;
|
|
26
|
-
},
|
|
27
|
-
read: (ctx) => {
|
|
28
|
-
const value = ctx.view.getFloat64(ctx.offset, endian === "little");
|
|
29
|
-
ctx.offset += 8;
|
|
30
|
-
return value;
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
//@ts-ignore TODO
|
|
2
|
-
import { describe, it, expect } from "bun:test";
|
|
3
|
-
import { expectEncode, expectEncodeSnapshot, expectError, randint } from "../utils.test";
|
|
4
|
-
|
|
5
|
-
import * as st from "../../index";
|
|
6
|
-
|
|
7
|
-
function test_sint(options: {
|
|
8
|
-
name: string;
|
|
9
|
-
serializer: st.Serializer<number>;
|
|
10
|
-
range: [number, number];
|
|
11
|
-
size: number;
|
|
12
|
-
disableRangeCheck?: boolean;
|
|
13
|
-
}) {
|
|
14
|
-
const {
|
|
15
|
-
name,
|
|
16
|
-
range: [start, end],
|
|
17
|
-
serializer,
|
|
18
|
-
size,
|
|
19
|
-
disableRangeCheck,
|
|
20
|
-
} = options;
|
|
21
|
-
|
|
22
|
-
describe(name, () => {
|
|
23
|
-
it(`works in bounds`, () => {
|
|
24
|
-
expectEncode(serializer, start);
|
|
25
|
-
for (let i = 0; i < 100; i++) {
|
|
26
|
-
expectEncode(serializer, randint(start, end));
|
|
27
|
-
}
|
|
28
|
-
expectEncode(serializer, end);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
if (!disableRangeCheck) {
|
|
32
|
-
it(`errors outside bounds`, () => {
|
|
33
|
-
expectError(() => st.write(serializer, start - 1));
|
|
34
|
-
expectError(() => st.write(serializer, end + 1));
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
it(`errors on decimal`, () => {
|
|
39
|
-
expectError(() => st.write(serializer, 0.1));
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it(`is right size`, () => {
|
|
43
|
-
const expectValueSize = (value: number) => {
|
|
44
|
-
const data = st.write(serializer, value);
|
|
45
|
-
expect(data.byteLength).toBe(size);
|
|
46
|
-
};
|
|
47
|
-
for (let i = 0; i < 100; i++) {
|
|
48
|
-
expectValueSize(randint(start, end));
|
|
49
|
-
}
|
|
50
|
-
expectValueSize(start);
|
|
51
|
-
expectValueSize(end);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it(`matches snapshots`, () => {
|
|
55
|
-
expectEncodeSnapshot(serializer, 0);
|
|
56
|
-
expectEncodeSnapshot(serializer, start);
|
|
57
|
-
expectEncodeSnapshot(serializer, start + 10);
|
|
58
|
-
expectEncodeSnapshot(serializer, end - 10);
|
|
59
|
-
expectEncodeSnapshot(serializer, end);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
test_sint({
|
|
65
|
-
name: "st.s8",
|
|
66
|
-
serializer: st.s8(),
|
|
67
|
-
range: [-128, 127],
|
|
68
|
-
size: 1,
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test_sint({
|
|
72
|
-
name: "st.s16(little)",
|
|
73
|
-
serializer: st.s16("little"),
|
|
74
|
-
range: [-32_768, 32_767],
|
|
75
|
-
size: 2,
|
|
76
|
-
});
|
|
77
|
-
test_sint({
|
|
78
|
-
name: "st.s16(big)",
|
|
79
|
-
serializer: st.s16("big"),
|
|
80
|
-
range: [-32_768, 32_767],
|
|
81
|
-
size: 2,
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
test_sint({
|
|
85
|
-
name: "st.s32(little)",
|
|
86
|
-
serializer: st.s32("little"),
|
|
87
|
-
range: [-2_147_483_648, 2_147_483_647],
|
|
88
|
-
size: 4,
|
|
89
|
-
});
|
|
90
|
-
test_sint({
|
|
91
|
-
name: "st.s32(big)",
|
|
92
|
-
serializer: st.s32("big"),
|
|
93
|
-
range: [-2_147_483_648, 2_147_483_647],
|
|
94
|
-
size: 4,
|
|
95
|
-
});
|
|
96
|
-
test_sint({
|
|
97
|
-
name: "st.s64(little)",
|
|
98
|
-
serializer: st.s64("little"),
|
|
99
|
-
range: [-(2 ** 62), 2 ** 62],
|
|
100
|
-
size: 8,
|
|
101
|
-
disableRangeCheck: true,
|
|
102
|
-
});
|
|
103
|
-
test_sint({
|
|
104
|
-
name: "st.s64(big)",
|
|
105
|
-
serializer: st.s64("big"),
|
|
106
|
-
range: [-(2 ** 62), 2 ** 62],
|
|
107
|
-
size: 8,
|
|
108
|
-
disableRangeCheck: true,
|
|
109
|
-
});
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import type { Serializer } from "../../types";
|
|
2
|
-
|
|
3
|
-
const checkValue = (value: number, start: number, end: number) => {
|
|
4
|
-
if (!Number.isInteger(value)) {
|
|
5
|
-
throw new Error("Not Integer");
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
if (value < start || value >= end) {
|
|
9
|
-
throw new Error("Out of Range");
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
export function s8(): Serializer<number> {
|
|
14
|
-
return {
|
|
15
|
-
size: 1,
|
|
16
|
-
write: (ctx, value) => {
|
|
17
|
-
checkValue(value, -(2 ** 7), 2 ** 7);
|
|
18
|
-
|
|
19
|
-
ctx.alloc(1);
|
|
20
|
-
ctx.view.setInt8(ctx.offset, value);
|
|
21
|
-
ctx.offset += 1;
|
|
22
|
-
},
|
|
23
|
-
read: (ctx) => {
|
|
24
|
-
const value = ctx.view.getInt8(ctx.offset);
|
|
25
|
-
ctx.offset += 1;
|
|
26
|
-
return value;
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function s16(endian: "little" | "big" = "little"): Serializer<number> {
|
|
32
|
-
return {
|
|
33
|
-
size: 2,
|
|
34
|
-
write: (ctx, value) => {
|
|
35
|
-
checkValue(value, -(2 ** 15), 2 ** 15);
|
|
36
|
-
|
|
37
|
-
ctx.alloc(2);
|
|
38
|
-
ctx.view.setInt16(ctx.offset, value, endian === "little");
|
|
39
|
-
ctx.offset += 2;
|
|
40
|
-
},
|
|
41
|
-
read: (ctx) => {
|
|
42
|
-
const value = ctx.view.getInt16(ctx.offset, endian === "little");
|
|
43
|
-
ctx.offset += 2;
|
|
44
|
-
return value;
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export function s32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
50
|
-
return {
|
|
51
|
-
size: 4,
|
|
52
|
-
write: (ctx, value) => {
|
|
53
|
-
checkValue(value, -(2 ** 31), 2 ** 31);
|
|
54
|
-
|
|
55
|
-
ctx.alloc(4);
|
|
56
|
-
ctx.view.setInt32(ctx.offset, value, endian === "little");
|
|
57
|
-
ctx.offset += 4;
|
|
58
|
-
},
|
|
59
|
-
read: (ctx) => {
|
|
60
|
-
const value = ctx.view.getInt32(ctx.offset, endian === "little");
|
|
61
|
-
ctx.offset += 4;
|
|
62
|
-
return value;
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export function s64(endian: "little" | "big" = "little"): Serializer<number> {
|
|
68
|
-
return {
|
|
69
|
-
size: 8,
|
|
70
|
-
write: (ctx, value) => {
|
|
71
|
-
checkValue(value, -(2 ** 63), 2 ** 63);
|
|
72
|
-
|
|
73
|
-
ctx.alloc(8);
|
|
74
|
-
ctx.view.setBigInt64(ctx.offset, BigInt(value), endian === "little");
|
|
75
|
-
ctx.offset += 8;
|
|
76
|
-
},
|
|
77
|
-
read: (ctx) => {
|
|
78
|
-
const value = Number(ctx.view.getBigInt64(ctx.offset, endian === "little"));
|
|
79
|
-
ctx.offset += 8;
|
|
80
|
-
return value;
|
|
81
|
-
},
|
|
82
|
-
};
|
|
83
|
-
}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
//@ts-ignore TODO
|
|
2
|
-
import { describe, it, expect } from "bun:test";
|
|
3
|
-
import { expectEncode, expectEncodeSnapshot, expectError, randint } from "../utils.test";
|
|
4
|
-
|
|
5
|
-
import * as st from "../../index";
|
|
6
|
-
|
|
7
|
-
function test_uint(options: {
|
|
8
|
-
name: string;
|
|
9
|
-
serializer: st.Serializer<number>;
|
|
10
|
-
range: [number, number];
|
|
11
|
-
size: number;
|
|
12
|
-
disableMaxCheck?: boolean;
|
|
13
|
-
}) {
|
|
14
|
-
const {
|
|
15
|
-
name,
|
|
16
|
-
range: [start, end],
|
|
17
|
-
serializer,
|
|
18
|
-
size,
|
|
19
|
-
disableMaxCheck,
|
|
20
|
-
} = options;
|
|
21
|
-
|
|
22
|
-
describe(name, () => {
|
|
23
|
-
it(`works in bounds`, () => {
|
|
24
|
-
expectEncode(serializer, start);
|
|
25
|
-
for (let i = 0; i < 100; i++) {
|
|
26
|
-
expectEncode(serializer, randint(start, end));
|
|
27
|
-
}
|
|
28
|
-
expectEncode(serializer, end);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it(`errors outside bounds`, () => {
|
|
32
|
-
expectError(() => st.write(serializer, start - 1));
|
|
33
|
-
if (!disableMaxCheck) {
|
|
34
|
-
expectError(() => st.write(serializer, end + 1));
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it(`errors on decimal`, () => {
|
|
39
|
-
expectError(() => st.write(serializer, 0.1));
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
it(`is right size`, () => {
|
|
43
|
-
const expectValueSize = (value: number) => {
|
|
44
|
-
const data = st.write(serializer, value);
|
|
45
|
-
expect(data.byteLength).toBe(size);
|
|
46
|
-
};
|
|
47
|
-
for (let i = 0; i < 100; i++) {
|
|
48
|
-
expectValueSize(randint(start, end));
|
|
49
|
-
}
|
|
50
|
-
expectValueSize(start);
|
|
51
|
-
expectValueSize(end);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it(`matches snapshots`, () => {
|
|
55
|
-
expectEncodeSnapshot(serializer, 0);
|
|
56
|
-
expectEncodeSnapshot(serializer, start);
|
|
57
|
-
expectEncodeSnapshot(serializer, start + 10);
|
|
58
|
-
expectEncodeSnapshot(serializer, end - 10);
|
|
59
|
-
expectEncodeSnapshot(serializer, end);
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
test_uint({
|
|
65
|
-
name: "st.u8",
|
|
66
|
-
serializer: st.u8(),
|
|
67
|
-
range: [0, 255],
|
|
68
|
-
size: 1,
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test_uint({
|
|
72
|
-
name: "st.u16(little)",
|
|
73
|
-
serializer: st.u16("little"),
|
|
74
|
-
range: [0, 65_535],
|
|
75
|
-
size: 2,
|
|
76
|
-
});
|
|
77
|
-
test_uint({
|
|
78
|
-
name: "st.u16(big)",
|
|
79
|
-
serializer: st.u16("big"),
|
|
80
|
-
range: [0, 65_535],
|
|
81
|
-
size: 2,
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
test_uint({
|
|
85
|
-
name: "st.u32(little)",
|
|
86
|
-
serializer: st.u32("little"),
|
|
87
|
-
range: [0, 4_294_967_295],
|
|
88
|
-
size: 4,
|
|
89
|
-
});
|
|
90
|
-
test_uint({
|
|
91
|
-
name: "st.u32(big)",
|
|
92
|
-
serializer: st.u32("big"),
|
|
93
|
-
range: [0, 4_294_967_295],
|
|
94
|
-
size: 4,
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
test_uint({
|
|
98
|
-
name: "st.u64(little)",
|
|
99
|
-
serializer: st.u64("little"),
|
|
100
|
-
range: [0, 2 ** 63],
|
|
101
|
-
size: 8,
|
|
102
|
-
disableMaxCheck: true,
|
|
103
|
-
});
|
|
104
|
-
test_uint({
|
|
105
|
-
name: "st.u64(big)",
|
|
106
|
-
serializer: st.u64("big"),
|
|
107
|
-
range: [0, 2 ** 63],
|
|
108
|
-
size: 8,
|
|
109
|
-
disableMaxCheck: true,
|
|
110
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import type { Serializer } from "../../types";
|
|
2
|
-
|
|
3
|
-
const checkValue = (value: number, start: number, end: number) => {
|
|
4
|
-
if (!Number.isInteger(value)) throw new Error("Not Integer");
|
|
5
|
-
if (value < start || value >= end) throw new Error("Out of Range");
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
export function u8(): Serializer<number> {
|
|
9
|
-
return {
|
|
10
|
-
size: 1,
|
|
11
|
-
write: (ctx, value) => {
|
|
12
|
-
if (!Number.isInteger(value)) throw new Error("Not Integer");
|
|
13
|
-
if (value < 0 || value >= 2 ** 8) throw new Error("Out of Range");
|
|
14
|
-
|
|
15
|
-
ctx.alloc(1);
|
|
16
|
-
ctx.view.setUint8(ctx.offset, value);
|
|
17
|
-
ctx.offset += 1;
|
|
18
|
-
},
|
|
19
|
-
read: (ctx) => {
|
|
20
|
-
const value = ctx.view.getUint8(ctx.offset);
|
|
21
|
-
ctx.offset += 1;
|
|
22
|
-
return value;
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function u16(endian: "little" | "big" = "little"): Serializer<number> {
|
|
28
|
-
return {
|
|
29
|
-
size: 2,
|
|
30
|
-
write: (ctx, value) => {
|
|
31
|
-
if (!Number.isInteger(value)) throw new Error("Not Integer");
|
|
32
|
-
if (value < 0 || value >= 2 ** 16) throw new Error("Out of Range");
|
|
33
|
-
|
|
34
|
-
ctx.alloc(2);
|
|
35
|
-
ctx.view.setUint16(ctx.offset, value, endian === "little");
|
|
36
|
-
ctx.offset += 2;
|
|
37
|
-
},
|
|
38
|
-
read: (ctx) => {
|
|
39
|
-
const value = ctx.view.getUint16(ctx.offset, endian === "little");
|
|
40
|
-
ctx.offset += 2;
|
|
41
|
-
return value;
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function u32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
47
|
-
return {
|
|
48
|
-
size: 4,
|
|
49
|
-
write: (ctx, value) => {
|
|
50
|
-
if (!Number.isInteger(value)) throw new Error("Not Integer");
|
|
51
|
-
if (value < 0 || value >= 2 ** 32) throw new Error("Out of Range");
|
|
52
|
-
|
|
53
|
-
ctx.alloc(4);
|
|
54
|
-
ctx.view.setUint32(ctx.offset, value, endian === "little");
|
|
55
|
-
ctx.offset += 4;
|
|
56
|
-
},
|
|
57
|
-
read: (ctx) => {
|
|
58
|
-
const value = ctx.view.getUint32(ctx.offset, endian === "little");
|
|
59
|
-
ctx.offset += 4;
|
|
60
|
-
return value;
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export function u64(endian: "little" | "big" = "little"): Serializer<number> {
|
|
66
|
-
return {
|
|
67
|
-
size: 8,
|
|
68
|
-
write: (ctx, value) => {
|
|
69
|
-
if (!Number.isInteger(value)) throw new Error("Not Integer");
|
|
70
|
-
if (value < 0 || value >= 2 ** 64) throw new Error("Out of Range");
|
|
71
|
-
|
|
72
|
-
ctx.alloc(8);
|
|
73
|
-
ctx.view.setBigUint64(ctx.offset, BigInt(value), endian === "little");
|
|
74
|
-
ctx.offset += 8;
|
|
75
|
-
},
|
|
76
|
-
read: (ctx) => {
|
|
77
|
-
const value = Number(ctx.view.getBigUint64(ctx.offset, endian === "little"));
|
|
78
|
-
ctx.offset += 8;
|
|
79
|
-
return value;
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
//@ts-ignore TODO
|
|
2
|
-
import { describe, it, expect } from "bun:test";
|
|
3
|
-
import { bytes, expectEncode, expectError, randint } from "../utils.test";
|
|
4
|
-
|
|
5
|
-
import * as st from "../../index";
|
|
6
|
-
|
|
7
|
-
describe("st.pipe", () => {
|
|
8
|
-
it("applies correctly", () => {
|
|
9
|
-
const buffer = st.sizedBuffer(st.u8());
|
|
10
|
-
expectEncode(buffer, bytes([1, 2]));
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it("runs in correct order", () => {
|
|
14
|
-
const spec = st.sizedBuffer(st.u8());
|
|
15
|
-
expectEncode(spec, bytes([]));
|
|
16
|
-
});
|
|
17
|
-
});
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import type { Serializer } from "../../types";
|
|
2
|
-
|
|
3
|
-
export type Transform<T = any, TNext = T> = (type: Serializer<TNext>) => Serializer<T>;
|
|
4
|
-
|
|
5
|
-
export function pipe<TStart, T1>(
|
|
6
|
-
type: Serializer<TStart>,
|
|
7
|
-
p1: Transform<T1, TStart>,
|
|
8
|
-
): Serializer<T1>;
|
|
9
|
-
|
|
10
|
-
export function pipe<TStart, T1, T2>(
|
|
11
|
-
type: Serializer<TStart>,
|
|
12
|
-
p1: Transform<T1, TStart>,
|
|
13
|
-
p2: Transform<T2, T1>,
|
|
14
|
-
): Serializer<T2>;
|
|
15
|
-
|
|
16
|
-
export function pipe<TStart, T1, T2, T3>(
|
|
17
|
-
type: Serializer<TStart>,
|
|
18
|
-
p1: Transform<T1, TStart>,
|
|
19
|
-
p2: Transform<T2, T1>,
|
|
20
|
-
p3: Transform<T3, T2>,
|
|
21
|
-
): Serializer<T3>;
|
|
22
|
-
|
|
23
|
-
export function pipe<TStart, T1, T2, T3, T4>(
|
|
24
|
-
type: Serializer<TStart>,
|
|
25
|
-
p1: Transform<T1, TStart>,
|
|
26
|
-
p2: Transform<T2, T1>,
|
|
27
|
-
p3: Transform<T3, T2>,
|
|
28
|
-
p4: Transform<T4, T3>,
|
|
29
|
-
): Serializer<T4>;
|
|
30
|
-
|
|
31
|
-
export function pipe<TStart, T1, T2, T3, T4, T5>(
|
|
32
|
-
type: Serializer<TStart>,
|
|
33
|
-
p1: Transform<T1, TStart>,
|
|
34
|
-
p2: Transform<T2, T1>,
|
|
35
|
-
p3: Transform<T3, T2>,
|
|
36
|
-
p4: Transform<T4, T3>,
|
|
37
|
-
p5: Transform<T5, T4>,
|
|
38
|
-
): Serializer<T5>;
|
|
39
|
-
|
|
40
|
-
export function pipe<TStart, T1, T2, T3, T4, T5, T6>(
|
|
41
|
-
type: Serializer<TStart>,
|
|
42
|
-
p1: Transform<T1, TStart>,
|
|
43
|
-
p2: Transform<T2, T1>,
|
|
44
|
-
p3: Transform<T3, T2>,
|
|
45
|
-
p4: Transform<T4, T3>,
|
|
46
|
-
p5: Transform<T5, T6>,
|
|
47
|
-
): Serializer<T6>;
|
|
48
|
-
|
|
49
|
-
export function pipe<TStart, T1, T2, T3, T4, T5, T6, T7>(
|
|
50
|
-
type: Serializer<TStart>,
|
|
51
|
-
p1: Transform<T1, TStart>,
|
|
52
|
-
p2: Transform<T2, T1>,
|
|
53
|
-
p3: Transform<T3, T2>,
|
|
54
|
-
p4: Transform<T4, T3>,
|
|
55
|
-
p5: Transform<T5, T6>,
|
|
56
|
-
p6: Transform<T6, T7>,
|
|
57
|
-
): Serializer<T7>;
|
|
58
|
-
|
|
59
|
-
export function pipe<TStart, T1, T2, T3, T4, T5, T6, T7, T8>(
|
|
60
|
-
type: Serializer<TStart>,
|
|
61
|
-
p1: Transform<T1, TStart>,
|
|
62
|
-
p2: Transform<T2, T1>,
|
|
63
|
-
p3: Transform<T3, T2>,
|
|
64
|
-
p4: Transform<T4, T3>,
|
|
65
|
-
p5: Transform<T5, T6>,
|
|
66
|
-
p6: Transform<T6, T7>,
|
|
67
|
-
p7: Transform<T7, T8>,
|
|
68
|
-
): Serializer<T8>;
|
|
69
|
-
|
|
70
|
-
export function pipe<TStart, T1, T2, T3, T4, T5, T6, T7, T8, T9>(
|
|
71
|
-
type: Serializer<TStart>,
|
|
72
|
-
p1: Transform<T1, TStart>,
|
|
73
|
-
p2: Transform<T2, T1>,
|
|
74
|
-
p3: Transform<T3, T2>,
|
|
75
|
-
p4: Transform<T4, T3>,
|
|
76
|
-
p5: Transform<T5, T6>,
|
|
77
|
-
p6: Transform<T6, T7>,
|
|
78
|
-
p7: Transform<T7, T8>,
|
|
79
|
-
p8: Transform<T8, T9>,
|
|
80
|
-
): Serializer<T9>;
|
|
81
|
-
|
|
82
|
-
export function pipe<T, TPipeline extends Transform[]>(
|
|
83
|
-
type: Serializer<T>,
|
|
84
|
-
...pipeline: TPipeline[]
|
|
85
|
-
): any {
|
|
86
|
-
//@ts-ignore
|
|
87
|
-
return pipeline.reduce((v, func) => func(v), type);
|
|
88
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { Serializer } from "../../types";
|
|
2
|
-
|
|
3
|
-
export function positionOffset<T>(delta: number) {
|
|
4
|
-
return (type: Serializer<T>): Serializer<T> => ({
|
|
5
|
-
size: type.size,
|
|
6
|
-
read: (ctx) => {
|
|
7
|
-
let start = ctx.offset;
|
|
8
|
-
ctx.offset += delta;
|
|
9
|
-
const value = type.read(ctx);
|
|
10
|
-
ctx.offset = start;
|
|
11
|
-
return value;
|
|
12
|
-
},
|
|
13
|
-
write: (ctx, value) => {
|
|
14
|
-
let start = ctx.offset;
|
|
15
|
-
ctx.offset += delta;
|
|
16
|
-
type.write(ctx, value);
|
|
17
|
-
ctx.offset = start;
|
|
18
|
-
},
|
|
19
|
-
});
|
|
20
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Serializer } from "../../types";
|
|
2
|
-
|
|
3
|
-
export function transform<T>(callback: (value: T) => T) {
|
|
4
|
-
return (type: Serializer<T>): Serializer<T> => ({
|
|
5
|
-
size: type.size,
|
|
6
|
-
read: (ctx) => {
|
|
7
|
-
const value = type.read(ctx);
|
|
8
|
-
return callback(value);
|
|
9
|
-
},
|
|
10
|
-
write: (ctx, value) => {
|
|
11
|
-
let outValue = callback(value);
|
|
12
|
-
type.write(ctx, outValue);
|
|
13
|
-
},
|
|
14
|
-
});
|
|
15
|
-
}
|