@yume-chan/struct 0.0.24 → 2.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.
- package/CHANGELOG.md +40 -1
- package/LICENSE +1 -1
- package/README.md +85 -714
- package/esm/bipedal.d.ts +6 -0
- package/esm/bipedal.d.ts.map +1 -0
- package/esm/bipedal.js +38 -0
- package/esm/bipedal.js.map +1 -0
- package/esm/buffer.d.ts +30 -0
- package/esm/buffer.d.ts.map +1 -0
- package/esm/buffer.js +170 -0
- package/esm/buffer.js.map +1 -0
- package/esm/concat.d.ts +13 -0
- package/esm/concat.d.ts.map +1 -0
- package/esm/concat.js +10 -0
- package/esm/concat.js.map +1 -0
- package/esm/extend.d.ts +6 -0
- package/esm/extend.d.ts.map +1 -0
- package/esm/extend.js +10 -0
- package/esm/extend.js.map +1 -0
- package/esm/field/factory.d.ts +13 -0
- package/esm/field/factory.d.ts.map +1 -0
- package/esm/field/factory.js +21 -0
- package/esm/field/factory.js.map +1 -0
- package/esm/field/index.d.ts +4 -0
- package/esm/field/index.d.ts.map +1 -0
- package/esm/field/index.js +4 -0
- package/esm/field/index.js.map +1 -0
- package/esm/field/serialize.d.ts +8 -0
- package/esm/field/serialize.d.ts.map +1 -0
- package/esm/field/serialize.js +33 -0
- package/esm/field/serialize.js.map +1 -0
- package/esm/field/types.d.ts +33 -0
- package/esm/field/types.d.ts.map +1 -0
- package/esm/field/types.js +2 -0
- package/esm/field/types.js.map +1 -0
- package/esm/index.d.ts +9 -4
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +9 -4
- package/esm/index.js.map +1 -1
- package/esm/number.d.ts +13 -0
- package/esm/number.d.ts.map +1 -0
- package/esm/number.js +57 -0
- package/esm/number.js.map +1 -0
- package/esm/{basic/stream.d.ts → readable.d.ts} +9 -3
- package/esm/readable.d.ts.map +1 -0
- package/esm/readable.js +26 -0
- package/esm/readable.js.map +1 -0
- package/esm/string.d.ts +16 -0
- package/esm/string.d.ts.map +1 -0
- package/esm/string.js +13 -0
- package/esm/string.js.map +1 -0
- package/esm/struct.d.ts +22 -140
- package/esm/struct.d.ts.map +1 -1
- package/esm/struct.js +109 -227
- package/esm/struct.js.map +1 -1
- package/esm/types.d.ts +20 -0
- package/esm/types.d.ts.map +1 -0
- package/esm/types.js +2 -0
- package/esm/types.js.map +1 -0
- package/esm/utils.d.ts +10 -45
- package/esm/utils.d.ts.map +1 -1
- package/esm/utils.js +8 -9
- package/esm/utils.js.map +1 -1
- package/package.json +11 -12
- package/src/bipedal.ts +65 -0
- package/src/buffer.ts +334 -0
- package/src/concat.ts +78 -0
- package/src/extend.ts +37 -0
- package/src/field/factory.ts +64 -0
- package/src/field/index.ts +3 -0
- package/src/field/serialize.ts +58 -0
- package/src/field/types.ts +48 -0
- package/src/index.ts +9 -4
- package/src/number.ts +134 -0
- package/src/{basic/stream.ts → readable.ts} +31 -4
- package/src/string.ts +41 -0
- package/src/struct.ts +200 -670
- package/src/types.ts +37 -0
- package/src/utils.ts +14 -67
- package/tsconfig.build.json +6 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/CHANGELOG.json +0 -173
- package/esm/basic/definition.d.ts +0 -44
- package/esm/basic/definition.d.ts.map +0 -1
- package/esm/basic/definition.js +0 -24
- package/esm/basic/definition.js.map +0 -1
- package/esm/basic/field-value.d.ts +0 -39
- package/esm/basic/field-value.d.ts.map +0 -1
- package/esm/basic/field-value.js +0 -46
- package/esm/basic/field-value.js.map +0 -1
- package/esm/basic/index.d.ts +0 -6
- package/esm/basic/index.d.ts.map +0 -1
- package/esm/basic/index.js +0 -6
- package/esm/basic/index.js.map +0 -1
- package/esm/basic/options.d.ts +0 -10
- package/esm/basic/options.d.ts.map +0 -1
- package/esm/basic/options.js +0 -4
- package/esm/basic/options.js.map +0 -1
- package/esm/basic/stream.d.ts.map +0 -1
- package/esm/basic/stream.js +0 -8
- package/esm/basic/stream.js.map +0 -1
- package/esm/basic/struct-value.d.ts +0 -30
- package/esm/basic/struct-value.d.ts.map +0 -1
- package/esm/basic/struct-value.js +0 -62
- package/esm/basic/struct-value.js.map +0 -1
- package/esm/sync-promise.d.ts +0 -13
- package/esm/sync-promise.d.ts.map +0 -1
- package/esm/sync-promise.js +0 -71
- package/esm/sync-promise.js.map +0 -1
- package/esm/types/bigint.d.ts +0 -25
- package/esm/types/bigint.d.ts.map +0 -1
- package/esm/types/bigint.js +0 -46
- package/esm/types/bigint.js.map +0 -1
- package/esm/types/buffer/base.d.ts +0 -69
- package/esm/types/buffer/base.d.ts.map +0 -1
- package/esm/types/buffer/base.js +0 -100
- package/esm/types/buffer/base.js.map +0 -1
- package/esm/types/buffer/fixed-length.d.ts +0 -9
- package/esm/types/buffer/fixed-length.d.ts.map +0 -1
- package/esm/types/buffer/fixed-length.js +0 -7
- package/esm/types/buffer/fixed-length.js.map +0 -1
- package/esm/types/buffer/index.d.ts +0 -4
- package/esm/types/buffer/index.d.ts.map +0 -1
- package/esm/types/buffer/index.js +0 -4
- package/esm/types/buffer/index.js.map +0 -1
- package/esm/types/buffer/variable-length.d.ts +0 -46
- package/esm/types/buffer/variable-length.d.ts.map +0 -1
- package/esm/types/buffer/variable-length.js +0 -87
- package/esm/types/buffer/variable-length.js.map +0 -1
- package/esm/types/index.d.ts +0 -4
- package/esm/types/index.d.ts.map +0 -1
- package/esm/types/index.js +0 -4
- package/esm/types/index.js.map +0 -1
- package/esm/types/number.d.ts +0 -28
- package/esm/types/number.d.ts.map +0 -1
- package/esm/types/number.js +0 -99
- package/esm/types/number.js.map +0 -1
- package/src/basic/definition.ts +0 -68
- package/src/basic/field-value.ts +0 -75
- package/src/basic/index.ts +0 -5
- package/src/basic/options.ts +0 -19
- package/src/basic/struct-value.ts +0 -85
- package/src/sync-promise.ts +0 -134
- package/src/types/bigint.ts +0 -124
- package/src/types/buffer/base.ts +0 -198
- package/src/types/buffer/fixed-length.ts +0 -22
- package/src/types/buffer/index.ts +0 -3
- package/src/types/buffer/variable-length.ts +0 -198
- package/src/types/index.ts +0 -3
- package/src/types/number.ts +0 -166
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
-
import { StructFieldValue } from "../../basic/index.js";
|
|
4
|
-
import { BufferLikeFieldDefinition, BufferLikeFieldValue } from "./base.js";
|
|
5
|
-
export class VariableLengthBufferLikeFieldDefinition extends BufferLikeFieldDefinition {
|
|
6
|
-
getSize() {
|
|
7
|
-
return 0;
|
|
8
|
-
}
|
|
9
|
-
getDeserializeSize(struct) {
|
|
10
|
-
let value = struct.value[this.options.lengthField];
|
|
11
|
-
if (typeof value === "string") {
|
|
12
|
-
value = Number.parseInt(value, this.options.lengthFieldRadix ?? 10);
|
|
13
|
-
}
|
|
14
|
-
return value;
|
|
15
|
-
}
|
|
16
|
-
create(options, struct, value, array) {
|
|
17
|
-
return new VariableLengthBufferLikeStructFieldValue(this, options, struct, value, array);
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
export class VariableLengthBufferLikeStructFieldValue extends BufferLikeFieldValue {
|
|
21
|
-
length;
|
|
22
|
-
lengthFieldValue;
|
|
23
|
-
constructor(definition, options, struct, value, array) {
|
|
24
|
-
super(definition, options, struct, value, array);
|
|
25
|
-
if (array) {
|
|
26
|
-
this.length = array.length;
|
|
27
|
-
}
|
|
28
|
-
// Patch the associated length field.
|
|
29
|
-
const lengthField = this.definition.options.lengthField;
|
|
30
|
-
const originalValue = struct.get(lengthField);
|
|
31
|
-
this.lengthFieldValue = new VariableLengthBufferLikeFieldLengthValue(originalValue, this);
|
|
32
|
-
struct.set(lengthField, this.lengthFieldValue);
|
|
33
|
-
}
|
|
34
|
-
#tryGetSize() {
|
|
35
|
-
const length = this.definition.converter.getSize(this.value);
|
|
36
|
-
if (length !== undefined && length < 0) {
|
|
37
|
-
throw new Error("Invalid length");
|
|
38
|
-
}
|
|
39
|
-
return length;
|
|
40
|
-
}
|
|
41
|
-
getSize() {
|
|
42
|
-
if (this.length === undefined) {
|
|
43
|
-
// first try to get the size from the converter
|
|
44
|
-
this.length = this.#tryGetSize();
|
|
45
|
-
}
|
|
46
|
-
if (this.length === undefined) {
|
|
47
|
-
// The converter doesn't know the size, so convert the value to a buffer to get its size
|
|
48
|
-
this.array = this.definition.converter.toBuffer(this.value);
|
|
49
|
-
this.length = this.array.length;
|
|
50
|
-
}
|
|
51
|
-
return this.length;
|
|
52
|
-
}
|
|
53
|
-
set(value) {
|
|
54
|
-
super.set(value);
|
|
55
|
-
this.array = undefined;
|
|
56
|
-
this.length = undefined;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
export class VariableLengthBufferLikeFieldLengthValue extends StructFieldValue {
|
|
60
|
-
originalValue;
|
|
61
|
-
bufferValue;
|
|
62
|
-
constructor(originalValue, bufferValue) {
|
|
63
|
-
super(originalValue.definition, originalValue.options, originalValue.struct, 0);
|
|
64
|
-
this.originalValue = originalValue;
|
|
65
|
-
this.bufferValue = bufferValue;
|
|
66
|
-
}
|
|
67
|
-
getSize() {
|
|
68
|
-
return this.originalValue.getSize();
|
|
69
|
-
}
|
|
70
|
-
get() {
|
|
71
|
-
let value = this.bufferValue.getSize();
|
|
72
|
-
const originalValue = this.originalValue.get();
|
|
73
|
-
if (typeof originalValue === "string") {
|
|
74
|
-
value = value.toString(this.bufferValue.definition.options.lengthFieldRadix ?? 10);
|
|
75
|
-
}
|
|
76
|
-
return value;
|
|
77
|
-
}
|
|
78
|
-
set() {
|
|
79
|
-
// Ignore setting
|
|
80
|
-
// It will always be in sync with the buffer size
|
|
81
|
-
}
|
|
82
|
-
serialize(dataView, array, offset) {
|
|
83
|
-
this.originalValue.set(this.get());
|
|
84
|
-
this.originalValue.serialize(dataView, array, offset);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
//# sourceMappingURL=variable-length.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"variable-length.js","sourceRoot":"","sources":["../../../src/types/buffer/variable-length.ts"],"names":[],"mappings":"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"}
|
package/esm/types/index.d.ts
DELETED
package/esm/types/index.d.ts.map
DELETED
|
@@ -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"}
|
package/esm/types/index.js
DELETED
package/esm/types/index.js.map
DELETED
|
@@ -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"}
|
package/esm/types/number.d.ts
DELETED
|
@@ -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 NumberFieldVariant {
|
|
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 NumberFieldVariant {
|
|
10
|
-
const Uint8: NumberFieldVariant;
|
|
11
|
-
const Int8: NumberFieldVariant;
|
|
12
|
-
const Uint16: NumberFieldVariant;
|
|
13
|
-
const Int16: NumberFieldVariant;
|
|
14
|
-
const Uint32: NumberFieldVariant;
|
|
15
|
-
const Int32: NumberFieldVariant;
|
|
16
|
-
}
|
|
17
|
-
export declare class NumberFieldDefinition<TVariant extends NumberFieldVariant = NumberFieldVariant, TTypeScriptType = number> extends StructFieldDefinition<void, TTypeScriptType> {
|
|
18
|
-
readonly variant: TVariant;
|
|
19
|
-
constructor(variant: TVariant, 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<NumberFieldVariant, unknown>> extends StructFieldValue<TDefinition> {
|
|
26
|
-
serialize(dataView: DataView, array: Uint8Array, 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":"AAQA,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,kBAAkB;IAC/B,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,kBAAkB,CAAC;IACzB,MAAM,KAAK,EAAE,kBASnB,CAAC;IAEK,MAAM,IAAI,EAAE,kBASlB,CAAC;IAEK,MAAM,MAAM,EAAE,kBAYpB,CAAC;IAEK,MAAM,KAAK,EAAE,kBASnB,CAAC;IAEK,MAAM,MAAM,EAAE,kBASpB,CAAC;IAEK,MAAM,KAAK,EAAE,kBASnB,CAAC;CACL;AAED,qBAAa,qBAAqB,CAC9B,QAAQ,SAAS,kBAAkB,GAAG,kBAAkB,EACxD,eAAe,GAAG,MAAM,CAC1B,SAAQ,qBAAqB,CAAC,IAAI,EAAE,eAAe,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;gBAEf,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,eAAe;IAM/D,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,kBAAkB,EAAE,OAAO,CAAC,CACxE,SAAQ,gBAAgB,CAAC,WAAW,CAAC;IACnC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAQzE"}
|
package/esm/types/number.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { getInt16, getInt32, getInt8, getUint16, getUint32, } from "@yume-chan/no-data-view";
|
|
2
|
-
import { StructFieldDefinition, StructFieldValue } from "../basic/index.js";
|
|
3
|
-
import { SyncPromise } from "../sync-promise.js";
|
|
4
|
-
export var NumberFieldVariant;
|
|
5
|
-
(function (NumberFieldVariant) {
|
|
6
|
-
NumberFieldVariant.Uint8 = {
|
|
7
|
-
signed: false,
|
|
8
|
-
size: 1,
|
|
9
|
-
deserialize(array) {
|
|
10
|
-
return array[0];
|
|
11
|
-
},
|
|
12
|
-
serialize(dataView, offset, value) {
|
|
13
|
-
dataView.setUint8(offset, value);
|
|
14
|
-
},
|
|
15
|
-
};
|
|
16
|
-
NumberFieldVariant.Int8 = {
|
|
17
|
-
signed: true,
|
|
18
|
-
size: 1,
|
|
19
|
-
deserialize(array) {
|
|
20
|
-
return getInt8(array, 0);
|
|
21
|
-
},
|
|
22
|
-
serialize(dataView, offset, value) {
|
|
23
|
-
dataView.setInt8(offset, value);
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
NumberFieldVariant.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
|
-
return getUint16(array, 0, littleEndian);
|
|
34
|
-
},
|
|
35
|
-
serialize(dataView, offset, value, littleEndian) {
|
|
36
|
-
dataView.setUint16(offset, value, littleEndian);
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
NumberFieldVariant.Int16 = {
|
|
40
|
-
signed: true,
|
|
41
|
-
size: 2,
|
|
42
|
-
deserialize(array, littleEndian) {
|
|
43
|
-
return getInt16(array, 0, littleEndian);
|
|
44
|
-
},
|
|
45
|
-
serialize(dataView, offset, value, littleEndian) {
|
|
46
|
-
dataView.setInt16(offset, value, littleEndian);
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
NumberFieldVariant.Uint32 = {
|
|
50
|
-
signed: false,
|
|
51
|
-
size: 4,
|
|
52
|
-
deserialize(array, littleEndian) {
|
|
53
|
-
return getUint32(array, 0, littleEndian);
|
|
54
|
-
},
|
|
55
|
-
serialize(dataView, offset, value, littleEndian) {
|
|
56
|
-
dataView.setUint32(offset, value, littleEndian);
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
NumberFieldVariant.Int32 = {
|
|
60
|
-
signed: true,
|
|
61
|
-
size: 4,
|
|
62
|
-
deserialize(array, littleEndian) {
|
|
63
|
-
return getInt32(array, 0, littleEndian);
|
|
64
|
-
},
|
|
65
|
-
serialize(dataView, offset, value, littleEndian) {
|
|
66
|
-
dataView.setInt32(offset, value, littleEndian);
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
})(NumberFieldVariant || (NumberFieldVariant = {}));
|
|
70
|
-
export class NumberFieldDefinition extends StructFieldDefinition {
|
|
71
|
-
variant;
|
|
72
|
-
constructor(variant, typescriptType) {
|
|
73
|
-
void typescriptType;
|
|
74
|
-
super();
|
|
75
|
-
this.variant = variant;
|
|
76
|
-
}
|
|
77
|
-
getSize() {
|
|
78
|
-
return this.variant.size;
|
|
79
|
-
}
|
|
80
|
-
create(options, struct, value) {
|
|
81
|
-
return new NumberFieldValue(this, options, struct, value);
|
|
82
|
-
}
|
|
83
|
-
deserialize(options, stream, struct) {
|
|
84
|
-
return SyncPromise.try(() => {
|
|
85
|
-
return stream.readExactly(this.getSize());
|
|
86
|
-
})
|
|
87
|
-
.then((array) => {
|
|
88
|
-
const value = this.variant.deserialize(array, options.littleEndian);
|
|
89
|
-
return this.create(options, struct, value);
|
|
90
|
-
})
|
|
91
|
-
.valueOrPromise();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
export class NumberFieldValue extends StructFieldValue {
|
|
95
|
-
serialize(dataView, array, offset) {
|
|
96
|
-
this.definition.variant.serialize(dataView, offset, this.value, this.options.littleEndian);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=number.js.map
|
package/esm/types/number.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"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"}
|
package/src/basic/definition.ts
DELETED
|
@@ -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
|
-
}
|
package/src/basic/field-value.ts
DELETED
|
@@ -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<unknown, unknown, PropertyKey>,
|
|
13
|
-
> {
|
|
14
|
-
/** Gets the definition associated with this runtime value */
|
|
15
|
-
readonly definition: TDefinition;
|
|
16
|
-
|
|
17
|
-
/** Gets the options of the associated `Struct` */
|
|
18
|
-
readonly options: Readonly<StructOptions>;
|
|
19
|
-
|
|
20
|
-
/** Gets the associated `Struct` instance */
|
|
21
|
-
readonly struct: StructValue;
|
|
22
|
-
|
|
23
|
-
get hasCustomAccessors(): boolean {
|
|
24
|
-
return (
|
|
25
|
-
this.get !== StructFieldValue.prototype.get ||
|
|
26
|
-
this.set !== StructFieldValue.prototype.set
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
protected value: TDefinition["TValue"];
|
|
31
|
-
|
|
32
|
-
constructor(
|
|
33
|
-
definition: TDefinition,
|
|
34
|
-
options: Readonly<StructOptions>,
|
|
35
|
-
struct: StructValue,
|
|
36
|
-
value: TDefinition["TValue"],
|
|
37
|
-
) {
|
|
38
|
-
this.definition = definition;
|
|
39
|
-
this.options = options;
|
|
40
|
-
this.struct = struct;
|
|
41
|
-
this.value = value;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Gets size of this field. By default, it returns its `definition`'s size.
|
|
46
|
-
*
|
|
47
|
-
* When overridden in derived classes, can have custom logic to calculate the actual size.
|
|
48
|
-
*/
|
|
49
|
-
getSize(): number {
|
|
50
|
-
return this.definition.getSize();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* When implemented in derived classes, reads current field's value.
|
|
55
|
-
*/
|
|
56
|
-
get(): TDefinition["TValue"] {
|
|
57
|
-
return this.value as never;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* When implemented in derived classes, updates current field's value.
|
|
62
|
-
*/
|
|
63
|
-
set(value: TDefinition["TValue"]): void {
|
|
64
|
-
this.value = value;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* When implemented in derived classes, serializes this field into `dataView` at `offset`
|
|
69
|
-
*/
|
|
70
|
-
abstract serialize(
|
|
71
|
-
dataView: DataView,
|
|
72
|
-
array: Uint8Array,
|
|
73
|
-
offset: number,
|
|
74
|
-
): void;
|
|
75
|
-
}
|
package/src/basic/index.ts
DELETED
package/src/basic/options.ts
DELETED
|
@@ -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,85 +0,0 @@
|
|
|
1
|
-
import type { StructFieldDefinition } from "./definition.js";
|
|
2
|
-
import type { StructFieldValue } from "./field-value.js";
|
|
3
|
-
|
|
4
|
-
export const STRUCT_VALUE_SYMBOL = Symbol("struct-value");
|
|
5
|
-
|
|
6
|
-
export function isStructValueInit(
|
|
7
|
-
value: unknown,
|
|
8
|
-
): value is { [STRUCT_VALUE_SYMBOL]: StructValue } {
|
|
9
|
-
return (
|
|
10
|
-
typeof value === "object" &&
|
|
11
|
-
value !== null &&
|
|
12
|
-
STRUCT_VALUE_SYMBOL in value
|
|
13
|
-
);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* A struct value is a map between keys in a struct and their field values.
|
|
18
|
-
*/
|
|
19
|
-
export class StructValue {
|
|
20
|
-
/** @internal */ readonly fieldValues: Record<
|
|
21
|
-
PropertyKey,
|
|
22
|
-
StructFieldValue<StructFieldDefinition<unknown, unknown, PropertyKey>>
|
|
23
|
-
> = {};
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Gets the result struct value object
|
|
27
|
-
*/
|
|
28
|
-
readonly value: Record<PropertyKey, unknown>;
|
|
29
|
-
|
|
30
|
-
constructor(prototype: object) {
|
|
31
|
-
// PERF: `Object.create(extra)` is 50% faster
|
|
32
|
-
// than `Object.defineProperties(this.value, extra)`
|
|
33
|
-
this.value = Object.create(prototype) as Record<PropertyKey, unknown>;
|
|
34
|
-
|
|
35
|
-
// PERF: `Object.defineProperty` is slow
|
|
36
|
-
// but we need it to be non-enumerable
|
|
37
|
-
Object.defineProperty(this.value, STRUCT_VALUE_SYMBOL, {
|
|
38
|
-
enumerable: false,
|
|
39
|
-
value: this,
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Sets a `StructFieldValue` for `key`
|
|
45
|
-
*
|
|
46
|
-
* @param name The field name
|
|
47
|
-
* @param fieldValue The associated `StructFieldValue`
|
|
48
|
-
*/
|
|
49
|
-
set(
|
|
50
|
-
name: PropertyKey,
|
|
51
|
-
fieldValue: StructFieldValue<
|
|
52
|
-
StructFieldDefinition<unknown, unknown, PropertyKey>
|
|
53
|
-
>,
|
|
54
|
-
): void {
|
|
55
|
-
this.fieldValues[name] = fieldValue;
|
|
56
|
-
|
|
57
|
-
// PERF: `Object.defineProperty` is slow
|
|
58
|
-
// use normal property when possible
|
|
59
|
-
if (fieldValue.hasCustomAccessors) {
|
|
60
|
-
Object.defineProperty(this.value, name, {
|
|
61
|
-
configurable: true,
|
|
62
|
-
enumerable: true,
|
|
63
|
-
get() {
|
|
64
|
-
return fieldValue.get();
|
|
65
|
-
},
|
|
66
|
-
set(v) {
|
|
67
|
-
fieldValue.set(v);
|
|
68
|
-
},
|
|
69
|
-
});
|
|
70
|
-
} else {
|
|
71
|
-
this.value[name] = fieldValue.get();
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Gets the `StructFieldValue` for `key`
|
|
77
|
-
*
|
|
78
|
-
* @param name The field name
|
|
79
|
-
*/
|
|
80
|
-
get(
|
|
81
|
-
name: PropertyKey,
|
|
82
|
-
): StructFieldValue<StructFieldDefinition<unknown, unknown, PropertyKey>> {
|
|
83
|
-
return this.fieldValues[name]!;
|
|
84
|
-
}
|
|
85
|
-
}
|
package/src/sync-promise.ts
DELETED
|
@@ -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: unknown) => 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?: unknown): 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?: unknown): 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: unknown) => 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 never;
|
|
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: unknown;
|
|
110
|
-
|
|
111
|
-
constructor(reason: unknown) {
|
|
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: unknown) => TResult2 | PromiseLike<TResult2>)
|
|
122
|
-
| null
|
|
123
|
-
| undefined,
|
|
124
|
-
) {
|
|
125
|
-
if (!onrejected) {
|
|
126
|
-
return this as never;
|
|
127
|
-
}
|
|
128
|
-
return SyncPromise.try(() => onrejected(this.#reason));
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
valueOrPromise(): T | PromiseLike<T> {
|
|
132
|
-
throw this.#reason;
|
|
133
|
-
}
|
|
134
|
-
}
|