@nnilky/structo 1.0.3 → 1.0.5

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 (71) hide show
  1. package/README.md +1 -1
  2. package/dist/datatypes/containers/array.d.ts +8 -0
  3. package/dist/datatypes/containers/array.js +8 -0
  4. package/dist/datatypes/containers/exhuastiveArray.d.ts +9 -0
  5. package/dist/datatypes/containers/exhuastiveArray.js +24 -0
  6. package/dist/datatypes/containers/exhuastiveArray.test.js +41 -0
  7. package/dist/datatypes/containers/fastObject.test.js +33 -0
  8. package/dist/datatypes/containers/list.d.ts +11 -4
  9. package/dist/datatypes/containers/list.js +17 -9
  10. package/dist/datatypes/containers/list.test.js +6 -8
  11. package/dist/datatypes/containers/object.test.js +1 -1
  12. package/dist/datatypes/containers/sizedbytes.d.ts +2 -0
  13. package/dist/datatypes/containers/{sizedbuffer.js → sizedbytes.js} +1 -1
  14. package/dist/datatypes/containers/{sizedbuffer.test.js → sizedbytes.test.js} +5 -5
  15. package/dist/datatypes/{values → containers}/string.js +10 -8
  16. package/dist/datatypes/{values → containers}/string.test.js +6 -0
  17. package/dist/datatypes/containers/taggedUnion.d.ts +22 -0
  18. package/dist/datatypes/containers/taggedUnion.js +33 -0
  19. package/dist/datatypes/containers/taggedUnion.test.js +63 -0
  20. package/dist/datatypes/index.d.ts +12 -8
  21. package/dist/datatypes/index.js +12 -8
  22. package/dist/datatypes/numbers/bigints.d.ts +10 -0
  23. package/dist/datatypes/numbers/bigints.js +10 -0
  24. package/dist/datatypes/numbers/floats.d.ts +4 -0
  25. package/dist/datatypes/numbers/floats.js +18 -0
  26. package/dist/datatypes/numbers/floats.test.js +49 -47
  27. package/dist/datatypes/numbers/sints.d.ts +4 -0
  28. package/dist/datatypes/numbers/sints.js +4 -0
  29. package/dist/datatypes/numbers/uints.d.ts +4 -0
  30. package/dist/datatypes/numbers/uints.js +4 -0
  31. package/dist/datatypes/transforms/encode.d.ts +2 -0
  32. package/dist/datatypes/transforms/encode.js +7 -0
  33. package/dist/datatypes/transforms/fixedOffset.d.ts +2 -0
  34. package/dist/datatypes/transforms/{readOffset.js → fixedOffset.js} +1 -1
  35. package/dist/datatypes/transforms/modify.d.ts +2 -0
  36. package/dist/datatypes/transforms/modify.js +7 -0
  37. package/dist/datatypes/transforms/noAdvance.d.ts +16 -0
  38. package/dist/datatypes/transforms/noAdvance.js +30 -0
  39. package/dist/datatypes/transforms/pipe.js +12 -0
  40. package/dist/datatypes/utilities/remember.d.ts +11 -1
  41. package/dist/datatypes/utilities/remember.js +15 -5
  42. package/dist/datatypes/utilities/remember.test.js +44 -0
  43. package/dist/datatypes/utils.test.d.ts +2 -1
  44. package/dist/datatypes/utils.test.js +6 -2
  45. package/dist/datatypes/values/byteliteral.d.ts +1 -1
  46. package/dist/datatypes/values/byteliteral.js +1 -1
  47. package/dist/datatypes/values/bytes.d.ts +9 -0
  48. package/dist/datatypes/values/{buffer.js → bytes.js} +8 -1
  49. package/dist/datatypes/values/bytes.test.d.ts +1 -0
  50. package/dist/datatypes/values/{buffer.test.js → bytes.test.js} +6 -6
  51. package/dist/index.d.ts +1 -1
  52. package/dist/index.js +1 -1
  53. package/dist/read.d.ts +1 -1
  54. package/dist/write.d.ts +1 -1
  55. package/dist/write.js +5 -7
  56. package/package.json +1 -1
  57. package/dist/datatypes/containers/sizedbuffer.d.ts +0 -2
  58. package/dist/datatypes/transforms/pipe.test.js +0 -13
  59. package/dist/datatypes/transforms/readOffset.d.ts +0 -2
  60. package/dist/datatypes/transforms/transform.d.ts +0 -2
  61. package/dist/datatypes/transforms/transform.js +0 -13
  62. package/dist/datatypes/utilities/constant.d.ts +0 -2
  63. package/dist/datatypes/utilities/constant.js +0 -13
  64. package/dist/datatypes/values/buffer.d.ts +0 -2
  65. /package/dist/datatypes/containers/{sizedbuffer.test.d.ts → exhuastiveArray.test.d.ts} +0 -0
  66. /package/dist/datatypes/{lazy.d.ts → containers/fastObject.test.d.ts} +0 -0
  67. /package/dist/datatypes/{lazy.js → containers/sizedbytes.test.d.ts} +0 -0
  68. /package/dist/datatypes/{values → containers}/string.d.ts +0 -0
  69. /package/dist/datatypes/{values → containers}/string.test.d.ts +0 -0
  70. /package/dist/datatypes/{transforms/pipe.test.d.ts → containers/taggedUnion.test.d.ts} +0 -0
  71. /package/dist/datatypes/{values/buffer.test.d.ts → utilities/remember.test.d.ts} +0 -0
