@yume-chan/struct 0.0.23 → 1.0.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.
Files changed (119) hide show
  1. package/CHANGELOG.md +37 -2
  2. package/LICENSE +1 -1
  3. package/README.md +85 -714
  4. package/esm/bipedal.d.ts +5 -0
  5. package/esm/bipedal.d.ts.map +1 -0
  6. package/esm/bipedal.js +31 -0
  7. package/esm/bipedal.js.map +1 -0
  8. package/esm/buffer.d.ts +21 -0
  9. package/esm/buffer.d.ts.map +1 -0
  10. package/esm/buffer.js +173 -0
  11. package/esm/buffer.js.map +1 -0
  12. package/esm/field.d.ts +21 -0
  13. package/esm/field.d.ts.map +1 -0
  14. package/esm/field.js +2 -0
  15. package/esm/field.js.map +1 -0
  16. package/esm/index.d.ts +6 -4
  17. package/esm/index.d.ts.map +1 -1
  18. package/esm/index.js +6 -4
  19. package/esm/index.js.map +1 -1
  20. package/esm/number.d.ts +13 -0
  21. package/esm/number.d.ts.map +1 -0
  22. package/esm/number.js +59 -0
  23. package/esm/number.js.map +1 -0
  24. package/esm/{basic/stream.d.ts → readable.d.ts} +3 -3
  25. package/esm/readable.d.ts.map +1 -0
  26. package/esm/{basic/stream.js → readable.js} +1 -2
  27. package/esm/readable.js.map +1 -0
  28. package/esm/string.d.ts +16 -0
  29. package/esm/string.d.ts.map +1 -0
  30. package/esm/string.js +14 -0
  31. package/esm/string.js.map +1 -0
  32. package/esm/struct.d.ts +24 -127
  33. package/esm/struct.d.ts.map +1 -1
  34. package/esm/struct.js +72 -214
  35. package/esm/struct.js.map +1 -1
  36. package/esm/utils.d.ts +10 -45
  37. package/esm/utils.d.ts.map +1 -1
  38. package/esm/utils.js +12 -11
  39. package/esm/utils.js.map +1 -1
  40. package/package.json +11 -14
  41. package/src/bipedal.ts +55 -0
  42. package/src/buffer.ts +260 -0
  43. package/src/field.ts +27 -0
  44. package/src/index.ts +6 -4
  45. package/src/number.ts +123 -0
  46. package/src/{basic/stream.ts → readable.ts} +3 -4
  47. package/src/string.ts +43 -0
  48. package/src/struct.ts +156 -628
  49. package/src/utils.ts +18 -69
  50. package/tsconfig.build.json +6 -1
  51. package/tsconfig.build.tsbuildinfo +1 -1
  52. package/CHANGELOG.json +0 -161
  53. package/esm/basic/definition.d.ts +0 -44
  54. package/esm/basic/definition.d.ts.map +0 -1
  55. package/esm/basic/definition.js +0 -24
  56. package/esm/basic/definition.js.map +0 -1
  57. package/esm/basic/field-value.d.ts +0 -39
  58. package/esm/basic/field-value.d.ts.map +0 -1
  59. package/esm/basic/field-value.js +0 -46
  60. package/esm/basic/field-value.js.map +0 -1
  61. package/esm/basic/index.d.ts +0 -6
  62. package/esm/basic/index.d.ts.map +0 -1
  63. package/esm/basic/index.js +0 -6
  64. package/esm/basic/index.js.map +0 -1
  65. package/esm/basic/options.d.ts +0 -10
  66. package/esm/basic/options.d.ts.map +0 -1
  67. package/esm/basic/options.js +0 -4
  68. package/esm/basic/options.js.map +0 -1
  69. package/esm/basic/stream.d.ts.map +0 -1
  70. package/esm/basic/stream.js.map +0 -1
  71. package/esm/basic/struct-value.d.ts +0 -26
  72. package/esm/basic/struct-value.d.ts.map +0 -1
  73. package/esm/basic/struct-value.js +0 -57
  74. package/esm/basic/struct-value.js.map +0 -1
  75. package/esm/sync-promise.d.ts +0 -13
  76. package/esm/sync-promise.d.ts.map +0 -1
  77. package/esm/sync-promise.js +0 -71
  78. package/esm/sync-promise.js.map +0 -1
  79. package/esm/types/bigint.d.ts +0 -26
  80. package/esm/types/bigint.d.ts.map +0 -1
  81. package/esm/types/bigint.js +0 -47
  82. package/esm/types/bigint.js.map +0 -1
  83. package/esm/types/buffer/base.d.ts +0 -65
  84. package/esm/types/buffer/base.d.ts.map +0 -1
  85. package/esm/types/buffer/base.js +0 -101
  86. package/esm/types/buffer/base.js.map +0 -1
  87. package/esm/types/buffer/fixed-length.d.ts +0 -9
  88. package/esm/types/buffer/fixed-length.d.ts.map +0 -1
  89. package/esm/types/buffer/fixed-length.js +0 -7
  90. package/esm/types/buffer/fixed-length.js.map +0 -1
  91. package/esm/types/buffer/index.d.ts +0 -4
  92. package/esm/types/buffer/index.d.ts.map +0 -1
  93. package/esm/types/buffer/index.js +0 -4
  94. package/esm/types/buffer/index.js.map +0 -1
  95. package/esm/types/buffer/variable-length.d.ts +0 -45
  96. package/esm/types/buffer/variable-length.d.ts.map +0 -1
  97. package/esm/types/buffer/variable-length.js +0 -76
  98. package/esm/types/buffer/variable-length.js.map +0 -1
  99. package/esm/types/index.d.ts +0 -4
  100. package/esm/types/index.d.ts.map +0 -1
  101. package/esm/types/index.js +0 -4
  102. package/esm/types/index.js.map +0 -1
  103. package/esm/types/number.d.ts +0 -28
  104. package/esm/types/number.d.ts.map +0 -1
  105. package/esm/types/number.js +0 -111
  106. package/esm/types/number.js.map +0 -1
  107. package/src/basic/definition.ts +0 -68
  108. package/src/basic/field-value.ts +0 -75
  109. package/src/basic/index.ts +0 -5
  110. package/src/basic/options.ts +0 -19
  111. package/src/basic/struct-value.ts +0 -67
  112. package/src/sync-promise.ts +0 -134
  113. package/src/types/bigint.ts +0 -121
  114. package/src/types/buffer/base.ts +0 -197
  115. package/src/types/buffer/fixed-length.ts +0 -17
  116. package/src/types/buffer/index.ts +0 -3
  117. package/src/types/buffer/variable-length.ts +0 -174
  118. package/src/types/index.ts +0 -3
  119. package/src/types/number.ts +0 -173
