@nnilky/structo 1.0.0 → 1.0.2
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/dist/structo/datatypes/containers/array.d.ts +2 -0
- package/{structo/datatypes/containers/array.ts → dist/structo/datatypes/containers/array.js} +5 -7
- package/dist/structo/datatypes/containers/fastObject.d.ts +6 -0
- package/{structo/datatypes/containers/fastObject.ts → dist/structo/datatypes/containers/fastObject.js} +12 -32
- package/dist/structo/datatypes/containers/list.d.ts +5 -0
- package/{structo/datatypes/containers/list.ts → dist/structo/datatypes/containers/list.js} +3 -10
- package/dist/structo/datatypes/containers/object.d.ts +9 -0
- package/dist/structo/datatypes/containers/object.js +24 -0
- package/dist/structo/datatypes/containers/sizedbuffer.d.ts +2 -0
- package/{structo/datatypes/containers/sizedbuffer.ts → dist/structo/datatypes/containers/sizedbuffer.js} +1 -4
- package/{structo/datatypes/index.ts → dist/structo/datatypes/index.d.ts} +0 -3
- package/dist/structo/datatypes/index.js +15 -0
- package/dist/structo/datatypes/numbers/bigints.d.ts +3 -0
- package/{structo/datatypes/numbers/bigints.ts → dist/structo/datatypes/numbers/bigints.js} +3 -14
- package/dist/structo/datatypes/numbers/floats.d.ts +3 -0
- package/{structo/datatypes/numbers/floats.ts → dist/structo/datatypes/numbers/floats.js} +2 -5
- package/dist/structo/datatypes/numbers/sints.d.ts +5 -0
- package/{structo/datatypes/numbers/sints.ts → dist/structo/datatypes/numbers/sints.js} +5 -16
- package/dist/structo/datatypes/numbers/uints.d.ts +5 -0
- package/{structo/datatypes/numbers/uints.ts → dist/structo/datatypes/numbers/uints.js} +20 -26
- package/dist/structo/datatypes/transforms/pipe.d.ts +11 -0
- package/dist/structo/datatypes/transforms/pipe.js +4 -0
- package/dist/structo/datatypes/transforms/readOffset.d.ts +2 -0
- package/{structo/datatypes/transforms/readOffset.ts → dist/structo/datatypes/transforms/readOffset.js} +2 -4
- package/dist/structo/datatypes/transforms/transform.d.ts +2 -0
- package/{structo/datatypes/transforms/transform.ts → dist/structo/datatypes/transforms/transform.js} +2 -4
- package/dist/structo/datatypes/values/buffer.d.ts +2 -0
- package/{structo/datatypes/values/buffer.ts → dist/structo/datatypes/values/buffer.js} +3 -5
- package/dist/structo/datatypes/values/byteliteral.d.ts +2 -0
- package/{structo/datatypes/values/byteliteral.ts → dist/structo/datatypes/values/byteliteral.js} +1 -5
- package/dist/structo/datatypes/values/string.d.ts +2 -0
- package/{structo/datatypes/values/string.ts → dist/structo/datatypes/values/string.js} +1 -8
- package/dist/structo/index.d.ts +4 -0
- package/dist/structo/index.js +3 -0
- package/dist/structo/read.d.ts +7 -0
- package/dist/structo/read.js +10 -0
- package/{structo/types.ts → dist/structo/types.d.ts} +0 -3
- package/dist/structo/types.js +1 -0
- package/dist/structo/write.d.ts +3 -0
- package/{structo/write.ts → dist/structo/write.js} +9 -11
- 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/list.test.ts +0 -44
- 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/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/floats.test.ts +0 -91
- package/structo/datatypes/numbers/sints.test.ts +0 -109
- package/structo/datatypes/numbers/uints.test.ts +0 -110
- package/structo/datatypes/transforms/pipe.test.ts +0 -17
- package/structo/datatypes/transforms/pipe.ts +0 -88
- package/structo/datatypes/utils.test.ts +0 -39
- package/structo/datatypes/values/buffer.test.ts +0 -52
- package/structo/datatypes/values/string.test.ts +0 -22
- package/structo/index.ts +0 -11
- package/structo/read.ts +0 -14
- package/structo/utils.test.ts +0 -0
package/{structo/datatypes/containers/array.ts → dist/structo/datatypes/containers/array.js}
RENAMED
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function array<T>(size: number, type: Serializer<T>): Serializer<T[]> {
|
|
1
|
+
export function array(size, type) {
|
|
4
2
|
const { read: readType, write: writeType, size: typeSize } = type;
|
|
5
|
-
|
|
6
3
|
return {
|
|
7
4
|
size: type.size ? size * type.size : undefined,
|
|
8
5
|
write: (ctx, value) => {
|
|
9
|
-
if (value.length !== size)
|
|
10
|
-
|
|
11
|
-
if (typeSize)
|
|
6
|
+
if (value.length !== size)
|
|
7
|
+
throw new Error("Invalid Size");
|
|
8
|
+
if (typeSize)
|
|
9
|
+
ctx.alloc(size * typeSize);
|
|
12
10
|
for (let i = 0; i < size; i++) {
|
|
13
11
|
writeType(ctx, value[i]);
|
|
14
12
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { InferInput, Serializer } from "../../types";
|
|
2
|
+
type InferObject<T> = T extends Record<string, Serializer<any>> ? {
|
|
3
|
+
[Key in keyof T]: InferInput<T[Key]>;
|
|
4
|
+
} : never;
|
|
5
|
+
export declare function fastObject<T extends Record<string, Serializer<any>>>(definition: T): Serializer<InferObject<T>>;
|
|
6
|
+
export {};
|
|
@@ -1,61 +1,41 @@
|
|
|
1
|
-
import type { InferInput, Serializer } from "../../types";
|
|
2
|
-
|
|
3
|
-
type InferObject<T> =
|
|
4
|
-
T extends Record<string, Serializer<any>> ? { [Key in keyof T]: InferInput<T[Key]> } : never;
|
|
5
|
-
|
|
6
1
|
const definitionSymbol = Symbol();
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
definition: T,
|
|
10
|
-
): Serializer<InferObject<T>> {
|
|
11
|
-
let serializers: [string, Serializer<any>][] = [];
|
|
12
|
-
|
|
2
|
+
export function fastObject(definition) {
|
|
3
|
+
let serializers = [];
|
|
13
4
|
let writeBody = "";
|
|
14
5
|
let readBody = "";
|
|
15
|
-
|
|
16
|
-
function generateSerializers(serializer: Serializer<any>, keys: string[]) {
|
|
6
|
+
function generateSerializers(serializer, keys) {
|
|
17
7
|
if (definitionSymbol in serializer) {
|
|
18
|
-
const definition = serializer[definitionSymbol]
|
|
8
|
+
const definition = serializer[definitionSymbol];
|
|
19
9
|
readBody += `${keys[keys.length - 1]}: {`;
|
|
20
|
-
for (const key of Object.keys(definition
|
|
10
|
+
for (const key of Object.keys(definition)) {
|
|
21
11
|
generateSerializers(definition[key], [...keys, key]);
|
|
22
12
|
}
|
|
23
13
|
readBody += `},`;
|
|
24
|
-
}
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
25
16
|
let path = "";
|
|
26
17
|
for (const key of keys) {
|
|
27
18
|
if (key.match(/[a-zA-Z_][a-zA-Z0-9_]*/)) {
|
|
28
19
|
path += `.${key}`;
|
|
29
|
-
}
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
30
22
|
path += `[${JSON.stringify(key)}]`;
|
|
31
23
|
}
|
|
32
24
|
}
|
|
33
|
-
|
|
34
25
|
let name = `s${Object.keys(serializers).length}`;
|
|
35
26
|
serializers.push([name, serializer]);
|
|
36
27
|
writeBody += `${name}(c, v${path});`;
|
|
37
28
|
readBody += `${keys[keys.length - 1]}: ${name}(c),`;
|
|
38
29
|
}
|
|
39
30
|
}
|
|
40
|
-
|
|
41
31
|
for (const key of Object.keys(definition)) {
|
|
42
32
|
generateSerializers(definition[key], [key]);
|
|
43
33
|
}
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
...serializers.map((v) => v[0]),
|
|
47
|
-
`return (c, v) => {${writeBody}}`,
|
|
48
|
-
);
|
|
49
|
-
const readFactory = new Function(
|
|
50
|
-
...serializers.map((v) => v[0]),
|
|
51
|
-
`return (c, v) => ({${readBody}})`,
|
|
52
|
-
);
|
|
53
|
-
|
|
34
|
+
const writeFactory = new Function(...serializers.map((v) => v[0]), `return (c, v) => {${writeBody}}`);
|
|
35
|
+
const readFactory = new Function(...serializers.map((v) => v[0]), `return (c, v) => ({${readBody}})`);
|
|
54
36
|
const write = writeFactory(...serializers.map((v) => v[1].write));
|
|
55
37
|
const read = readFactory(...serializers.map((v) => v[1].read));
|
|
56
|
-
|
|
57
|
-
let size = Object.values(definition).reduce((total, v) => total + (v.size as number), 0);
|
|
58
|
-
|
|
38
|
+
let size = Object.values(definition).reduce((total, v) => total + v.size, 0);
|
|
59
39
|
return {
|
|
60
40
|
//@ts-ignore
|
|
61
41
|
[definitionSymbol]: definition,
|
|
@@ -1,24 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function list<T>(options: {
|
|
4
|
-
type: Serializer<T>;
|
|
5
|
-
length: Serializer<number>;
|
|
6
|
-
}): Serializer<T[]> {
|
|
1
|
+
export function list(options) {
|
|
7
2
|
const { read: readLength, write: writeLength } = options.length;
|
|
8
3
|
const { read: readType, write: writeType, size: sizeType } = options.type;
|
|
9
|
-
|
|
10
4
|
return {
|
|
11
5
|
write: (ctx, value) => {
|
|
12
6
|
writeLength(ctx, value.length);
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
if (sizeType)
|
|
8
|
+
ctx.alloc(value.length * sizeType);
|
|
15
9
|
for (const v of value) {
|
|
16
10
|
writeType(ctx, v);
|
|
17
11
|
}
|
|
18
12
|
},
|
|
19
13
|
read: (ctx) => {
|
|
20
14
|
const size = readLength(ctx);
|
|
21
|
-
|
|
22
15
|
const arr = new Array(size);
|
|
23
16
|
for (let i = 0; i < size; i++) {
|
|
24
17
|
arr[i] = readType(ctx);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InferInput, InferOutput, Serializer } from "../../types";
|
|
2
|
+
type InferObjectInfer<T> = T extends Record<string, Serializer<any>> ? {
|
|
3
|
+
[Key in keyof T]: InferInput<T[Key]>;
|
|
4
|
+
} : never;
|
|
5
|
+
type InferObjectOutput<T> = T extends Record<string, Serializer<any>> ? {
|
|
6
|
+
[Key in keyof T]: InferOutput<T[Key]>;
|
|
7
|
+
} : never;
|
|
8
|
+
export declare function object<T extends Record<string, Serializer<any>>>(definition: T): Serializer<InferObjectInfer<T>, InferObjectOutput<T>>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function object(definition) {
|
|
2
|
+
const entires = Object.entries(definition);
|
|
3
|
+
// Use the fact: number + undefined = NaN
|
|
4
|
+
// Check for NaN afterwards
|
|
5
|
+
let computedSize = Object.values(definition).reduce((total, v) => total + v.size, 0);
|
|
6
|
+
const size = isNaN(computedSize) ? undefined : computedSize;
|
|
7
|
+
return {
|
|
8
|
+
size,
|
|
9
|
+
write: (ctx, value) => {
|
|
10
|
+
if (size)
|
|
11
|
+
ctx.alloc(size);
|
|
12
|
+
for (let i = 0; i < entires.length; i++) {
|
|
13
|
+
entires[i][1].write(ctx, value[entires[i][0]]);
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
read: (ctx) => {
|
|
17
|
+
const output = new Array(entires.length);
|
|
18
|
+
for (let i = 0; i < entires.length; i++) {
|
|
19
|
+
output[i] = [entires[i][0], entires[i][1].read(ctx)];
|
|
20
|
+
}
|
|
21
|
+
return Object.fromEntries(output);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function sizedBuffer(length: Serializer<number>): Serializer<ArrayBuffer> {
|
|
1
|
+
export function sizedBuffer(length) {
|
|
4
2
|
return {
|
|
5
3
|
write: (ctx, value) => {
|
|
6
4
|
length.write(ctx, value.byteLength);
|
|
7
|
-
|
|
8
5
|
const bytes = new Uint8Array(value);
|
|
9
6
|
ctx.alloc(value.byteLength);
|
|
10
7
|
new Uint8Array(ctx.view.buffer).set(bytes, ctx.offset);
|
|
@@ -2,17 +2,14 @@ export { u64Bigint, s64Bigint } from "./numbers/bigints";
|
|
|
2
2
|
export { f32, f64 } from "./numbers/floats";
|
|
3
3
|
export { s8, s16, s32, s64 } from "./numbers/sints";
|
|
4
4
|
export { u8, u16, u32, u64 } from "./numbers/uints";
|
|
5
|
-
|
|
6
5
|
export { array } from "./containers/array";
|
|
7
6
|
export { fastObject } from "./containers/fastObject";
|
|
8
7
|
export { object } from "./containers/object";
|
|
9
8
|
export { list } from "./containers/list";
|
|
10
9
|
export { sizedBuffer } from "./containers/sizedbuffer";
|
|
11
|
-
|
|
12
10
|
export { string } from "./values/string";
|
|
13
11
|
export { buffer } from "./values/buffer";
|
|
14
12
|
export { byteLiteral } from "./values/byteliteral";
|
|
15
|
-
|
|
16
13
|
export { type Transform as Pipeline, pipe } from "./transforms/pipe";
|
|
17
14
|
export { positionOffset } from "./transforms/readOffset";
|
|
18
15
|
export { transform } from "./transforms/transform";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { u64Bigint, s64Bigint } from "./numbers/bigints";
|
|
2
|
+
export { f32, f64 } from "./numbers/floats";
|
|
3
|
+
export { s8, s16, s32, s64 } from "./numbers/sints";
|
|
4
|
+
export { u8, u16, u32, u64 } from "./numbers/uints";
|
|
5
|
+
export { array } from "./containers/array";
|
|
6
|
+
export { fastObject } from "./containers/fastObject";
|
|
7
|
+
export { object } from "./containers/object";
|
|
8
|
+
export { list } from "./containers/list";
|
|
9
|
+
export { sizedBuffer } from "./containers/sizedbuffer";
|
|
10
|
+
export { string } from "./values/string";
|
|
11
|
+
export { buffer } from "./values/buffer";
|
|
12
|
+
export { byteLiteral } from "./values/byteliteral";
|
|
13
|
+
export { pipe } from "./transforms/pipe";
|
|
14
|
+
export { positionOffset } from "./transforms/readOffset";
|
|
15
|
+
export { transform } from "./transforms/transform";
|
|
@@ -1,20 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
import type { Serializer } from "../../types";
|
|
3
|
-
|
|
4
|
-
const checkValue = (value: number | bigint, start: bigint, end: bigint) => {
|
|
1
|
+
const checkValue = (value, start, end) => {
|
|
5
2
|
if (value < start || value >= end) {
|
|
6
3
|
throw new Error("Out of Range");
|
|
7
4
|
}
|
|
8
5
|
};
|
|
9
|
-
|
|
10
|
-
export function u64Bigint(
|
|
11
|
-
endian: "little" | "big" = "little",
|
|
12
|
-
): Serializer<number | bigint, bigint> {
|
|
6
|
+
export function u64Bigint(endian = "little") {
|
|
13
7
|
return {
|
|
14
8
|
size: 8,
|
|
15
9
|
write: (ctx, value) => {
|
|
16
10
|
checkValue(value, 0n, 2n ** 64n);
|
|
17
|
-
|
|
18
11
|
ctx.alloc(8);
|
|
19
12
|
ctx.view.setBigUint64(ctx.offset, BigInt(value), endian === "little");
|
|
20
13
|
ctx.offset += 8;
|
|
@@ -26,15 +19,11 @@ export function u64Bigint(
|
|
|
26
19
|
},
|
|
27
20
|
};
|
|
28
21
|
}
|
|
29
|
-
|
|
30
|
-
export function s64Bigint(
|
|
31
|
-
endian: "little" | "big" = "little",
|
|
32
|
-
): Serializer<number | bigint, bigint> {
|
|
22
|
+
export function s64Bigint(endian = "little") {
|
|
33
23
|
return {
|
|
34
24
|
size: 8,
|
|
35
25
|
write: (ctx, value) => {
|
|
36
26
|
checkValue(value, -(2n ** 63n), 2n ** 63n);
|
|
37
|
-
|
|
38
27
|
ctx.alloc(8);
|
|
39
28
|
ctx.view.setBigInt64(ctx.offset, BigInt(value), endian === "little");
|
|
40
29
|
ctx.offset += 8;
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function f32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
1
|
+
export function f32(endian = "little") {
|
|
4
2
|
return {
|
|
5
3
|
size: 4,
|
|
6
4
|
write: (ctx, value) => {
|
|
@@ -15,8 +13,7 @@ export function f32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
|
15
13
|
},
|
|
16
14
|
};
|
|
17
15
|
}
|
|
18
|
-
|
|
19
|
-
export function f64(endian: "little" | "big" = "little"): Serializer<number> {
|
|
16
|
+
export function f64(endian = "little") {
|
|
20
17
|
return {
|
|
21
18
|
size: 8,
|
|
22
19
|
write: (ctx, value) => {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Serializer } from "../../types";
|
|
2
|
+
export declare function s8(): Serializer<number>;
|
|
3
|
+
export declare function s16(endian?: "little" | "big"): Serializer<number>;
|
|
4
|
+
export declare function s32(endian?: "little" | "big"): Serializer<number>;
|
|
5
|
+
export declare function s64(endian?: "little" | "big"): Serializer<number>;
|
|
@@ -1,21 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const checkValue = (value: number, start: number, end: number) => {
|
|
1
|
+
const checkValue = (value, start, end) => {
|
|
4
2
|
if (!Number.isInteger(value)) {
|
|
5
3
|
throw new Error("Not Integer");
|
|
6
4
|
}
|
|
7
|
-
|
|
8
5
|
if (value < start || value >= end) {
|
|
9
6
|
throw new Error("Out of Range");
|
|
10
7
|
}
|
|
11
8
|
};
|
|
12
|
-
|
|
13
|
-
export function s8(): Serializer<number> {
|
|
9
|
+
export function s8() {
|
|
14
10
|
return {
|
|
15
11
|
size: 1,
|
|
16
12
|
write: (ctx, value) => {
|
|
17
13
|
checkValue(value, -(2 ** 7), 2 ** 7);
|
|
18
|
-
|
|
19
14
|
ctx.alloc(1);
|
|
20
15
|
ctx.view.setInt8(ctx.offset, value);
|
|
21
16
|
ctx.offset += 1;
|
|
@@ -27,13 +22,11 @@ export function s8(): Serializer<number> {
|
|
|
27
22
|
},
|
|
28
23
|
};
|
|
29
24
|
}
|
|
30
|
-
|
|
31
|
-
export function s16(endian: "little" | "big" = "little"): Serializer<number> {
|
|
25
|
+
export function s16(endian = "little") {
|
|
32
26
|
return {
|
|
33
27
|
size: 2,
|
|
34
28
|
write: (ctx, value) => {
|
|
35
29
|
checkValue(value, -(2 ** 15), 2 ** 15);
|
|
36
|
-
|
|
37
30
|
ctx.alloc(2);
|
|
38
31
|
ctx.view.setInt16(ctx.offset, value, endian === "little");
|
|
39
32
|
ctx.offset += 2;
|
|
@@ -45,13 +38,11 @@ export function s16(endian: "little" | "big" = "little"): Serializer<number> {
|
|
|
45
38
|
},
|
|
46
39
|
};
|
|
47
40
|
}
|
|
48
|
-
|
|
49
|
-
export function s32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
41
|
+
export function s32(endian = "little") {
|
|
50
42
|
return {
|
|
51
43
|
size: 4,
|
|
52
44
|
write: (ctx, value) => {
|
|
53
45
|
checkValue(value, -(2 ** 31), 2 ** 31);
|
|
54
|
-
|
|
55
46
|
ctx.alloc(4);
|
|
56
47
|
ctx.view.setInt32(ctx.offset, value, endian === "little");
|
|
57
48
|
ctx.offset += 4;
|
|
@@ -63,13 +54,11 @@ export function s32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
|
63
54
|
},
|
|
64
55
|
};
|
|
65
56
|
}
|
|
66
|
-
|
|
67
|
-
export function s64(endian: "little" | "big" = "little"): Serializer<number> {
|
|
57
|
+
export function s64(endian = "little") {
|
|
68
58
|
return {
|
|
69
59
|
size: 8,
|
|
70
60
|
write: (ctx, value) => {
|
|
71
61
|
checkValue(value, -(2 ** 63), 2 ** 63);
|
|
72
|
-
|
|
73
62
|
ctx.alloc(8);
|
|
74
63
|
ctx.view.setBigInt64(ctx.offset, BigInt(value), endian === "little");
|
|
75
64
|
ctx.offset += 8;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Serializer } from "../../types";
|
|
2
|
+
export declare function u8(): Serializer<number>;
|
|
3
|
+
export declare function u16(endian?: "little" | "big"): Serializer<number>;
|
|
4
|
+
export declare function u32(endian?: "little" | "big"): Serializer<number>;
|
|
5
|
+
export declare function u64(endian?: "little" | "big"): Serializer<number>;
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
|
|
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> {
|
|
1
|
+
export function u8() {
|
|
9
2
|
return {
|
|
10
3
|
size: 1,
|
|
11
4
|
write: (ctx, value) => {
|
|
12
|
-
if (!Number.isInteger(value))
|
|
13
|
-
|
|
14
|
-
|
|
5
|
+
if (!Number.isInteger(value))
|
|
6
|
+
throw new Error("Not Integer");
|
|
7
|
+
if (value < 0 || value >= 2 ** 8)
|
|
8
|
+
throw new Error("Out of Range");
|
|
15
9
|
ctx.alloc(1);
|
|
16
10
|
ctx.view.setUint8(ctx.offset, value);
|
|
17
11
|
ctx.offset += 1;
|
|
@@ -23,14 +17,14 @@ export function u8(): Serializer<number> {
|
|
|
23
17
|
},
|
|
24
18
|
};
|
|
25
19
|
}
|
|
26
|
-
|
|
27
|
-
export function u16(endian: "little" | "big" = "little"): Serializer<number> {
|
|
20
|
+
export function u16(endian = "little") {
|
|
28
21
|
return {
|
|
29
22
|
size: 2,
|
|
30
23
|
write: (ctx, value) => {
|
|
31
|
-
if (!Number.isInteger(value))
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
if (!Number.isInteger(value))
|
|
25
|
+
throw new Error("Not Integer");
|
|
26
|
+
if (value < 0 || value >= 2 ** 16)
|
|
27
|
+
throw new Error("Out of Range");
|
|
34
28
|
ctx.alloc(2);
|
|
35
29
|
ctx.view.setUint16(ctx.offset, value, endian === "little");
|
|
36
30
|
ctx.offset += 2;
|
|
@@ -42,14 +36,14 @@ export function u16(endian: "little" | "big" = "little"): Serializer<number> {
|
|
|
42
36
|
},
|
|
43
37
|
};
|
|
44
38
|
}
|
|
45
|
-
|
|
46
|
-
export function u32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
39
|
+
export function u32(endian = "little") {
|
|
47
40
|
return {
|
|
48
41
|
size: 4,
|
|
49
42
|
write: (ctx, value) => {
|
|
50
|
-
if (!Number.isInteger(value))
|
|
51
|
-
|
|
52
|
-
|
|
43
|
+
if (!Number.isInteger(value))
|
|
44
|
+
throw new Error("Not Integer");
|
|
45
|
+
if (value < 0 || value >= 2 ** 32)
|
|
46
|
+
throw new Error("Out of Range");
|
|
53
47
|
ctx.alloc(4);
|
|
54
48
|
ctx.view.setUint32(ctx.offset, value, endian === "little");
|
|
55
49
|
ctx.offset += 4;
|
|
@@ -61,14 +55,14 @@ export function u32(endian: "little" | "big" = "little"): Serializer<number> {
|
|
|
61
55
|
},
|
|
62
56
|
};
|
|
63
57
|
}
|
|
64
|
-
|
|
65
|
-
export function u64(endian: "little" | "big" = "little"): Serializer<number> {
|
|
58
|
+
export function u64(endian = "little") {
|
|
66
59
|
return {
|
|
67
60
|
size: 8,
|
|
68
61
|
write: (ctx, value) => {
|
|
69
|
-
if (!Number.isInteger(value))
|
|
70
|
-
|
|
71
|
-
|
|
62
|
+
if (!Number.isInteger(value))
|
|
63
|
+
throw new Error("Not Integer");
|
|
64
|
+
if (value < 0 || value >= 2 ** 64)
|
|
65
|
+
throw new Error("Out of Range");
|
|
72
66
|
ctx.alloc(8);
|
|
73
67
|
ctx.view.setBigUint64(ctx.offset, BigInt(value), endian === "little");
|
|
74
68
|
ctx.offset += 8;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Serializer } from "../../types";
|
|
2
|
+
export type Transform<T = any, TNext = T> = (type: Serializer<TNext>) => Serializer<T>;
|
|
3
|
+
export declare function pipe<TStart, T1>(type: Serializer<TStart>, p1: Transform<T1, TStart>): Serializer<T1>;
|
|
4
|
+
export declare function pipe<TStart, T1, T2>(type: Serializer<TStart>, p1: Transform<T1, TStart>, p2: Transform<T2, T1>): Serializer<T2>;
|
|
5
|
+
export declare function pipe<TStart, T1, T2, T3>(type: Serializer<TStart>, p1: Transform<T1, TStart>, p2: Transform<T2, T1>, p3: Transform<T3, T2>): Serializer<T3>;
|
|
6
|
+
export declare function pipe<TStart, T1, T2, T3, T4>(type: Serializer<TStart>, p1: Transform<T1, TStart>, p2: Transform<T2, T1>, p3: Transform<T3, T2>, p4: Transform<T4, T3>): Serializer<T4>;
|
|
7
|
+
export declare function pipe<TStart, T1, T2, T3, T4, T5>(type: Serializer<TStart>, p1: Transform<T1, TStart>, p2: Transform<T2, T1>, p3: Transform<T3, T2>, p4: Transform<T4, T3>, p5: Transform<T5, T4>): Serializer<T5>;
|
|
8
|
+
export declare function pipe<TStart, T1, T2, T3, T4, T5, T6>(type: Serializer<TStart>, p1: Transform<T1, TStart>, p2: Transform<T2, T1>, p3: Transform<T3, T2>, p4: Transform<T4, T3>, p5: Transform<T5, T6>): Serializer<T6>;
|
|
9
|
+
export declare function pipe<TStart, T1, T2, T3, T4, T5, T6, T7>(type: Serializer<TStart>, p1: Transform<T1, TStart>, p2: Transform<T2, T1>, p3: Transform<T3, T2>, p4: Transform<T4, T3>, p5: Transform<T5, T6>, p6: Transform<T6, T7>): Serializer<T7>;
|
|
10
|
+
export declare function pipe<TStart, T1, T2, T3, T4, T5, T6, T7, T8>(type: Serializer<TStart>, p1: Transform<T1, TStart>, p2: Transform<T2, T1>, p3: Transform<T3, T2>, p4: Transform<T4, T3>, p5: Transform<T5, T6>, p6: Transform<T6, T7>, p7: Transform<T7, T8>): Serializer<T8>;
|
|
11
|
+
export declare function pipe<TStart, T1, T2, T3, T4, T5, T6, T7, T8, T9>(type: Serializer<TStart>, p1: Transform<T1, TStart>, p2: Transform<T2, T1>, p3: Transform<T3, T2>, p4: Transform<T4, T3>, p5: Transform<T5, T6>, p6: Transform<T6, T7>, p7: Transform<T7, T8>, p8: Transform<T8, T9>): Serializer<T9>;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function positionOffset<T>(delta: number) {
|
|
4
|
-
return (type: Serializer<T>): Serializer<T> => ({
|
|
1
|
+
export function positionOffset(delta) {
|
|
2
|
+
return (type) => ({
|
|
5
3
|
size: type.size,
|
|
6
4
|
read: (ctx) => {
|
|
7
5
|
let start = ctx.offset;
|
package/{structo/datatypes/transforms/transform.ts → dist/structo/datatypes/transforms/transform.js}
RENAMED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function transform<T>(callback: (value: T) => T) {
|
|
4
|
-
return (type: Serializer<T>): Serializer<T> => ({
|
|
1
|
+
export function transform(callback) {
|
|
2
|
+
return (type) => ({
|
|
5
3
|
size: type.size,
|
|
6
4
|
read: (ctx) => {
|
|
7
5
|
const value = type.read(ctx);
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function buffer(size: number): Serializer<ArrayBuffer> {
|
|
1
|
+
export function buffer(size) {
|
|
4
2
|
return {
|
|
5
3
|
size,
|
|
6
4
|
write: (ctx, value) => {
|
|
7
5
|
const bytes = new Uint8Array(value);
|
|
8
|
-
if (bytes.length !== size)
|
|
9
|
-
|
|
6
|
+
if (bytes.length !== size)
|
|
7
|
+
throw new Error("Invalid Length");
|
|
10
8
|
ctx.alloc(size);
|
|
11
9
|
new Uint8Array(ctx.buffer).set(bytes, ctx.offset);
|
|
12
10
|
ctx.offset += size;
|
package/{structo/datatypes/values/byteliteral.ts → dist/structo/datatypes/values/byteliteral.js}
RENAMED
|
@@ -1,13 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function byteLiteral(bytes: number[]): Serializer<number[]> {
|
|
1
|
+
export function byteLiteral(bytes) {
|
|
4
2
|
const length = bytes.length;
|
|
5
|
-
|
|
6
3
|
return {
|
|
7
4
|
size: bytes.length,
|
|
8
5
|
read: (ctx) => {
|
|
9
6
|
const arr = new Uint8Array(ctx.view.buffer);
|
|
10
|
-
|
|
11
7
|
for (let i = 0; i < length; i++) {
|
|
12
8
|
if (arr[ctx.offset + i] !== bytes[i]) {
|
|
13
9
|
throw new Error("Invalid Value");
|
|
@@ -1,21 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export function string(length: Serializer<number>): Serializer<string> {
|
|
1
|
+
export function string(length) {
|
|
4
2
|
const { read: readLength, write: writeLength } = length;
|
|
5
3
|
const encoder = new TextEncoder();
|
|
6
4
|
const decoder = new TextDecoder();
|
|
7
|
-
|
|
8
5
|
return {
|
|
9
6
|
write: (ctx, value) => {
|
|
10
7
|
const bytes = encoder.encode(value);
|
|
11
|
-
|
|
12
8
|
writeLength(ctx, bytes.byteLength);
|
|
13
|
-
|
|
14
9
|
ctx.alloc(bytes.byteLength);
|
|
15
|
-
|
|
16
10
|
const arr = new Uint8Array(ctx.view.buffer);
|
|
17
11
|
arr.set(bytes, ctx.offset);
|
|
18
|
-
|
|
19
12
|
ctx.offset += bytes.byteLength;
|
|
20
13
|
},
|
|
21
14
|
read: (ctx) => {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Serializer } from "./types";
|
|
2
|
+
export declare function read<T>(serializer: Serializer<T>, buffer: ArrayBuffer): T;
|
|
3
|
+
export declare function createReaderContext(buffer: ArrayBuffer): {
|
|
4
|
+
offset: number;
|
|
5
|
+
buffer: ArrayBuffer;
|
|
6
|
+
view: DataView<ArrayBuffer>;
|
|
7
|
+
};
|
|
@@ -3,19 +3,16 @@ export type Serializer<TIn, TOut = TIn> = {
|
|
|
3
3
|
write: (ctx: WriterContext, value: TIn) => void;
|
|
4
4
|
read: (ctx: ReaderContext) => TOut;
|
|
5
5
|
};
|
|
6
|
-
|
|
7
6
|
export interface WriterContext {
|
|
8
7
|
buffer: ArrayBuffer;
|
|
9
8
|
view: DataView;
|
|
10
9
|
offset: number;
|
|
11
10
|
alloc: (length: number) => void;
|
|
12
11
|
}
|
|
13
|
-
|
|
14
12
|
export interface ReaderContext {
|
|
15
13
|
buffer: ArrayBuffer;
|
|
16
14
|
view: DataView;
|
|
17
15
|
offset: number;
|
|
18
16
|
}
|
|
19
|
-
|
|
20
17
|
export type InferInput<T> = T extends Serializer<infer V> ? V : never;
|
|
21
18
|
export type InferOutput<T> = T extends Serializer<any, infer V> ? V : never;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|