@yume-chan/struct 0.0.15 → 0.0.16
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 +21 -0
- package/CHANGELOG.md +11 -1
- package/LICENSE +21 -21
- package/README.md +767 -769
- package/esm/basic/definition.d.ts +3 -3
- package/esm/basic/definition.d.ts.map +1 -1
- package/esm/basic/definition.js +0 -1
- package/esm/basic/definition.js.map +1 -1
- package/esm/basic/field-value.d.ts +1 -0
- package/esm/basic/field-value.d.ts.map +1 -1
- package/esm/basic/field-value.js +4 -0
- package/esm/basic/field-value.js.map +1 -1
- package/esm/basic/stream.d.ts +2 -1
- package/esm/basic/stream.d.ts.map +1 -1
- package/esm/basic/struct-value.d.ts +7 -5
- package/esm/basic/struct-value.d.ts.map +1 -1
- package/esm/basic/struct-value.js +30 -14
- package/esm/basic/struct-value.js.map +1 -1
- package/esm/struct.d.ts +11 -11
- package/esm/struct.d.ts.map +1 -1
- package/esm/struct.js +55 -41
- package/esm/struct.js.map +1 -1
- package/esm/sync-promise.d.ts +13 -0
- package/esm/sync-promise.d.ts.map +1 -0
- package/esm/sync-promise.js +71 -0
- package/esm/sync-promise.js.map +1 -0
- package/esm/types/bigint.d.ts.map +1 -1
- package/esm/types/bigint.js +7 -5
- package/esm/types/bigint.js.map +1 -1
- package/esm/types/buffer/base.d.ts +4 -3
- package/esm/types/buffer/base.d.ts.map +1 -1
- package/esm/types/buffer/base.js +9 -7
- package/esm/types/buffer/base.js.map +1 -1
- package/esm/types/buffer/fixed-length.d.ts +1 -1
- package/esm/types/buffer/fixed-length.d.ts.map +1 -1
- package/esm/types/buffer/fixed-length.js.map +1 -1
- package/esm/types/buffer/variable-length.d.ts +2 -2
- package/esm/types/buffer/variable-length.d.ts.map +1 -1
- package/esm/types/buffer/variable-length.js.map +1 -1
- package/esm/types/number.d.ts +6 -5
- package/esm/types/number.d.ts.map +1 -1
- package/esm/types/number.js +25 -14
- package/esm/types/number.js.map +1 -1
- package/package.json +11 -11
- package/src/basic/definition.ts +68 -70
- package/src/basic/field-value.ts +72 -67
- package/src/basic/index.ts +5 -5
- package/src/basic/options.ts +19 -19
- package/src/basic/stream.ts +21 -19
- package/src/basic/struct-value.ts +61 -39
- package/src/index.ts +17 -17
- package/src/struct.ts +632 -609
- package/src/sync-promise.ts +114 -0
- package/src/types/bigint.ts +103 -102
- package/src/types/buffer/base.ts +179 -176
- package/src/types/buffer/fixed-length.ts +20 -17
- package/src/types/buffer/index.ts +3 -3
- package/src/types/buffer/variable-length.ts +158 -156
- package/src/types/index.ts +3 -3
- package/src/types/number.ts +127 -115
- package/src/utils.ts +70 -70
- package/tsconfig.build.json +3 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.test.json +8 -0
- package/esm/syncbird.d.ts +0 -65
- package/esm/syncbird.d.ts.map +0 -1
- package/esm/syncbird.js +0 -38
- package/esm/syncbird.js.map +0 -1
- package/src/syncbird.ts +0 -131
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
export interface SyncPromise<T> {
|
|
2
|
+
then<TResult1 = T, TResult2 = never>(
|
|
3
|
+
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,
|
|
4
|
+
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined
|
|
5
|
+
): SyncPromise<TResult1 | TResult2>;
|
|
6
|
+
|
|
7
|
+
valueOrPromise(): T | PromiseLike<T>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface SyncPromiseStatic {
|
|
11
|
+
reject<T = never>(reason?: any): SyncPromise<T>;
|
|
12
|
+
|
|
13
|
+
resolve(): SyncPromise<void>;
|
|
14
|
+
resolve<T>(value: T | PromiseLike<T>): SyncPromise<T>;
|
|
15
|
+
|
|
16
|
+
try<T>(executor: () => T | PromiseLike<T>): SyncPromise<T>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export const SyncPromise: SyncPromiseStatic = {
|
|
20
|
+
reject<T = never>(reason?: any): SyncPromise<T> {
|
|
21
|
+
return new RejectedSyncPromise(reason);
|
|
22
|
+
},
|
|
23
|
+
resolve<T>(value?: T | PromiseLike<T>): SyncPromise<T> {
|
|
24
|
+
if (
|
|
25
|
+
typeof value === 'object' &&
|
|
26
|
+
value !== null &&
|
|
27
|
+
typeof (value as PromiseLike<T>).then === 'function'
|
|
28
|
+
) {
|
|
29
|
+
if (
|
|
30
|
+
value instanceof PendingSyncPromise ||
|
|
31
|
+
value instanceof ResolvedSyncPromise ||
|
|
32
|
+
value instanceof RejectedSyncPromise
|
|
33
|
+
) {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return new PendingSyncPromise(value as PromiseLike<T>);
|
|
38
|
+
} else {
|
|
39
|
+
return new ResolvedSyncPromise(value as T);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
try<T>(executor: () => T | PromiseLike<T>): SyncPromise<T> {
|
|
43
|
+
try {
|
|
44
|
+
return SyncPromise.resolve(executor());
|
|
45
|
+
} catch (e) {
|
|
46
|
+
return SyncPromise.reject(e);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
class PendingSyncPromise<T> implements SyncPromise<T> {
|
|
52
|
+
private promise: PromiseLike<T>;
|
|
53
|
+
|
|
54
|
+
public constructor(promise: PromiseLike<T>) {
|
|
55
|
+
this.promise = promise;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public then<TResult1 = T, TResult2 = never>(
|
|
59
|
+
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,
|
|
60
|
+
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined
|
|
61
|
+
) {
|
|
62
|
+
return new PendingSyncPromise<TResult1 | TResult2>(
|
|
63
|
+
this.promise.then(onfulfilled, onrejected)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public valueOrPromise(): T | PromiseLike<T> {
|
|
68
|
+
return this.promise;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
class ResolvedSyncPromise<T> implements SyncPromise<T> {
|
|
73
|
+
private value: T;
|
|
74
|
+
|
|
75
|
+
public constructor(value: T) {
|
|
76
|
+
this.value = value;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public then<TResult1 = T, TResult2 = never>(
|
|
80
|
+
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,
|
|
81
|
+
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined
|
|
82
|
+
) {
|
|
83
|
+
if (!onfulfilled) {
|
|
84
|
+
return this as any;
|
|
85
|
+
}
|
|
86
|
+
return SyncPromise.try(() => onfulfilled(this.value));
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public valueOrPromise(): T | PromiseLike<T> {
|
|
90
|
+
return this.value;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
class RejectedSyncPromise<T> implements SyncPromise<T> {
|
|
95
|
+
private reason: any;
|
|
96
|
+
|
|
97
|
+
public constructor(reason: any) {
|
|
98
|
+
this.reason = reason;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
public then<TResult1 = T, TResult2 = never>(
|
|
102
|
+
onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined,
|
|
103
|
+
onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined
|
|
104
|
+
) {
|
|
105
|
+
if (!onrejected) {
|
|
106
|
+
return this as any;
|
|
107
|
+
}
|
|
108
|
+
return SyncPromise.try(() => onrejected(this.reason));
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
public valueOrPromise(): T | PromiseLike<T> {
|
|
112
|
+
throw this.reason;
|
|
113
|
+
}
|
|
114
|
+
}
|
package/src/types/bigint.ts
CHANGED
|
@@ -1,102 +1,103 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
type
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
public readonly
|
|
14
|
-
|
|
15
|
-
public readonly
|
|
16
|
-
|
|
17
|
-
public readonly
|
|
18
|
-
|
|
19
|
-
public
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
this.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
public static readonly
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
public
|
|
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
|
-
|
|
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
|
-
this.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
1
|
+
import { getBigInt64, getBigUint64, setBigInt64, setBigUint64 } from '@yume-chan/dataview-bigint-polyfill/esm/fallback.js';
|
|
2
|
+
import { StructFieldDefinition, StructFieldValue, StructValue, type StructAsyncDeserializeStream, type StructDeserializeStream, type StructOptions } from "../basic/index.js";
|
|
3
|
+
import { SyncPromise } from "../sync-promise.js";
|
|
4
|
+
import type { ValueOrPromise } from "../utils.js";
|
|
5
|
+
|
|
6
|
+
type DataViewBigInt64Getter = (dataView: DataView, byteOffset: number, littleEndian: boolean | undefined) => bigint;
|
|
7
|
+
|
|
8
|
+
type DataViewBigInt64Setter = (dataView: DataView, byteOffset: number, value: bigint, littleEndian: boolean | undefined) => void;
|
|
9
|
+
|
|
10
|
+
export class BigIntFieldType {
|
|
11
|
+
public readonly TTypeScriptType!: bigint;
|
|
12
|
+
|
|
13
|
+
public readonly size: number;
|
|
14
|
+
|
|
15
|
+
public readonly getter: DataViewBigInt64Getter;
|
|
16
|
+
|
|
17
|
+
public readonly setter: DataViewBigInt64Setter;
|
|
18
|
+
|
|
19
|
+
public constructor(
|
|
20
|
+
size: number,
|
|
21
|
+
getter: DataViewBigInt64Getter,
|
|
22
|
+
setter: DataViewBigInt64Setter,
|
|
23
|
+
) {
|
|
24
|
+
this.size = size;
|
|
25
|
+
this.getter = getter;
|
|
26
|
+
this.setter = setter;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public static readonly Int64 = new BigIntFieldType(8, getBigInt64, setBigInt64);
|
|
30
|
+
|
|
31
|
+
public static readonly Uint64 = new BigIntFieldType(8, getBigUint64, setBigUint64);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export class BigIntFieldDefinition<
|
|
35
|
+
TType extends BigIntFieldType = BigIntFieldType,
|
|
36
|
+
TTypeScriptType = TType["TTypeScriptType"],
|
|
37
|
+
> extends StructFieldDefinition<
|
|
38
|
+
void,
|
|
39
|
+
TTypeScriptType
|
|
40
|
+
> {
|
|
41
|
+
public readonly type: TType;
|
|
42
|
+
|
|
43
|
+
public constructor(type: TType, _typescriptType?: TTypeScriptType) {
|
|
44
|
+
super();
|
|
45
|
+
this.type = type;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
public getSize(): number {
|
|
49
|
+
return this.type.size;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public create(
|
|
53
|
+
options: Readonly<StructOptions>,
|
|
54
|
+
struct: StructValue,
|
|
55
|
+
value: TTypeScriptType,
|
|
56
|
+
): BigIntFieldValue<this> {
|
|
57
|
+
return new BigIntFieldValue(this, options, struct, value);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public override deserialize(
|
|
61
|
+
options: Readonly<StructOptions>,
|
|
62
|
+
stream: StructDeserializeStream,
|
|
63
|
+
struct: StructValue,
|
|
64
|
+
): BigIntFieldValue<this>;
|
|
65
|
+
public override deserialize(
|
|
66
|
+
options: Readonly<StructOptions>,
|
|
67
|
+
stream: StructAsyncDeserializeStream,
|
|
68
|
+
struct: StructValue,
|
|
69
|
+
): Promise<BigIntFieldValue<this>>;
|
|
70
|
+
public override deserialize(
|
|
71
|
+
options: Readonly<StructOptions>,
|
|
72
|
+
stream: StructDeserializeStream | StructAsyncDeserializeStream,
|
|
73
|
+
struct: StructValue,
|
|
74
|
+
): ValueOrPromise<BigIntFieldValue<this>> {
|
|
75
|
+
return SyncPromise
|
|
76
|
+
.try(() => {
|
|
77
|
+
return stream.read(this.getSize());
|
|
78
|
+
})
|
|
79
|
+
.then(array => {
|
|
80
|
+
const view = new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
81
|
+
const value = this.type.getter(
|
|
82
|
+
view,
|
|
83
|
+
0,
|
|
84
|
+
options.littleEndian
|
|
85
|
+
);
|
|
86
|
+
return this.create(options, struct, value as any);
|
|
87
|
+
})
|
|
88
|
+
.valueOrPromise();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export class BigIntFieldValue<
|
|
93
|
+
TDefinition extends BigIntFieldDefinition<BigIntFieldType, any>,
|
|
94
|
+
> extends StructFieldValue<TDefinition> {
|
|
95
|
+
public serialize(dataView: DataView, offset: number): void {
|
|
96
|
+
this.definition.type.setter(
|
|
97
|
+
dataView,
|
|
98
|
+
offset,
|
|
99
|
+
this.value!,
|
|
100
|
+
this.options.littleEndian
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
}
|