@@ -1,4 +0,0 @@
1
- export * from "./bigint.js";
2
- export * from "./buffer/index.js";
3
- export * from "./number.js";
4
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
@@ -1,4 +0,0 @@
1
- export * from "./bigint.js";
2
- export * from "./buffer/index.js";
3
- export * from "./number.js";
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
@@ -1,28 +0,0 @@
1
- import type { AsyncExactReadable, ExactReadable, StructOptions, StructValue } from "../basic/index.js";
2
- import { StructFieldDefinition, StructFieldValue } from "../basic/index.js";
3
- export interface NumberFieldType {
4
- signed: boolean;
5
- size: number;
6
- deserialize(array: Uint8Array, littleEndian: boolean): number;
7
- serialize(dataView: DataView, offset: number, value: number, littleEndian: boolean): void;
8
- }
9
- export declare namespace NumberFieldType {
10
- const Uint8: NumberFieldType;
11
- const Int8: NumberFieldType;
12
- const Uint16: NumberFieldType;
13
- const Int16: NumberFieldType;
14
- const Uint32: NumberFieldType;
15
- const Int32: NumberFieldType;
16
- }
17
- export declare class NumberFieldDefinition<TType extends NumberFieldType = NumberFieldType, TTypeScriptType = number> extends StructFieldDefinition<void, TTypeScriptType> {
18
- readonly type: TType;
19
- constructor(type: TType, typescriptType?: TTypeScriptType);
20
- getSize(): number;
21
- create(options: Readonly<StructOptions>, struct: StructValue, value: TTypeScriptType): NumberFieldValue<this>;
22
- deserialize(options: Readonly<StructOptions>, stream: ExactReadable, struct: StructValue): NumberFieldValue<this>;
23
- deserialize(options: Readonly<StructOptions>, stream: AsyncExactReadable, struct: StructValue): Promise<NumberFieldValue<this>>;
24
- }
25
- export declare class NumberFieldValue<TDefinition extends NumberFieldDefinition<NumberFieldType, any>> extends StructFieldValue<TDefinition> {
26
- serialize(dataView: DataView, offset: number): void;
27
- }
28
- //# sourceMappingURL=number.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,WAAW,EACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI5E,MAAM,WAAW,eAAe;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,GAAG,MAAM,CAAC;IAC9D,SAAS,CACL,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,OAAO,GACtB,IAAI,CAAC;CACX;AAED,yBAAiB,eAAe,CAAC;IACtB,MAAM,KAAK,EAAE,eASnB,CAAC;IAEK,MAAM,IAAI,EAAE,eAUlB,CAAC;IAEK,MAAM,MAAM,EAAE,eAcpB,CAAC;IAEK,MAAM,KAAK,EAAE,eAUnB,CAAC;IAEK,MAAM,MAAM,EAAE,eAUpB,CAAC;IAEK,MAAM,KAAK,EAAE,eAmBnB,CAAC;CACL;AAED,qBAAa,qBAAqB,CAC9B,KAAK,SAAS,eAAe,GAAG,eAAe,EAC/C,eAAe,GAAG,MAAM,CAC1B,SAAQ,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC;IAClD,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;gBAET,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,EAAE,eAAe;IAMzD,OAAO,IAAI,MAAM;IAIjB,MAAM,CACF,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EAChC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,eAAe,GACvB,gBAAgB,CAAC,IAAI,CAAC;IAIhB,WAAW,CAChB,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EAChC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GACpB,gBAAgB,CAAC,IAAI,CAAC;IAChB,WAAW,CAChB,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EAChC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;CAkBrC;AAED,qBAAa,gBAAgB,CACzB,WAAW,SAAS,qBAAqB,CAAC,eAAe,EAAE,GAAG,CAAC,CACjE,SAAQ,gBAAgB,CAAC,WAAW,CAAC;IACnC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAQtD"}
@@ -1,111 +0,0 @@
1
- import { StructFieldDefinition, StructFieldValue } from "../basic/index.js";
2
- import { SyncPromise } from "../sync-promise.js";
3
- export var NumberFieldType;
4
- (function (NumberFieldType) {
5
- NumberFieldType.Uint8 = {
6
- signed: false,
7
- size: 1,
8
- deserialize(array) {
9
- return array[0];
10
- },
11
- serialize(dataView, offset, value) {
12
- dataView.setUint8(offset, value);
13
- },
14
- };
15
- NumberFieldType.Int8 = {
16
- signed: true,
17
- size: 1,
18
- deserialize(array) {
19
- const value = NumberFieldType.Uint8.deserialize(array, false);
20
- return (value << 24) >> 24;
21
- },
22
- serialize(dataView, offset, value) {
23
- dataView.setInt8(offset, value);
24
- },
25
- };
26
- NumberFieldType.Uint16 = {
27
- signed: false,
28
- size: 2,
29
- deserialize(array, littleEndian) {
30
- // PERF: Creating many `DataView`s over small buffers is 90% slower
31
- // than this. Even if the `DataView` is cached, `DataView#getUint16`
32
- // is still 1% slower than this.
33
- const a = (array[1] << 8) | array[0];
34
- const b = (array[0] << 8) | array[1];
35
- return littleEndian ? a : b;
36
- },
37
- serialize(dataView, offset, value, littleEndian) {
38
- dataView.setUint16(offset, value, littleEndian);
39
- },
40
- };
41
- NumberFieldType.Int16 = {
42
- signed: true,
43
- size: 2,
44
- deserialize(array, littleEndian) {
45
- const value = NumberFieldType.Uint16.deserialize(array, littleEndian);
46
- return (value << 16) >> 16;
47
- },
48
- serialize(dataView, offset, value, littleEndian) {
49
- dataView.setInt16(offset, value, littleEndian);
50
- },
51
- };
52
- NumberFieldType.Uint32 = {
53
- signed: false,
54
- size: 4,
55
- deserialize(array, littleEndian) {
56
- const value = NumberFieldType.Int32.deserialize(array, littleEndian);
57
- return value >>> 0;
58
- },
59
- serialize(dataView, offset, value, littleEndian) {
60
- dataView.setUint32(offset, value, littleEndian);
61
- },
62
- };
63
- NumberFieldType.Int32 = {
64
- signed: true,
65
- size: 4,
66
- deserialize(array, littleEndian) {
67
- const a = (array[3] << 24) |
68
- (array[2] << 16) |
69
- (array[1] << 8) |
70
- array[0];
71
- const b = (array[0] << 24) |
72
- (array[1] << 16) |
73
- (array[2] << 8) |
74
- array[3];
75
- return littleEndian ? a : b;
76
- },
77
- serialize(dataView, offset, value, littleEndian) {
78
- dataView.setInt32(offset, value, littleEndian);
79
- },
80
- };
81
- })(NumberFieldType || (NumberFieldType = {}));
82
- export class NumberFieldDefinition extends StructFieldDefinition {
83
- type;
84
- constructor(type, typescriptType) {
85
- void typescriptType;
86
- super();
87
- this.type = type;
88
- }
89
- getSize() {
90
- return this.type.size;
91
- }
92
- create(options, struct, value) {
93
- return new NumberFieldValue(this, options, struct, value);
94
- }
95
- deserialize(options, stream, struct) {
96
- return SyncPromise.try(() => {
97
- return stream.readExactly(this.getSize());
98
- })
99
- .then((array) => {
100
- const value = this.type.deserialize(array, options.littleEndian);
101
- return this.create(options, struct, value);
102
- })
103
- .valueOrPromise();
104
- }
105
- }
106
- export class NumberFieldValue extends StructFieldValue {
107
- serialize(dataView, offset) {
108
- this.definition.type.serialize(dataView, offset, this.value, this.options.littleEndian);
109
- }
110
- }
111
- //# sourceMappingURL=number.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"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"}
@@ -1,68 +0,0 @@
1
- import type { StructFieldValue } from "./field-value.js";
2
- import type { StructOptions } from "./options.js";
3
- import type { AsyncExactReadable, ExactReadable } from "./stream.js";
4
- import type { StructValue } from "./struct-value.js";
5
-
6
- /**
7
- * A field definition defines how to deserialize a field.
8
- *
9
- * @template TOptions TypeScript type of this definition's `options`.
10
- * @template TValue TypeScript type of this field.
11
- * @template TOmitInitKey Optionally remove some fields from the init type. Should be a union of string literal types.
12
- */
13
- export abstract class StructFieldDefinition<
14
- TOptions = void,
15
- TValue = unknown,
16
- TOmitInitKey extends PropertyKey = never,
17
- > {
18
- /**
19
- * When `T` is a type initiated `StructFieldDefinition`,
20
- * use `T['TValue']` to retrieve its `TValue` type parameter.
21
- */
22
- readonly TValue!: TValue;
23
-
24
- /**
25
- * When `T` is a type initiated `StructFieldDefinition`,
26
- * use `T['TOmitInitKey']` to retrieve its `TOmitInitKey` type parameter.
27
- */
28
- readonly TOmitInitKey!: TOmitInitKey;
29
-
30
- readonly options: TOptions;
31
-
32
- constructor(options: TOptions) {
33
- this.options = options;
34
- }
35
-
36
- /**
37
- * When implemented in derived classes, returns the size (or minimal size if it's dynamic) of this field.
38
- *
39
- * Actual size can be retrieved from `StructFieldValue#getSize`
40
- */
41
- abstract getSize(): number;
42
-
43
- /**
44
- * When implemented in derived classes, creates a `StructFieldValue` from a given `value`.
45
- */
46
- abstract create(
47
- options: Readonly<StructOptions>,
48
- structValue: StructValue,
49
- value: TValue,
50
- ): StructFieldValue<this>;
51
-
52
- /**
53
- * When implemented in derived classes,It must be synchronous (returns a value) or asynchronous (returns a `Promise`) depending
54
- * on the type of `stream`. reads and creates a `StructFieldValue` from `stream`.
55
- *
56
- * `SyncPromise` can be used to simplify implementation.
57
- */
58
- abstract deserialize(
59
- options: Readonly<StructOptions>,
60
- stream: ExactReadable,
61
- structValue: StructValue,
62
- ): StructFieldValue<this>;
63
- abstract deserialize(
64
- options: Readonly<StructOptions>,
65
- stream: AsyncExactReadable,
66
- struct: StructValue,
67
- ): Promise<StructFieldValue<this>>;
68
- }
@@ -1,75 +0,0 @@
1
- import type { StructFieldDefinition } from "./definition.js";
2
- import type { StructOptions } from "./options.js";
3
- import type { StructValue } from "./struct-value.js";
4
-
5
- /**
6
- * A field value defines how to serialize a field.
7
- *
8
- * It may contains extra metadata about the value which are essential or
9
- * helpful for the serialization process.
10
- */
11
- export abstract class StructFieldValue<
12
- TDefinition extends StructFieldDefinition<
13
- any,
14
- any,
15
- any
16
- > = StructFieldDefinition<any, any, any>,
17
- > {
18
- /** Gets the definition associated with this runtime value */
19
- readonly definition: TDefinition;
20
-
21
- /** Gets the options of the associated `Struct` */
22
- readonly options: Readonly<StructOptions>;
23
-
24
- /** Gets the associated `Struct` instance */
25
- readonly struct: StructValue;
26
-
27
- get hasCustomAccessors(): boolean {
28
- return (
29
- this.get !== StructFieldValue.prototype.get ||
30
- this.set !== StructFieldValue.prototype.set
31
- );
32
- }
33
-
34
- protected value: TDefinition["TValue"];
35
-
36
- constructor(
37
- definition: TDefinition,
38
- options: Readonly<StructOptions>,
39
- struct: StructValue,
40
- value: TDefinition["TValue"],
41
- ) {
42
- this.definition = definition;
43
- this.options = options;
44
- this.struct = struct;
45
- this.value = value;
46
- }
47
-
48
- /**
49
- * Gets size of this field. By default, it returns its `definition`'s size.
50
- *
51
- * When overridden in derived classes, can have custom logic to calculate the actual size.
52
- */
53
- getSize(): number {
54
- return this.definition.getSize();
55
- }
56
-
57
- /**
58
- * When implemented in derived classes, reads current field's value.
59
- */
60
- get(): TDefinition["TValue"] {
61
- return this.value;
62
- }
63
-
64
- /**
65
- * When implemented in derived classes, updates current field's value.
66
- */
67
- set(value: TDefinition["TValue"]): void {
68
- this.value = value;
69
- }
70
-
71
- /**
72
- * When implemented in derived classes, serializes this field into `dataView` at `offset`
73
- */
74
- abstract serialize(dataView: DataView, offset: number): void;
75
- }
@@ -1,5 +0,0 @@
1
- export * from "./definition.js";
2
- export * from "./field-value.js";
3
- export * from "./options.js";
4
- export * from "./stream.js";
5
- export * from "./struct-value.js";
@@ -1,19 +0,0 @@
1
- export interface StructOptions {
2
- /**
3
- * Whether all multi-byte fields in this struct are little-endian encoded.
4
- *
5
- * @default false
6
- */
7
- littleEndian: boolean;
8
-
9
- // TODO: StructOptions: investigate whether this is necessary
10
- // I can't think about any other options which need to be struct wide.
11
- // Even endianness can be set on a per-field basis (because it's not meaningful
12
- // for some field types like `Uint8Array`, and very rarely, a struct may contain
13
- // mixed endianness).
14
- // It's just more common and a little more convenient to have it here.
15
- }
16
-
17
- export const StructDefaultOptions: Readonly<StructOptions> = {
18
- littleEndian: false,
19
- };
@@ -1,67 +0,0 @@
1
- import type { StructFieldValue } from "./field-value.js";
2
-
3
- export const STRUCT_VALUE_SYMBOL = Symbol("struct-value");
4
-
5
- /**
6
- * A struct value is a map between keys in a struct and their field values.
7
- */
8
- export class StructValue {
9
- /** @internal */ readonly fieldValues: Record<
10
- PropertyKey,
11
- StructFieldValue
12
- > = {};
13
-
14
- /**
15
- * Gets the result struct value object
16
- */
17
- readonly value: Record<PropertyKey, unknown>;
18
-
19
- constructor(prototype: object) {
20
- // PERF: `Object.create(extra)` is 50% faster
21
- // than `Object.defineProperties(this.value, extra)`
22
- this.value = Object.create(prototype) as Record<PropertyKey, unknown>;
23
-
24
- // PERF: `Object.defineProperty` is slow
25
- // but we need it to be non-enumerable
26
- Object.defineProperty(this.value, STRUCT_VALUE_SYMBOL, {
27
- enumerable: false,
28
- value: this,
29
- });
30
- }
31
-
32
- /**
33
- * Sets a `StructFieldValue` for `key`
34
- *
35
- * @param name The field name
36
- * @param fieldValue The associated `StructFieldValue`
37
- */
38
- set(name: PropertyKey, fieldValue: StructFieldValue): void {
39
- this.fieldValues[name] = fieldValue;
40
-
41
- // PERF: `Object.defineProperty` is slow
42
- // use normal property when possible
43
- if (fieldValue.hasCustomAccessors) {
44
- Object.defineProperty(this.value, name, {
45
- configurable: true,
46
- enumerable: true,
47
- get() {
48
- return fieldValue.get();
49
- },
50
- set(v) {
51
- fieldValue.set(v);
52
- },
53
- });
54
- } else {
55
- this.value[name] = fieldValue.get();
56
- }
57
- }
58
-
59
- /**
60
- * Gets the `StructFieldValue` for `key`
61
- *
62
- * @param name The field name
63
- */
64
- get(name: PropertyKey): StructFieldValue {
65
- return this.fieldValues[name]!;
66
- }
67
- }
@@ -1,134 +0,0 @@
1
- export interface SyncPromise<T> {
2
- then<TResult1 = T, TResult2 = never>(
3
- onfulfilled?:
4
- | ((value: T) => TResult1 | PromiseLike<TResult1>)
5
- | null
6
- | undefined,
7
- onrejected?:
8
- | ((reason: any) => TResult2 | PromiseLike<TResult2>)
9
- | null
10
- | undefined,
11
- ): SyncPromise<TResult1 | TResult2>;
12
-
13
- valueOrPromise(): T | PromiseLike<T>;
14
- }
15
-
16
- interface SyncPromiseStatic {
17
- reject<T = never>(reason?: any): SyncPromise<T>;
18
-
19
- resolve(): SyncPromise<void>;
20
- resolve<T>(value: T | PromiseLike<T>): SyncPromise<T>;
21
-
22
- try<T>(executor: () => T | PromiseLike<T>): SyncPromise<T>;
23
- }
24
-
25
- export const SyncPromise: SyncPromiseStatic = {
26
- reject<T = never>(reason?: any): SyncPromise<T> {
27
- return new RejectedSyncPromise(reason);
28
- },
29
- resolve<T>(value?: T | PromiseLike<T>): SyncPromise<T> {
30
- if (
31
- typeof value === "object" &&
32
- value !== null &&
33
- typeof (value as PromiseLike<T>).then === "function"
34
- ) {
35
- if (
36
- value instanceof PendingSyncPromise ||
37
- value instanceof ResolvedSyncPromise ||
38
- value instanceof RejectedSyncPromise
39
- ) {
40
- return value;
41
- }
42
-
43
- return new PendingSyncPromise(value as PromiseLike<T>);
44
- } else {
45
- return new ResolvedSyncPromise(value as T);
46
- }
47
- },
48
- try<T>(executor: () => T | PromiseLike<T>): SyncPromise<T> {
49
- try {
50
- return SyncPromise.resolve(executor());
51
- } catch (e) {
52
- return SyncPromise.reject(e);
53
- }
54
- },
55
- };
56
-
57
- class PendingSyncPromise<T> implements SyncPromise<T> {
58
- #promise: PromiseLike<T>;
59
-
60
- constructor(promise: PromiseLike<T>) {
61
- this.#promise = promise;
62
- }
63
-
64
- then<TResult1 = T, TResult2 = never>(
65
- onfulfilled?:
66
- | ((value: T) => TResult1 | PromiseLike<TResult1>)
67
- | null
68
- | undefined,
69
- onrejected?:
70
- | ((reason: any) => TResult2 | PromiseLike<TResult2>)
71
- | null
72
- | undefined,
73
- ) {
74
- return new PendingSyncPromise<TResult1 | TResult2>(
75
- this.#promise.then(onfulfilled, onrejected),
76
- );
77
- }
78
-
79
- valueOrPromise(): T | PromiseLike<T> {
80
- return this.#promise;
81
- }
82
- }
83
-
84
- class ResolvedSyncPromise<T> implements SyncPromise<T> {
85
- #value: T;
86
-
87
- constructor(value: T) {
88
- this.#value = value;
89
- }
90
-
91
- then<TResult1 = T>(
92
- onfulfilled?:
93
- | ((value: T) => TResult1 | PromiseLike<TResult1>)
94
- | null
95
- | undefined,
96
- ) {
97
- if (!onfulfilled) {
98
- return this as any;
99
- }
100
- return SyncPromise.try(() => onfulfilled(this.#value));
101
- }
102
-
103
- valueOrPromise(): T | PromiseLike<T> {
104
- return this.#value;
105
- }
106
- }
107
-
108
- class RejectedSyncPromise<T> implements SyncPromise<T> {
109
- #reason: any;
110
-
111
- constructor(reason: any) {
112
- this.#reason = reason;
113
- }
114
-
115
- then<TResult1 = T, TResult2 = never>(
116
- onfulfilled?:
117
- | ((value: T) => TResult1 | PromiseLike<TResult1>)
118
- | null
119
- | undefined,
120
- onrejected?:
121
- | ((reason: any) => TResult2 | PromiseLike<TResult2>)
122
- | null
123
- | undefined,
124
- ) {
125
- if (!onrejected) {
126
- return this as any;
127
- }
128
- return SyncPromise.try(() => onrejected(this.#reason));
129
- }
130
-
131
- valueOrPromise(): T | PromiseLike<T> {
132
- throw this.#reason;
133
- }
134
- }
@@ -1,121 +0,0 @@
1
- import {
2
- getBigInt64,
3
- getBigUint64,
4
- setBigInt64,
5
- setBigUint64,
6
- } from "@yume-chan/dataview-bigint-polyfill/esm/fallback.js";
7
-
8
- import type {
9
- AsyncExactReadable,
10
- ExactReadable,
11
- StructOptions,
12
- StructValue,
13
- } from "../basic/index.js";
14
- import { StructFieldDefinition, StructFieldValue } from "../basic/index.js";
15
- import { SyncPromise } from "../sync-promise.js";
16
- import type { ValueOrPromise } from "../utils.js";
17
-
18
- type DataViewBigInt64Getter = (
19
- dataView: DataView,
20
- byteOffset: number,
21
- littleEndian: boolean | undefined,
22
- ) => bigint;
23
-
24
- type DataViewBigInt64Setter = (
25
- dataView: DataView,
26
- byteOffset: number,
27
- value: bigint,
28
- littleEndian: boolean | undefined,
29
- ) => void;
30
-
31
- export class BigIntFieldType {
32
- readonly TTypeScriptType!: bigint;
33
-
34
- readonly size: number;
35
-
36
- readonly getter: DataViewBigInt64Getter;
37
-
38
- readonly setter: DataViewBigInt64Setter;
39
-
40
- constructor(
41
- size: number,
42
- getter: DataViewBigInt64Getter,
43
- setter: DataViewBigInt64Setter,
44
- ) {
45
- this.size = size;
46
- this.getter = getter;
47
- this.setter = setter;
48
- }
49
-
50
- static readonly Int64 = new BigIntFieldType(8, getBigInt64, setBigInt64);
51
-
52
- static readonly Uint64 = new BigIntFieldType(8, getBigUint64, setBigUint64);
53
- }
54
-
55
- export class BigIntFieldDefinition<
56
- TType extends BigIntFieldType = BigIntFieldType,
57
- TTypeScriptType = TType["TTypeScriptType"],
58
- > extends StructFieldDefinition<void, TTypeScriptType> {
59
- readonly type: TType;
60
-
61
- constructor(type: TType, typescriptType?: TTypeScriptType) {
62
- void typescriptType;
63
- super();
64
- this.type = type;
65
- }
66
-
67
- getSize(): number {
68
- return this.type.size;
69
- }
70
-
71
- create(
72
- options: Readonly<StructOptions>,
73
- struct: StructValue,
74
- value: TTypeScriptType,
75
- ): BigIntFieldValue<this> {
76
- return new BigIntFieldValue(this, options, struct, value);
77
- }
78
-
79
- override deserialize(
80
- options: Readonly<StructOptions>,
81
- stream: ExactReadable,
82
- struct: StructValue,
83
- ): BigIntFieldValue<this>;
84
- override deserialize(
85
- options: Readonly<StructOptions>,
86
- stream: AsyncExactReadable,
87
- struct: StructValue,
88
- ): Promise<BigIntFieldValue<this>>;
89
- override deserialize(
90
- options: Readonly<StructOptions>,
91
- stream: ExactReadable | AsyncExactReadable,
92
- struct: StructValue,
93
- ): ValueOrPromise<BigIntFieldValue<this>> {
94
- return SyncPromise.try(() => {
95
- return stream.readExactly(this.getSize());
96
- })
97
- .then((array) => {
98
- const view = new DataView(
99
- array.buffer,
100
- array.byteOffset,
101
- array.byteLength,
102
- );
103
- const value = this.type.getter(view, 0, options.littleEndian);
104
- return this.create(options, struct, value as any);
105
- })
106
- .valueOrPromise();
107
- }
108
- }
109
-
110
- export class BigIntFieldValue<
111
- TDefinition extends BigIntFieldDefinition<BigIntFieldType, any>,
112
- > extends StructFieldValue<TDefinition> {
113
- serialize(dataView: DataView, offset: number): void {
114
- this.definition.type.setter(
115
- dataView,
116
- offset,
117
- this.value,
118
- this.options.littleEndian,
119
- );
120
- }
121
- }