@yume-chan/struct 0.0.18 → 0.0.20
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.json +27 -0
- package/CHANGELOG.md +16 -1
- package/README.md +126 -143
- package/esm/basic/definition.d.ts +43 -43
- package/esm/basic/definition.d.ts.map +1 -1
- package/esm/basic/definition.js +23 -23
- package/esm/basic/definition.js.map +1 -1
- package/esm/basic/field-value.d.ts +38 -38
- package/esm/basic/field-value.d.ts.map +1 -1
- package/esm/basic/field-value.js +45 -45
- package/esm/basic/index.d.ts +5 -5
- package/esm/basic/index.js +5 -5
- package/esm/basic/options.d.ts +9 -9
- package/esm/basic/options.js +3 -3
- package/esm/basic/stream.d.ts +24 -19
- package/esm/basic/stream.d.ts.map +1 -1
- package/esm/basic/stream.js +7 -1
- package/esm/basic/stream.js.map +1 -1
- package/esm/basic/struct-value.d.ts +25 -25
- package/esm/basic/struct-value.d.ts.map +1 -1
- package/esm/basic/struct-value.js +56 -56
- package/esm/index.d.ts +14 -13
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +6 -5
- package/esm/index.js.map +1 -1
- package/esm/struct.d.ts +140 -129
- package/esm/struct.d.ts.map +1 -1
- package/esm/struct.js +242 -210
- package/esm/struct.js.map +1 -1
- package/esm/sync-promise.d.ts +12 -12
- package/esm/sync-promise.js +70 -70
- package/esm/sync-promise.js.map +1 -1
- package/esm/types/bigint.d.ts +25 -24
- package/esm/types/bigint.d.ts.map +1 -1
- package/esm/types/bigint.js +47 -46
- package/esm/types/bigint.js.map +1 -1
- package/esm/types/buffer/base.d.ts +64 -63
- package/esm/types/buffer/base.d.ts.map +1 -1
- package/esm/types/buffer/base.js +102 -100
- package/esm/types/buffer/base.js.map +1 -1
- package/esm/types/buffer/fixed-length.d.ts +8 -7
- package/esm/types/buffer/fixed-length.d.ts.map +1 -1
- package/esm/types/buffer/fixed-length.js +6 -6
- package/esm/types/buffer/fixed-length.js.map +1 -1
- package/esm/types/buffer/index.d.ts +3 -3
- package/esm/types/buffer/index.js +3 -3
- package/esm/types/buffer/variable-length.d.ts +44 -42
- package/esm/types/buffer/variable-length.d.ts.map +1 -1
- package/esm/types/buffer/variable-length.js +75 -75
- package/esm/types/buffer/variable-length.js.map +1 -1
- package/esm/types/index.d.ts +3 -3
- package/esm/types/index.js +3 -3
- package/esm/types/number.d.ts +27 -26
- package/esm/types/number.d.ts.map +1 -1
- package/esm/types/number.js +111 -113
- package/esm/types/number.js.map +1 -1
- package/esm/utils.d.ts +47 -47
- package/esm/utils.js +15 -15
- package/package.json +9 -8
- package/src/basic/definition.ts +6 -9
- package/src/basic/field-value.ts +3 -3
- package/src/basic/index.ts +5 -5
- package/src/basic/stream.ts +18 -7
- package/src/basic/struct-value.ts +1 -1
- package/src/index.ts +6 -5
- package/src/struct.ts +91 -59
- package/src/sync-promise.ts +12 -12
- package/src/types/bigint.ts +11 -12
- package/src/types/buffer/base.ts +12 -12
- package/src/types/buffer/fixed-length.ts +2 -1
- package/src/types/buffer/variable-length.ts +8 -11
- package/src/types/number.ts +28 -33
- package/tsconfig.build.tsbuildinfo +1 -1
package/esm/types/number.d.ts
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
deserialize(options: Readonly<StructOptions>, stream:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
+
}
|
|
27
28
|
//# sourceMappingURL=number.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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;AAGD,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,SAAgB,IAAI,EAAE,KAAK,CAAC;gBAET,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,EAAE,eAAe;IAMzD,OAAO,IAAI,MAAM;IAIjB,MAAM,CACT,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EAChC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,eAAe,GACvB,gBAAgB,CAAC,IAAI,CAAC;IAIT,WAAW,CACvB,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,EAChC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE,WAAW,GACpB,gBAAgB,CAAC,IAAI,CAAC;IACT,WAAW,CACvB,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;IAC5B,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAQ7D"}
|
package/esm/types/number.js
CHANGED
|
@@ -1,114 +1,112 @@
|
|
|
1
|
-
import { StructFieldDefinition, StructFieldValue
|
|
2
|
-
import { SyncPromise } from "../sync-promise.js";
|
|
3
|
-
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
4
|
-
export var NumberFieldType;
|
|
5
|
-
(function (NumberFieldType) {
|
|
6
|
-
NumberFieldType.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
|
-
NumberFieldType.Int8 = {
|
|
17
|
-
signed: true,
|
|
18
|
-
size: 1,
|
|
19
|
-
deserialize(array) {
|
|
20
|
-
const value = NumberFieldType.Uint8.deserialize(array, false);
|
|
21
|
-
return (value << 24) >> 24;
|
|
22
|
-
},
|
|
23
|
-
serialize(dataView, offset, value) {
|
|
24
|
-
dataView.setInt8(offset, value);
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
NumberFieldType.Uint16 = {
|
|
28
|
-
signed: false,
|
|
29
|
-
size: 2,
|
|
30
|
-
deserialize(array, littleEndian) {
|
|
31
|
-
// PERF:
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
(array[
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
}
|
|
1
|
+
import { StructFieldDefinition, StructFieldValue } from "../basic/index.js";
|
|
2
|
+
import { SyncPromise } from "../sync-promise.js";
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
4
|
+
export var NumberFieldType;
|
|
5
|
+
(function (NumberFieldType) {
|
|
6
|
+
NumberFieldType.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
|
+
NumberFieldType.Int8 = {
|
|
17
|
+
signed: true,
|
|
18
|
+
size: 1,
|
|
19
|
+
deserialize(array) {
|
|
20
|
+
const value = NumberFieldType.Uint8.deserialize(array, false);
|
|
21
|
+
return (value << 24) >> 24;
|
|
22
|
+
},
|
|
23
|
+
serialize(dataView, offset, value) {
|
|
24
|
+
dataView.setInt8(offset, value);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
NumberFieldType.Uint16 = {
|
|
28
|
+
signed: false,
|
|
29
|
+
size: 2,
|
|
30
|
+
deserialize(array, littleEndian) {
|
|
31
|
+
// PERF: Creating many `DataView`s over small buffers is 90% slower
|
|
32
|
+
// than this. Even if the `DataView` is cached, `DataView#getUint16`
|
|
33
|
+
// is still 1% slower than this.
|
|
34
|
+
const a = (array[1] << 8) | array[0];
|
|
35
|
+
const b = (array[0] << 8) | array[1];
|
|
36
|
+
return littleEndian ? a : b;
|
|
37
|
+
},
|
|
38
|
+
serialize(dataView, offset, value, littleEndian) {
|
|
39
|
+
dataView.setUint16(offset, value, littleEndian);
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
NumberFieldType.Int16 = {
|
|
43
|
+
signed: true,
|
|
44
|
+
size: 2,
|
|
45
|
+
deserialize(array, littleEndian) {
|
|
46
|
+
const value = NumberFieldType.Uint16.deserialize(array, littleEndian);
|
|
47
|
+
return (value << 16) >> 16;
|
|
48
|
+
},
|
|
49
|
+
serialize(dataView, offset, value, littleEndian) {
|
|
50
|
+
dataView.setInt16(offset, value, littleEndian);
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
NumberFieldType.Uint32 = {
|
|
54
|
+
signed: false,
|
|
55
|
+
size: 4,
|
|
56
|
+
deserialize(array, littleEndian) {
|
|
57
|
+
const value = NumberFieldType.Int32.deserialize(array, littleEndian);
|
|
58
|
+
return value >>> 0;
|
|
59
|
+
},
|
|
60
|
+
serialize(dataView, offset, value, littleEndian) {
|
|
61
|
+
dataView.setUint32(offset, value, littleEndian);
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
NumberFieldType.Int32 = {
|
|
65
|
+
signed: true,
|
|
66
|
+
size: 4,
|
|
67
|
+
deserialize(array, littleEndian) {
|
|
68
|
+
const a = (array[3] << 24) |
|
|
69
|
+
(array[2] << 16) |
|
|
70
|
+
(array[1] << 8) |
|
|
71
|
+
array[0];
|
|
72
|
+
const b = (array[0] << 24) |
|
|
73
|
+
(array[1] << 16) |
|
|
74
|
+
(array[2] << 8) |
|
|
75
|
+
array[3];
|
|
76
|
+
return littleEndian ? a : b;
|
|
77
|
+
},
|
|
78
|
+
serialize(dataView, offset, value, littleEndian) {
|
|
79
|
+
dataView.setInt32(offset, value, littleEndian);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
})(NumberFieldType = NumberFieldType || (NumberFieldType = {}));
|
|
83
|
+
export class NumberFieldDefinition extends StructFieldDefinition {
|
|
84
|
+
type;
|
|
85
|
+
constructor(type, typescriptType) {
|
|
86
|
+
void typescriptType;
|
|
87
|
+
super();
|
|
88
|
+
this.type = type;
|
|
89
|
+
}
|
|
90
|
+
getSize() {
|
|
91
|
+
return this.type.size;
|
|
92
|
+
}
|
|
93
|
+
create(options, struct, value) {
|
|
94
|
+
return new NumberFieldValue(this, options, struct, value);
|
|
95
|
+
}
|
|
96
|
+
deserialize(options, stream, struct) {
|
|
97
|
+
return SyncPromise.try(() => {
|
|
98
|
+
return stream.readExactly(this.getSize());
|
|
99
|
+
})
|
|
100
|
+
.then((array) => {
|
|
101
|
+
const value = this.type.deserialize(array, options.littleEndian);
|
|
102
|
+
return this.create(options, struct, value);
|
|
103
|
+
})
|
|
104
|
+
.valueOrPromise();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export class NumberFieldValue extends StructFieldValue {
|
|
108
|
+
serialize(dataView, offset) {
|
|
109
|
+
this.definition.type.serialize(dataView, offset, this.value, this.options.littleEndian);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
114
112
|
//# sourceMappingURL=number.js.map
|
package/esm/types/number.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/types/number.ts"],"names":[],"mappings":"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"}
|
package/esm/utils.d.ts
CHANGED
|
@@ -1,48 +1,48 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* When evaluating a very complex generic type alias,
|
|
3
|
-
* tell TypeScript to use `T`, instead of current type alias' name, as the result type name
|
|
4
|
-
*
|
|
5
|
-
* Example:
|
|
6
|
-
*
|
|
7
|
-
* ```ts
|
|
8
|
-
* type WithIdentity<T> = Identity<SomeType<T>>;
|
|
9
|
-
* type WithoutIdentity<T> = SomeType<T>;
|
|
10
|
-
*
|
|
11
|
-
* type WithIdentityResult = WithIdentity<number>;
|
|
12
|
-
* // Hover on this one shows `SomeType<number>`
|
|
13
|
-
*
|
|
14
|
-
* type WithoutIdentityResult = WithoutIdentity<number>;
|
|
15
|
-
* // Hover on this one shows `WithoutIdentity<number>`
|
|
16
|
-
* ```
|
|
17
|
-
*/
|
|
18
|
-
export type Identity<T> = T;
|
|
19
|
-
/**
|
|
20
|
-
* Collapse an intersection type (`{ foo: string } & { bar: number }`) to a simple type (`{ foo: string, bar: number }`)
|
|
21
|
-
*/
|
|
22
|
-
export type Evaluate<T> = T extends infer U ? {
|
|
23
|
-
[K in keyof U]: U[K];
|
|
24
|
-
} : never;
|
|
25
|
-
/**
|
|
26
|
-
* Overwrite fields in `TBase` with fields in `TNew`
|
|
27
|
-
*/
|
|
28
|
-
export type Overwrite<TBase extends object, TNew extends object> = Evaluate<Omit<TBase, keyof TNew> & TNew>;
|
|
29
|
-
/**
|
|
30
|
-
* Remove fields with `never` type
|
|
31
|
-
*/
|
|
32
|
-
export type OmitNever<T> = Pick<T, {
|
|
33
|
-
[K in keyof T]: [T[K]] extends [never] ? never : K;
|
|
34
|
-
}[keyof T]>;
|
|
35
|
-
/**
|
|
36
|
-
* Extract keys of fields in `T` that has type `TValue`
|
|
37
|
-
*/
|
|
38
|
-
export type KeysOfType<T, TValue> = {
|
|
39
|
-
[TKey in keyof T]: T[TKey] extends TValue ? TKey : never;
|
|
40
|
-
}[keyof T];
|
|
41
|
-
export type ValueOrPromise<T> = T | PromiseLike<T>;
|
|
42
|
-
/**
|
|
43
|
-
* Returns a (fake) value of the given type.
|
|
44
|
-
*/
|
|
45
|
-
export declare function placeholder<T>(): T;
|
|
46
|
-
export declare function encodeUtf8(input: string): Uint8Array;
|
|
47
|
-
export declare function decodeUtf8(buffer: ArrayBufferView | ArrayBuffer): string;
|
|
1
|
+
/**
|
|
2
|
+
* When evaluating a very complex generic type alias,
|
|
3
|
+
* tell TypeScript to use `T`, instead of current type alias' name, as the result type name
|
|
4
|
+
*
|
|
5
|
+
* Example:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* type WithIdentity<T> = Identity<SomeType<T>>;
|
|
9
|
+
* type WithoutIdentity<T> = SomeType<T>;
|
|
10
|
+
*
|
|
11
|
+
* type WithIdentityResult = WithIdentity<number>;
|
|
12
|
+
* // Hover on this one shows `SomeType<number>`
|
|
13
|
+
*
|
|
14
|
+
* type WithoutIdentityResult = WithoutIdentity<number>;
|
|
15
|
+
* // Hover on this one shows `WithoutIdentity<number>`
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export type Identity<T> = T;
|
|
19
|
+
/**
|
|
20
|
+
* Collapse an intersection type (`{ foo: string } & { bar: number }`) to a simple type (`{ foo: string, bar: number }`)
|
|
21
|
+
*/
|
|
22
|
+
export type Evaluate<T> = T extends infer U ? {
|
|
23
|
+
[K in keyof U]: U[K];
|
|
24
|
+
} : never;
|
|
25
|
+
/**
|
|
26
|
+
* Overwrite fields in `TBase` with fields in `TNew`
|
|
27
|
+
*/
|
|
28
|
+
export type Overwrite<TBase extends object, TNew extends object> = Evaluate<Omit<TBase, keyof TNew> & TNew>;
|
|
29
|
+
/**
|
|
30
|
+
* Remove fields with `never` type
|
|
31
|
+
*/
|
|
32
|
+
export type OmitNever<T> = Pick<T, {
|
|
33
|
+
[K in keyof T]: [T[K]] extends [never] ? never : K;
|
|
34
|
+
}[keyof T]>;
|
|
35
|
+
/**
|
|
36
|
+
* Extract keys of fields in `T` that has type `TValue`
|
|
37
|
+
*/
|
|
38
|
+
export type KeysOfType<T, TValue> = {
|
|
39
|
+
[TKey in keyof T]: T[TKey] extends TValue ? TKey : never;
|
|
40
|
+
}[keyof T];
|
|
41
|
+
export type ValueOrPromise<T> = T | PromiseLike<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Returns a (fake) value of the given type.
|
|
44
|
+
*/
|
|
45
|
+
export declare function placeholder<T>(): T;
|
|
46
|
+
export declare function encodeUtf8(input: string): Uint8Array;
|
|
47
|
+
export declare function decodeUtf8(buffer: ArrayBufferView | ArrayBuffer): string;
|
|
48
48
|
//# sourceMappingURL=utils.d.ts.map
|
package/esm/utils.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns a (fake) value of the given type.
|
|
3
|
-
*/
|
|
4
|
-
export function placeholder() {
|
|
5
|
-
return undefined;
|
|
6
|
-
}
|
|
7
|
-
const { TextEncoder, TextDecoder } = globalThis;
|
|
8
|
-
const Utf8Encoder = new TextEncoder();
|
|
9
|
-
const Utf8Decoder = new TextDecoder();
|
|
10
|
-
export function encodeUtf8(input) {
|
|
11
|
-
return Utf8Encoder.encode(input);
|
|
12
|
-
}
|
|
13
|
-
export function decodeUtf8(buffer) {
|
|
14
|
-
return Utf8Decoder.decode(buffer);
|
|
15
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Returns a (fake) value of the given type.
|
|
3
|
+
*/
|
|
4
|
+
export function placeholder() {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
const { TextEncoder, TextDecoder } = globalThis;
|
|
8
|
+
const Utf8Encoder = new TextEncoder();
|
|
9
|
+
const Utf8Decoder = new TextDecoder();
|
|
10
|
+
export function encodeUtf8(input) {
|
|
11
|
+
return Utf8Encoder.encode(input);
|
|
12
|
+
}
|
|
13
|
+
export function decodeUtf8(buffer) {
|
|
14
|
+
return Utf8Decoder.decode(buffer);
|
|
15
|
+
}
|
|
16
16
|
//# sourceMappingURL=utils.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yume-chan/struct",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.20",
|
|
4
4
|
"description": "C-style structure serializer and deserializer.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"structure",
|
|
@@ -27,23 +27,24 @@
|
|
|
27
27
|
"main": "esm/index.js",
|
|
28
28
|
"types": "esm/index.d.ts",
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@yume-chan/dataview-bigint-polyfill": "^0.0.
|
|
31
|
-
"tslib": "^2.
|
|
30
|
+
"@yume-chan/dataview-bigint-polyfill": "^0.0.20",
|
|
31
|
+
"tslib": "^2.5.2"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@jest/globals": "^29.
|
|
34
|
+
"@jest/globals": "^29.5.0",
|
|
35
35
|
"@yume-chan/eslint-config": "^1.0.0",
|
|
36
36
|
"@yume-chan/tsconfig": "^1.0.0",
|
|
37
37
|
"cross-env": "^7.0.3",
|
|
38
|
-
"eslint": "^8.
|
|
39
|
-
"jest": "^29.
|
|
38
|
+
"eslint": "^8.41.0",
|
|
39
|
+
"jest": "^29.5.0",
|
|
40
|
+
"prettier": "^2.8.8",
|
|
40
41
|
"ts-jest": "^29.0.4",
|
|
41
|
-
"typescript": "^
|
|
42
|
+
"typescript": "^5.0.3"
|
|
42
43
|
},
|
|
43
44
|
"scripts": {
|
|
44
45
|
"build": "tsc -b tsconfig.build.json",
|
|
45
46
|
"build:watch": "tsc -b tsconfig.build.json",
|
|
46
47
|
"test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage",
|
|
47
|
-
"lint": "eslint src/**/*.ts --fix"
|
|
48
|
+
"lint": "eslint src/**/*.ts --fix && prettier src/**/*.ts --write --tab-width 4"
|
|
48
49
|
}
|
|
49
50
|
}
|
package/src/basic/definition.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
type StructDeserializeStream,
|
|
6
|
-
} from "./stream.js";
|
|
7
|
-
import { type StructValue } from "./struct-value.js";
|
|
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";
|
|
8
5
|
|
|
9
6
|
/**
|
|
10
7
|
* A field definition defines how to deserialize a field.
|
|
@@ -60,12 +57,12 @@ export abstract class StructFieldDefinition<
|
|
|
60
57
|
*/
|
|
61
58
|
public abstract deserialize(
|
|
62
59
|
options: Readonly<StructOptions>,
|
|
63
|
-
stream:
|
|
60
|
+
stream: ExactReadable,
|
|
64
61
|
structValue: StructValue
|
|
65
62
|
): StructFieldValue<this>;
|
|
66
63
|
public abstract deserialize(
|
|
67
64
|
options: Readonly<StructOptions>,
|
|
68
|
-
stream:
|
|
65
|
+
stream: AsyncExactReadable,
|
|
69
66
|
struct: StructValue
|
|
70
67
|
): Promise<StructFieldValue<this>>;
|
|
71
68
|
}
|
package/src/basic/field-value.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import type { StructFieldDefinition } from "./definition.js";
|
|
2
|
+
import type { StructOptions } from "./options.js";
|
|
3
|
+
import type { StructValue } from "./struct-value.js";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* A field value defines how to serialize a field.
|
package/src/basic/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
4
|
-
export * from
|
|
5
|
-
export * from
|
|
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";
|
package/src/basic/stream.ts
CHANGED
|
@@ -1,23 +1,34 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ValueOrPromise } from "../utils.js";
|
|
2
2
|
|
|
3
3
|
// TODO: allow over reading (returning a `Uint8Array`, an `offset` and a `length`) to avoid copying
|
|
4
4
|
|
|
5
|
-
export
|
|
5
|
+
export class ExactReadableEndedError extends Error {
|
|
6
|
+
public constructor() {
|
|
7
|
+
super("ExactReadable ended");
|
|
8
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ExactReadable {
|
|
13
|
+
readonly position: number;
|
|
14
|
+
|
|
6
15
|
/**
|
|
7
16
|
* Read data from the underlying data source.
|
|
8
17
|
*
|
|
9
18
|
* The stream must return exactly `length` bytes or data. If that's not possible
|
|
10
|
-
* (due to end of file or other error condition), it must throw an
|
|
19
|
+
* (due to end of file or other error condition), it must throw an {@link ExactReadableEndedError}.
|
|
11
20
|
*/
|
|
12
|
-
|
|
21
|
+
readExactly(length: number): Uint8Array;
|
|
13
22
|
}
|
|
14
23
|
|
|
15
|
-
export interface
|
|
24
|
+
export interface AsyncExactReadable {
|
|
25
|
+
readonly position: number;
|
|
26
|
+
|
|
16
27
|
/**
|
|
17
28
|
* Read data from the underlying data source.
|
|
18
29
|
*
|
|
19
30
|
* The stream must return exactly `length` bytes or data. If that's not possible
|
|
20
|
-
* (due to end of file or other error condition), it must throw an
|
|
31
|
+
* (due to end of file or other error condition), it must throw an {@link ExactReadableEndedError}.
|
|
21
32
|
*/
|
|
22
|
-
|
|
33
|
+
readExactly(length: number): ValueOrPromise<Uint8Array>;
|
|
23
34
|
}
|
package/src/index.ts
CHANGED
|
@@ -10,8 +10,9 @@ declare global {
|
|
|
10
10
|
}
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export * from
|
|
14
|
-
export * from
|
|
15
|
-
export { Struct as default } from
|
|
16
|
-
export * from
|
|
17
|
-
export * from
|
|
13
|
+
export * from "./basic/index.js";
|
|
14
|
+
export * from "./struct.js";
|
|
15
|
+
export { Struct as default } from "./struct.js";
|
|
16
|
+
export * from "./sync-promise.js";
|
|
17
|
+
export * from "./types/index.js";
|
|
18
|
+
export * from "./utils.js";
|