@nnilky/structo 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -0
- package/dist/datatypes/containers/array.d.ts +2 -0
- package/dist/datatypes/containers/array.js +22 -0
- package/dist/datatypes/containers/array.test.d.ts +1 -0
- package/dist/datatypes/containers/array.test.js +22 -0
- package/dist/datatypes/containers/fastObject.d.ts +19 -0
- package/dist/datatypes/containers/fastObject.js +59 -0
- package/dist/datatypes/containers/list.d.ts +5 -0
- package/dist/datatypes/containers/list.js +22 -0
- package/dist/datatypes/containers/list.test.d.ts +1 -0
- package/dist/datatypes/containers/list.test.js +31 -0
- package/dist/datatypes/containers/object.d.ts +20 -0
- package/dist/datatypes/containers/object.js +35 -0
- package/dist/datatypes/containers/object.test.d.ts +1 -0
- package/dist/datatypes/containers/object.test.js +33 -0
- package/dist/datatypes/containers/sizedbuffer.d.ts +2 -0
- package/dist/datatypes/containers/sizedbuffer.js +17 -0
- package/dist/datatypes/containers/sizedbuffer.test.d.ts +1 -0
- package/dist/datatypes/containers/sizedbuffer.test.js +27 -0
- package/dist/datatypes/index.d.ts +16 -0
- package/dist/datatypes/index.js +16 -0
- package/dist/datatypes/lazy.d.ts +1 -0
- package/dist/datatypes/lazy.js +1 -0
- package/dist/datatypes/numbers/bigints.d.ts +3 -0
- package/dist/datatypes/numbers/bigints.js +37 -0
- package/dist/datatypes/numbers/bigints.test.d.ts +1 -0
- package/dist/datatypes/numbers/bigints.test.js +61 -0
- package/dist/datatypes/numbers/floats.d.ts +3 -0
- package/dist/datatypes/numbers/floats.js +30 -0
- package/dist/datatypes/numbers/floats.test.d.ts +1 -0
- package/dist/datatypes/numbers/floats.test.js +71 -0
- package/dist/datatypes/numbers/sints.d.ts +5 -0
- package/dist/datatypes/numbers/sints.js +72 -0
- package/dist/datatypes/numbers/sints.test.d.ts +1 -0
- package/dist/datatypes/numbers/sints.test.js +87 -0
- package/dist/datatypes/numbers/uints.d.ts +5 -0
- package/dist/datatypes/numbers/uints.js +76 -0
- package/dist/datatypes/numbers/uints.test.d.ts +1 -0
- package/dist/datatypes/numbers/uints.test.js +87 -0
- package/dist/datatypes/transforms/pipe.d.ts +11 -0
- package/dist/datatypes/transforms/pipe.js +4 -0
- package/dist/datatypes/transforms/pipe.test.d.ts +1 -0
- package/dist/datatypes/transforms/pipe.test.js +13 -0
- package/dist/datatypes/transforms/readOffset.d.ts +2 -0
- package/dist/datatypes/transforms/readOffset.js +18 -0
- package/dist/datatypes/transforms/transform.d.ts +2 -0
- package/dist/datatypes/transforms/transform.js +13 -0
- package/dist/datatypes/utilities/constant.d.ts +2 -0
- package/dist/datatypes/utilities/constant.js +13 -0
- package/dist/datatypes/utilities/remember.d.ts +5 -0
- package/dist/datatypes/utilities/remember.js +26 -0
- package/dist/datatypes/utils.test.d.ts +7 -0
- package/dist/datatypes/utils.test.js +33 -0
- package/dist/datatypes/values/buffer.d.ts +2 -0
- package/dist/datatypes/values/buffer.js +18 -0
- package/dist/datatypes/values/buffer.test.d.ts +1 -0
- package/dist/datatypes/values/buffer.test.js +43 -0
- package/dist/datatypes/values/byteliteral.d.ts +2 -0
- package/dist/datatypes/values/byteliteral.js +20 -0
- package/dist/datatypes/values/string.d.ts +2 -0
- package/dist/datatypes/values/string.js +22 -0
- package/dist/datatypes/values/string.test.d.ts +1 -0
- package/dist/datatypes/values/string.test.js +18 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/read.d.ts +7 -0
- package/dist/read.js +10 -0
- package/dist/types.d.ts +18 -0
- package/dist/types.js +1 -0
- package/dist/utils.test.d.ts +1 -0
- package/dist/utils.test.js +1 -0
- package/dist/write.d.ts +3 -0
- package/dist/write.js +43 -0
- package/package.json +4 -4
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function byteLiteral(bytes) {
|
|
2
|
+
const length = bytes.length;
|
|
3
|
+
return {
|
|
4
|
+
size: bytes.length,
|
|
5
|
+
read: (ctx) => {
|
|
6
|
+
const arr = new Uint8Array(ctx.view.buffer);
|
|
7
|
+
for (let i = 0; i < length; i++) {
|
|
8
|
+
if (arr[ctx.offset + i] !== bytes[i]) {
|
|
9
|
+
throw new Error("Invalid Value");
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
ctx.offset += length;
|
|
13
|
+
return bytes;
|
|
14
|
+
},
|
|
15
|
+
write(ctx) {
|
|
16
|
+
new Uint8Array(ctx.view.buffer).set(bytes, ctx.offset);
|
|
17
|
+
ctx.offset += length;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function string(length) {
|
|
2
|
+
const { read: readLength, write: writeLength, size: lengthSize = 0 } = length;
|
|
3
|
+
const encoder = new TextEncoder();
|
|
4
|
+
const decoder = new TextDecoder();
|
|
5
|
+
return {
|
|
6
|
+
write: (ctx, value) => {
|
|
7
|
+
const bytes = encoder.encode(value);
|
|
8
|
+
const length = bytes.byteLength;
|
|
9
|
+
ctx.alloc(length + lengthSize);
|
|
10
|
+
writeLength(ctx, length);
|
|
11
|
+
const arr = new Uint8Array(ctx.buffer, ctx.offset);
|
|
12
|
+
arr.set(bytes);
|
|
13
|
+
ctx.offset += length;
|
|
14
|
+
},
|
|
15
|
+
read: (ctx) => {
|
|
16
|
+
const length = readLength(ctx);
|
|
17
|
+
const section = ctx.buffer.slice(ctx.offset, ctx.offset + length);
|
|
18
|
+
ctx.offset += length;
|
|
19
|
+
return decoder.decode(section);
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { describe, it } from "bun:test";
|
|
2
|
+
import { expectEncode, expectError } from "../utils.test";
|
|
3
|
+
import * as st from "../../index";
|
|
4
|
+
describe("st.string", () => {
|
|
5
|
+
const string_u8 = st.string(st.u8());
|
|
6
|
+
const string_u32 = st.string(st.u32());
|
|
7
|
+
it("encode correctly", () => {
|
|
8
|
+
expectEncode(string_u8, "foo");
|
|
9
|
+
});
|
|
10
|
+
it("works on empty strings", () => {
|
|
11
|
+
expectEncode(string_u32, "");
|
|
12
|
+
});
|
|
13
|
+
it("errors on too long strings", () => {
|
|
14
|
+
expectError(() => {
|
|
15
|
+
st.write(string_u8, "A".repeat(256));
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
});
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
package/dist/read.d.ts
ADDED
|
@@ -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
|
+
};
|
package/dist/read.js
ADDED
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type Serializer<TIn, TOut = TIn> = {
|
|
2
|
+
size?: number | undefined;
|
|
3
|
+
write: (ctx: WriterContext, value: TIn) => void;
|
|
4
|
+
read: (ctx: ReaderContext) => TOut;
|
|
5
|
+
};
|
|
6
|
+
export interface WriterContext {
|
|
7
|
+
buffer: ArrayBuffer;
|
|
8
|
+
view: DataView;
|
|
9
|
+
offset: number;
|
|
10
|
+
alloc: (length: number) => void;
|
|
11
|
+
}
|
|
12
|
+
export interface ReaderContext {
|
|
13
|
+
buffer: ArrayBuffer;
|
|
14
|
+
view: DataView;
|
|
15
|
+
offset: number;
|
|
16
|
+
}
|
|
17
|
+
export type InferInput<T> = T extends Serializer<infer V> ? V : never;
|
|
18
|
+
export type InferOutput<T> = T extends Serializer<any, infer V> ? V : never;
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/write.d.ts
ADDED
package/dist/write.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export function write(serializer, value) {
|
|
2
|
+
const ctx = createdWriterContext(serializer);
|
|
3
|
+
serializer.write(ctx, value);
|
|
4
|
+
if (ctx.buffer.byteLength === ctx.offset) {
|
|
5
|
+
return ctx.buffer;
|
|
6
|
+
}
|
|
7
|
+
else {
|
|
8
|
+
return ctx.buffer.transfer(ctx.offset);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export function createdWriterContext(type) {
|
|
12
|
+
if (type.size) {
|
|
13
|
+
let buffer = new ArrayBuffer(type.size);
|
|
14
|
+
const view = new DataView(buffer);
|
|
15
|
+
return {
|
|
16
|
+
offset: 0,
|
|
17
|
+
buffer,
|
|
18
|
+
view,
|
|
19
|
+
alloc: Function.prototype,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
let bufferLength = 128;
|
|
24
|
+
let buffer = new ArrayBuffer(bufferLength, { maxByteLength: 1024 });
|
|
25
|
+
const view = new DataView(buffer);
|
|
26
|
+
return {
|
|
27
|
+
offset: 0,
|
|
28
|
+
buffer,
|
|
29
|
+
view,
|
|
30
|
+
alloc(length) {
|
|
31
|
+
if (length < 0)
|
|
32
|
+
return;
|
|
33
|
+
if (buffer.resizable) {
|
|
34
|
+
}
|
|
35
|
+
while (this.offset + length > bufferLength) {
|
|
36
|
+
bufferLength = bufferLength * 2;
|
|
37
|
+
this.buffer.resize(bufferLength);
|
|
38
|
+
this.view = new DataView(this.buffer);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"description": "A library for serializing and deserializing binary content",
|
|
4
4
|
"keywords": ["binary", "library", "utility", "web", "node"],
|
|
5
5
|
"license": "ISC",
|
|
6
|
-
"version": "1.0.
|
|
6
|
+
"version": "1.0.3",
|
|
7
7
|
"author": "Ben Brady",
|
|
8
8
|
"private": false,
|
|
9
9
|
"publishConfig": {"access": "public"},
|
|
@@ -34,9 +34,9 @@
|
|
|
34
34
|
"files": [
|
|
35
35
|
"LICENSE",
|
|
36
36
|
"README.md",
|
|
37
|
-
"./dist
|
|
38
|
-
"./dist
|
|
39
|
-
"./dist
|
|
37
|
+
"./dist/**/*.d.ts",
|
|
38
|
+
"./dist/**/*.js.map",
|
|
39
|
+
"./dist/**/*.js"
|
|
40
40
|
],
|
|
41
41
|
|
|
42
42
|
"scripts": {
|