@@ -1,71 +1,73 @@
1
1
  //@ts-ignore TODO
2
2
  import { describe, it, expect } from "bun:test";
3
- import { expectEncode, expectEncodeSnapshot, expectError, randint } from "../utils.test";
3
+ import { expectEncode, expectEncodeSize, } from "../utils.test";
4
4
  import * as st from "../../index";
5
- function test_sint(options) {
6
- const { name, range: [start, end], serializer, size, } = options;
5
+ function test_float(options) {
6
+ const { name, serializer, size } = options;
7
+ const expectEncodeApproximately = (value) => {
8
+ const data = st.write(serializer, value);
9
+ const newValue = st.read(serializer, data);
10
+ if (isNaN(value) && isNaN(newValue))
11
+ return;
12
+ if (value === newValue)
13
+ return;
14
+ if (Math.abs(value - newValue) < 0.000001)
15
+ return;
16
+ expect(false, "Failed comparsion tests");
17
+ };
7
18
  describe(name, () => {
8
19
  it(`works in bounds`, () => {
9
- expectEncode(serializer, start);
10
20
  for (let i = 0; i < 100; i++) {
11
- expectEncode(serializer, randint(start, end));
21
+ expectEncodeApproximately(Math.random());
12
22
  }
13
- expectEncode(serializer, end);
14
23
  });
15
- it(`errors outside bounds`, () => {
16
- expectError(() => st.write(serializer, start - 1));
17
- expectError(() => st.write(serializer, end + 1));
24
+ it(`works on Infinty`, () => {
25
+ expectEncode(serializer, Infinity);
26
+ expectEncode(serializer, -Infinity);
18
27
  });
19
- it(`errors on decimal`, () => {
20
- expectError(() => st.write(serializer, 0.1));
28
+ it(`works on NaN`, () => {
29
+ expectEncode(serializer, NaN);
30
+ });
31
+ it(`works on 0`, () => {
32
+ expectEncode(serializer, 0);
33
+ });
34
+ it(`works on -0`, () => {
35
+ expectEncode(serializer, -0);
21
36
  });
22
37
  it(`is right size`, () => {
23
- const expectValueSize = (value) => {
24
- const data = st.write(serializer, value);
25
- expect(data.byteLength).toBe(size);
26
- };
27
38
  for (let i = 0; i < 100; i++) {
28
- expectValueSize(randint(start, end));
39
+ expectEncodeSize(serializer, size, Math.random());
29
40
  }
30
- expectValueSize(start);
31
- expectValueSize(end);
32
- });
33
- it(`matches snapshots`, () => {
34
- expectEncodeSnapshot(serializer, 0);
35
- expectEncodeSnapshot(serializer, start);
36
- expectEncodeSnapshot(serializer, start + 10);
37
- expectEncodeSnapshot(serializer, end - 10);
38
- expectEncodeSnapshot(serializer, end);
39
41
  });
40
42
  });
41
43
  }
42
- test_sint({
43
- name: "st.s8",
44
- serializer: st.s8(),
45
- range: [-128, 127],
46
- size: 1,
47
- });
48
- test_sint({
49
- name: "st.s16(little)",
50
- serializer: st.s16("little"),
51
- range: [-32_768, 32_767],
44
+ test_float({
45
+ name: "st.f16(little)",
46
+ serializer: st.f16("little"),
52
47
  size: 2,
53
48
  });
54
- test_sint({
55
- name: "st.s16(big)",
56
- serializer: st.s16("big"),
57
- range: [-32_768, 32_767],
49
+ test_float({
50
+ name: "st.f16(big)",
51
+ serializer: st.f16("big"),
58
52
  size: 2,
59
53
  });
60
- test_sint({
61
- name: "st.s32(little)",
62
- serializer: st.s32("little"),
63
- range: [-2_147_483_648, 2_147_483_647],
54
+ test_float({
55
+ name: "st.f32(little)",
56
+ serializer: st.f32("little"),
64
57
  size: 4,
65
58
  });
66
- test_sint({
67
- name: "st.s32(big)",
68
- serializer: st.s32("big"),
69
- range: [-2_147_483_648, 2_147_483_647],
59
+ test_float({
60
+ name: "st.f32(big)",
61
+ serializer: st.f32("big"),
70
62
  size: 4,
71
63
  });
64
+ test_float({
65
+ name: "st.f64(little)",
66
+ serializer: st.f64("little"),
67
+ size: 8,
68
+ });
69
+ test_float({
70
+ name: "st.f64(big)",
71
+ serializer: st.f64("big"),
72
+ size: 8,
73
+ });
@@ -1,5 +1,9 @@
1
1
  import type { Serializer } from "../../types";
2
+ /** 8bit signed integer */
2
3
  export declare function s8(): Serializer<number>;
4
+ /** 16bit signed integer */
3
5
  export declare function s16(endian?: "little" | "big"): Serializer<number>;
6
+ /** 32bit signed integer */
4
7
  export declare function s32(endian?: "little" | "big"): Serializer<number>;
8
+ /** 64bit signed integer */
5
9
  export declare function s64(endian?: "little" | "big"): Serializer<number>;
@@ -6,6 +6,7 @@ const checkValue = (value, start, end) => {
6
6
  throw new Error("Out of Range");
7
7
  }
8
8
  };
9
+ /** 8bit signed integer */
9
10
  export function s8() {
10
11
  return {
11
12
  size: 1,
@@ -22,6 +23,7 @@ export function s8() {
22
23
  },
23
24
  };
24
25
  }
26
+ /** 16bit signed integer */
25
27
  export function s16(endian = "little") {
26
28
  return {
27
29
  size: 2,
@@ -38,6 +40,7 @@ export function s16(endian = "little") {
38
40
  },
39
41
  };
40
42
  }
43
+ /** 32bit signed integer */
41
44
  export function s32(endian = "little") {
42
45
  return {
43
46
  size: 4,
@@ -54,6 +57,7 @@ export function s32(endian = "little") {
54
57
  },
55
58
  };
56
59
  }
60
+ /** 64bit signed integer */
57
61
  export function s64(endian = "little") {
58
62
  return {
59
63
  size: 8,
@@ -1,5 +1,9 @@
1
1
  import type { Serializer } from "../../types";
2
+ /** 8bit unsigned integer */
2
3
  export declare function u8(): Serializer<number>;
4
+ /** 16bit unsigned integer */
3
5
  export declare function u16(endian?: "little" | "big"): Serializer<number>;
6
+ /** 32bit unsigned integer */
4
7
  export declare function u32(endian?: "little" | "big"): Serializer<number>;
8
+ /** 64bit unsigned integer */
5
9
  export declare function u64(endian?: "little" | "big"): Serializer<number>;
@@ -1,3 +1,4 @@
1
+ /** 8bit unsigned integer */
1
2
  export function u8() {
2
3
  return {
3
4
  size: 1,
@@ -17,6 +18,7 @@ export function u8() {
17
18
  },
18
19
  };
19
20
  }
21
+ /** 16bit unsigned integer */
20
22
  export function u16(endian = "little") {
21
23
  return {
22
24
  size: 2,
@@ -36,6 +38,7 @@ export function u16(endian = "little") {
36
38
  },
37
39
  };
38
40
  }
41
+ /** 32bit unsigned integer */
39
42
  export function u32(endian = "little") {
40
43
  return {
41
44
  size: 4,
@@ -55,6 +58,7 @@ export function u32(endian = "little") {
55
58
  },
56
59
  };
57
60
  }
61
+ /** 64bit unsigned integer */
58
62
  export function u64(endian = "little") {
59
63
  return {
60
64
  size: 8,
@@ -0,0 +1,2 @@
1
+ import type { Transform } from "./pipe";
2
+ export declare function encode<TIn, TOut>(encodeTo: (value: TIn) => TOut, encodeFrom: (value: TOut) => TIn): Transform<TOut, TIn>;
@@ -0,0 +1,7 @@
1
+ export function encode(encodeTo, encodeFrom) {
2
+ return (type) => ({
3
+ size: type.size,
4
+ read: (ctx) => encodeTo(type.read(ctx)),
5
+ write: (ctx, value) => type.write(ctx, encodeFrom(value)),
6
+ });
7
+ }
@@ -0,0 +1,2 @@
1
+ import type { Serializer } from "../../types";
2
+ export declare function fixedOffset<T>(delta: number): (type: Serializer<T>) => Serializer<T>;
@@ -1,4 +1,4 @@
1
- export function positionOffset(delta) {
1
+ export function fixedOffset(delta) {
2
2
  return (type) => ({
3
3
  size: type.size,
4
4
  read: (ctx) => {
@@ -0,0 +1,2 @@
1
+ import type { Transform } from "./pipe";
2
+ export declare function modify<T>(callback: (value: T) => T): Transform<T>;
@@ -0,0 +1,7 @@
1
+ export function modify(callback) {
2
+ return (type) => ({
3
+ size: type.size,
4
+ read: (ctx) => callback(type.read(ctx)),
5
+ write: (ctx, value) => type.write(ctx, callback(value)),
6
+ });
7
+ }
@@ -0,0 +1,16 @@
1
+ import type { Serializer } from "../../types";
2
+ /**
3
+ * Whilst reading this type, don't advance the offset after reading
4
+ *
5
+ * This can be useful for taggedUnions where they key is the first value in all the variants
6
+ *
7
+ * ```
8
+ * st.object({
9
+ * stringLength: st.pipe(
10
+ * st.u16(),
11
+ * st.noAdvance(),
12
+ * ),
13
+ * text: st.string(st.u16()),
14
+ * })
15
+ */
16
+ export declare function noAdvance<T>(): (type: Serializer<T>) => Serializer<T>;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Whilst reading this type, don't advance the offset after reading
3
+ *
4
+ * This can be useful for taggedUnions where they key is the first value in all the variants
5
+ *
6
+ * ```
7
+ * st.object({
8
+ * stringLength: st.pipe(
9
+ * st.u16(),
10
+ * st.noAdvance(),
11
+ * ),
12
+ * text: st.string(st.u16()),
13
+ * })
14
+ */
15
+ export function noAdvance() {
16
+ return (type) => ({
17
+ size: type.size,
18
+ read: (ctx) => {
19
+ let start = ctx.offset;
20
+ const value = type.read(ctx);
21
+ ctx.offset = start;
22
+ return value;
23
+ },
24
+ write: (ctx, value) => {
25
+ let start = ctx.offset;
26
+ type.write(ctx, value);
27
+ ctx.offset = start;
28
+ },
29
+ });
30
+ }
@@ -1,3 +1,15 @@
1
+ /**
2
+ * Pipe lets you chain modification functions together
3
+ * ```
4
+ * st.object({
5
+ * age: st.u32(),
6
+ * ageInMonths: st.pipe(
7
+ * st.u32(),
8
+ * st.modify(v => v * 12),
9
+ * st.offset(-8),
10
+ * )})
11
+ * ```
12
+ */
1
13
  export function pipe(type, ...pipeline) {
2
14
  //@ts-ignore
3
15
  return pipeline.reduce((v, func) => func(v), type);
@@ -1,5 +1,15 @@
1
1
  import type { Serializer } from "../../types";
2
+ /**
3
+ * ```
4
+ * const length = st.createRememberedValue<number>()
5
+ * st.object({
6
+ * length: length.save(st.u32()),
7
+ * type: st.u8(),
8
+ * data: st.sizedBytes(length.load())
9
+ * })
10
+ * ```
11
+ */
2
12
  export declare function createRememberedValue<T>(): {
3
13
  save: (serializer: Serializer<T>) => Serializer<T>;
4
- load: () => Serializer<T>;
14
+ load: (serializer?: Serializer<T>) => Serializer<T>;
5
15
  };
@@ -1,6 +1,16 @@
1
+ /**
2
+ * ```
3
+ * const length = st.createRememberedValue<number>()
4
+ * st.object({
5
+ * length: length.save(st.u32()),
6
+ * type: st.u8(),
7
+ * data: st.sizedBytes(length.load())
8
+ * })
9
+ * ```
10
+ */
1
11
  export function createRememberedValue() {
2
12
  const stack = [];
3
- function store(serializer) {
13
+ function save(serializer) {
4
14
  return {
5
15
  size: serializer.size,
6
16
  read: (ctx) => {
@@ -15,12 +25,12 @@ export function createRememberedValue() {
15
25
  },
16
26
  };
17
27
  }
18
- function load() {
28
+ function load(serializer) {
19
29
  return {
20
- size: 0,
30
+ size: serializer?.size ?? 0,
21
31
  read: () => stack.pop(),
22
- write: () => { },
32
+ write: (ctx) => serializer && serializer.write(ctx, stack.pop()),
23
33
  };
24
34
  }
25
- return { save: store, load: load };
35
+ return { save: save, load: load };
26
36
  }
@@ -0,0 +1,44 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { expectEncode, expectEncodeSnapshot } from "../utils.test";
3
+ import * as st from "../../index";
4
+ describe("st.remember", () => {
5
+ const v = st.createRememberedValue();
6
+ it("encodes correctly", () => {
7
+ const spec = st.object({
8
+ a: v.save(st.u32()),
9
+ b: st.list(v.load(), st.u8()),
10
+ });
11
+ expectEncode(spec, {
12
+ a: 3,
13
+ b: [1, 3, 4],
14
+ });
15
+ });
16
+ it("omitted serializer doesn't write data ", () => {
17
+ const spec = st.object({
18
+ a: v.save(st.u32()),
19
+ b: v.load(),
20
+ });
21
+ const output = st.write(spec, { a: 3, b: 0 });
22
+ expect(output.byteLength).toBe(4);
23
+ });
24
+ it("serializer is used write data ", () => {
25
+ const spec = st.object({
26
+ a: v.save(st.u32()),
27
+ b: v.load(st.u8()),
28
+ });
29
+ expectEncode(spec, { a: 3, b: 0 }, { a: 3, b: 3 });
30
+ });
31
+ it("snapshots are correct", () => {
32
+ expectEncodeSnapshot(st.object({
33
+ a: v.save(st.u32()),
34
+ b: st.list(v.load(), st.u8()),
35
+ }), {
36
+ a: 3,
37
+ b: [1, 3, 4],
38
+ });
39
+ expectEncodeSnapshot(st.object({
40
+ a: v.save(st.u32()),
41
+ b: v.load(st.u8()),
42
+ }), { a: 3, b: 0 });
43
+ });
44
+ });
@@ -1,7 +1,8 @@
1
1
  import * as st from "../index";
2
2
  export declare const randint: (start: number, end: number) => number;
3
3
  export declare const randbigint: (start: bigint, end: bigint) => bigint;
4
- export declare const expectEncode: <T>(serializer: st.Serializer<T>, value: T) => void;
4
+ export declare const expectEncode: <TIn, TOut>(serializer: st.Serializer<TIn, TOut>, value: TIn, expected?: TOut) => void;
5
+ export declare const expectEncodeSize: <TIn, TOut>(serializer: st.Serializer<TIn, TOut>, size: number, value: TIn) => void;
5
6
  export declare const expectEncodeSnapshot: <T>(serializer: st.Serializer<T>, value: T) => void;
6
7
  export declare const expectError: (callback: () => void) => void;
7
8
  export declare const bytes: (bytes: number[]) => ArrayBuffer;
@@ -10,10 +10,14 @@ export const randbigint = (start, end) => {
10
10
  const offset = BigInt(Math.floor(Number(range) * Math.random()));
11
11
  return start + offset;
12
12
  };
13
- export const expectEncode = (serializer, value) => {
13
+ export const expectEncode = (serializer, value, expected) => {
14
14
  const data = st.write(serializer, value);
15
15
  const newValue = st.read(serializer, data);
16
- expect(value).toEqual(newValue);
16
+ expect(newValue).toEqual((expected ?? value));
17
+ };
18
+ export const expectEncodeSize = (serializer, size, value) => {
19
+ const data = st.write(serializer, value);
20
+ expect(data.byteLength).toEqual(size);
17
21
  };
18
22
  export const expectEncodeSnapshot = (serializer, value) => {
19
23
  const data = st.write(serializer, value);
@@ -1,2 +1,2 @@
1
1
  import type { Serializer } from "../../types";
2
- export declare function byteLiteral(bytes: number[]): Serializer<number[]>;
2
+ export declare function bytesLiteral(bytes: number[]): Serializer<number[]>;
@@ -1,4 +1,4 @@
1
- export function byteLiteral(bytes) {
1
+ export function bytesLiteral(bytes) {
2
2
  const length = bytes.length;
3
3
  return {
4
4
  size: bytes.length,
@@ -0,0 +1,9 @@
1
+ import type { Serializer } from "../../types";
2
+ /**
3
+ * Fixed length bytes
4
+ *
5
+ * ```
6
+ * st.bytes(4)
7
+ * ```
8
+ */
9
+ export declare function bytes(size: number): Serializer<ArrayBuffer>;
@@ -1,4 +1,11 @@
1
- export function buffer(size) {
1
+ /**
2
+ * Fixed length bytes
3
+ *
4
+ * ```
5
+ * st.bytes(4)
6
+ * ```
7
+ */
8
+ export function bytes(size) {
2
9
  return {
3
10
  size,
4
11
  write: (ctx, value) => {
@@ -0,0 +1 @@
1
+ export {};
@@ -1,18 +1,18 @@
1
1
  import { describe, it } from "bun:test";
2
2
  import { bytes, expectEncode, expectError } from "../utils.test";
3
3
  import * as st from "../../index";
4
- describe("st.buffer", () => {
5
- const buffer = st.buffer(2);
4
+ describe("st.bytes", () => {
5
+ const buffer = st.bytes(2);
6
6
  it("encode correctly", () => {
7
7
  expectEncode(buffer, bytes([1, 2]));
8
8
  });
9
9
  it("encodes empty correctly", () => {
10
- const spec = st.buffer(0);
10
+ const spec = st.bytes(0);
11
11
  expectEncode(spec, bytes([]));
12
12
  });
13
13
  it("holds large data", () => {
14
14
  const size = 1024 * 1024 * 8; // 8MB
15
- const spec = st.buffer(size);
15
+ const spec = st.bytes(size);
16
16
  const data = new Uint8Array(size);
17
17
  data.set([3, 4], 1000);
18
18
  data.set([3, 4], 2000);
@@ -22,7 +22,7 @@ describe("st.buffer", () => {
22
22
  const size = 1024 * 1024 * 8; // 8MB
23
23
  const spec = st.object({
24
24
  before: st.u8(),
25
- data: st.buffer(size),
25
+ data: st.bytes(size),
26
26
  after: st.u8(),
27
27
  });
28
28
  const data = new Uint8Array(size);
@@ -35,7 +35,7 @@ describe("st.buffer", () => {
35
35
  });
36
36
  });
37
37
  it("errors on invalid length", () => {
38
- const spec = st.buffer(5);
38
+ const spec = st.bytes(5);
39
39
  expectError(() => {
40
40
  st.write(spec, bytes([1, 2, 3, 4]));
41
41
  });
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export type { InferInput as Infer, InferInput, InferOutput, ReaderContext, WriterContext, Serializer, } from "./types";
2
- export * from "./datatypes";
2
+ export * from "./datatypes/index";
3
3
  export { read, createReaderContext } from "./read";
4
4
  export { write, createdWriterContext } from "./write";
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export * from "./datatypes";
1
+ export * from "./datatypes/index";
2
2
  export { read, createReaderContext } from "./read";
3
3
  export { write, createdWriterContext } from "./write";
package/dist/read.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { Serializer } from "./types";
2
- export declare function read<T>(serializer: Serializer<T>, buffer: ArrayBuffer): T;
2
+ export declare function read<TIn, TOut>(serializer: Serializer<TIn, TOut>, buffer: ArrayBuffer): TOut;
3
3
  export declare function createReaderContext(buffer: ArrayBuffer): {
4
4
  offset: number;
5
5
  buffer: ArrayBuffer;
package/dist/write.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  import type { WriterContext, Serializer } from "./types";
2
- export declare function write<T>(serializer: Serializer<T>, value: T): ArrayBuffer;
2
+ export declare function write<TIn, TOut>(serializer: Serializer<TIn, TOut>, value: TIn): ArrayBuffer;
3
3
  export declare function createdWriterContext(type: Serializer<any>): WriterContext;
package/dist/write.js CHANGED
@@ -20,8 +20,8 @@ export function createdWriterContext(type) {
20
20
  };
21
21
  }
22
22
  else {
23
- let bufferLength = 128;
24
- let buffer = new ArrayBuffer(bufferLength, { maxByteLength: 1024 });
23
+ let bufferLength = 64;
24
+ let buffer = new ArrayBuffer(bufferLength);
25
25
  const view = new DataView(buffer);
26
26
  return {
27
27
  offset: 0,
@@ -30,11 +30,9 @@ export function createdWriterContext(type) {
30
30
  alloc(length) {
31
31
  if (length < 0)
32
32
  return;
33
- if (buffer.resizable) {
34
- }
35
- while (this.offset + length > bufferLength) {
36
- bufferLength = bufferLength * 2;
37
- this.buffer.resize(bufferLength);
33
+ while (this.offset + length >= bufferLength) {
34
+ bufferLength = this.buffer.byteLength * 2;
35
+ this.buffer = this.buffer.transfer(bufferLength);
38
36
  this.view = new DataView(this.buffer);
39
37
  }
40
38
  },
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.3",
6
+ "version": "1.0.5",
7
7
  "author": "Ben Brady",
8
8
  "private": false,
9
9
  "publishConfig": {"access": "public"},
@@ -1,2 +0,0 @@
1
- import type { Serializer } from "../../types";
2
- export declare function sizedBuffer(length: Serializer<number>): Serializer<ArrayBuffer>;
@@ -1,13 +0,0 @@
1
- import { describe, it } from "bun:test";
2
- import { bytes, expectEncode } from "../utils.test";
3
- import * as st from "../../index";
4
- describe("st.pipe", () => {
5
- it("applies correctly", () => {
6
- const buffer = st.sizedBuffer(st.u8());
7
- expectEncode(buffer, bytes([1, 2]));
8
- });
9
- it("runs in correct order", () => {
10
- const spec = st.sizedBuffer(st.u8());
11
- expectEncode(spec, bytes([]));
12
- });
13
- });
@@ -1,2 +0,0 @@
1
- import type { Serializer } from "../../types";
2
- export declare function positionOffset<T>(delta: number): (type: Serializer<T>) => Serializer<T>;
@@ -1,2 +0,0 @@
1
- import type { Serializer } from "../../types";
2
- export declare function transform<T>(callback: (value: T) => T): (type: Serializer<T>) => Serializer<T>;
@@ -1,13 +0,0 @@
1
- export function transform(callback) {
2
- return (type) => ({
3
- size: type.size,
4
- read: (ctx) => {
5
- const value = type.read(ctx);
6
- return callback(value);
7
- },
8
- write: (ctx, value) => {
9
- let outValue = callback(value);
10
- type.write(ctx, outValue);
11
- },
12
- });
13
- }
@@ -1,2 +0,0 @@
1
- import type { Serializer } from "../../types";
2
- export declare function constant<T>(type: Serializer<T>, value: T): Serializer<any, T>;
@@ -1,13 +0,0 @@
1
- export function constant(type, value) {
2
- return {
3
- size: type.size,
4
- read: (ctx) => {
5
- type.read(ctx);
6
- return value;
7
- },
8
- write: (ctx) => {
9
- type.write(ctx, value);
10
- return value;
11
- },
12
- };
13
- }
@@ -1,2 +0,0 @@
1
- import type { Serializer } from "../../types";
2
- export declare function buffer(size: number): Serializer<ArrayBuffer>;