@wener/utils 1.1.47 → 1.1.49
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/README.md +9 -1
- package/lib/asyncs/Promises.js +54 -0
- package/lib/asyncs/Promises.js.map +1 -0
- package/lib/asyncs/createLazyPromise.js +52 -51
- package/lib/asyncs/createLazyPromise.js.map +1 -1
- package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
- package/lib/asyncs/isPromise.js +2 -3
- package/lib/asyncs/isPromise.js.map +1 -1
- package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
- package/lib/asyncs/timeout.js +4 -4
- package/lib/asyncs/timeout.js.map +1 -1
- package/lib/cn/division/DivisionCode.js +30 -17
- package/lib/cn/division/DivisionCode.js.map +1 -1
- package/lib/cn/id/{Mod11Checksum.js → Mod11.js} +3 -6
- package/lib/cn/id/Mod11.js.map +1 -0
- package/lib/cn/id/ResidentIdNumber.js +10 -12
- package/lib/cn/id/ResidentIdNumber.js.map +1 -1
- package/lib/cn/types.js +3 -0
- package/lib/cn/types.js.map +1 -0
- package/lib/cn/uscc/{Mod31Checksum.js → Mod31.js} +3 -6
- package/lib/cn/uscc/Mod31.js.map +1 -0
- package/lib/cn/uscc/USCC.js +6 -9
- package/lib/cn/uscc/USCC.js.map +1 -1
- package/lib/cn/uscc/isUSCC.js +1 -1
- package/lib/cn/uscc/isUSCC.js.map +1 -1
- package/lib/crypto/getNodeCrypto.js +14 -10
- package/lib/crypto/getNodeCrypto.js.map +1 -1
- package/lib/crypto/getRandomValues.js +5 -1
- package/lib/crypto/getRandomValues.js.map +1 -1
- package/lib/emitter/types.js +3 -0
- package/lib/emitter/types.js.map +1 -0
- package/lib/fetch/createFetchWith.js.map +1 -1
- package/lib/fetch/createFetchWithRetry.js.map +1 -1
- package/lib/fetch/http.types.js +4 -0
- package/lib/fetch/http.types.js.map +1 -0
- package/lib/index.js +6 -3
- package/lib/index.js.map +1 -1
- package/lib/io/ArrayBuffers.js.map +1 -1
- package/lib/io/ByteBuffer.js +235 -36
- package/lib/io/ByteBuffer.js.map +1 -1
- package/lib/langs/getGlobalStates.js +17 -0
- package/lib/langs/getGlobalStates.js.map +1 -0
- package/lib/langs/getObjectId.js +18 -0
- package/lib/langs/getObjectId.js.map +1 -0
- package/lib/langs/isNullish.js +5 -0
- package/lib/langs/isNullish.js.map +1 -0
- package/lib/logging/slog.js.map +1 -1
- package/lib/maths/clamp.js +7 -6
- package/lib/maths/clamp.js.map +1 -1
- package/lib/maths/random.js.map +1 -1
- package/lib/mitt/index.js +77 -0
- package/lib/mitt/index.js.map +1 -0
- package/lib/objects/computeIfAbsent.js +1 -1
- package/lib/objects/computeIfAbsent.js.map +1 -1
- package/lib/schema/typebox/typebox.js.map +1 -1
- package/lib/server/fetch/createFetchWithProxyByUndici.js.map +1 -1
- package/package.json +6 -14
- package/src/asyncs/Promises.ts +62 -0
- package/src/asyncs/createLazyPromise.test.ts +52 -13
- package/src/asyncs/createLazyPromise.ts +66 -61
- package/src/asyncs/firstOfAsyncIterator.ts +1 -1
- package/src/asyncs/isPromise.ts +3 -3
- package/src/asyncs/nextOfAsyncIterator.ts +1 -1
- package/src/asyncs/timeout.ts +4 -4
- package/src/cn/division/DivisionCode.ts +61 -8
- package/src/cn/division/division.test.ts +6 -0
- package/src/cn/id/{Mod11Checksum.ts → Mod11.ts} +3 -6
- package/src/cn/id/ResidentIdNumber.ts +11 -13
- package/src/cn/id/id.test.ts +5 -5
- package/src/cn/scripts/gen.test.ts +2 -1
- package/src/cn/types.ts +11 -0
- package/src/cn/uscc/{Mod31Checksum.ts → Mod31.ts} +3 -7
- package/src/cn/uscc/USCC.ts +7 -11
- package/src/cn/uscc/isUSCC.ts +1 -1
- package/src/cn/uscc/uscc.test.ts +4 -4
- package/src/crypto/getNodeCrypto.ts +16 -11
- package/src/crypto/getRandomValues.ts +6 -1
- package/src/emitter/types.ts +18 -0
- package/src/fetch/createFetchWith.ts +1 -1
- package/src/fetch/createFetchWithRetry.ts +1 -1
- package/src/fetch/http.types.ts +46 -0
- package/src/index.ts +7 -3
- package/src/io/ArrayBuffers.ts +7 -3
- package/src/io/ByteBuffer.test.ts +33 -6
- package/src/io/ByteBuffer.ts +272 -41
- package/src/langs/getGlobalStates.ts +21 -0
- package/src/langs/getObjectId.ts +20 -0
- package/src/langs/isNullish.ts +3 -0
- package/src/langs/mixin.test.ts +43 -0
- package/src/logging/slog.ts +1 -1
- package/src/maths/clamp.test.ts +5 -1
- package/src/maths/clamp.ts +7 -7
- package/src/maths/random.ts +1 -1
- package/src/mitt/README.md +1 -0
- package/src/mitt/index.ts +114 -0
- package/src/objects/computeIfAbsent.ts +3 -2
- package/src/objects/merge/merge.test.ts +1 -1
- package/src/schema/typebox/typebox.ts +1 -1
- package/src/server/fetch/createFetchWithProxyByUndici.ts +2 -2
- package/tsconfig.json +4 -1
- package/lib/asyncs/sleep.js +0 -3
- package/lib/asyncs/sleep.js.map +0 -1
- package/lib/cn/id/Mod11Checksum.js.map +0 -1
- package/lib/cn/uscc/Mod31Checksum.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/common/encoder.js +0 -94
- package/lib/schema/typebox/gen/codegen/common/encoder.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/common/formatter.js +0 -33
- package/lib/schema/typebox/gen/codegen/common/formatter.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/common/index.js +0 -29
- package/lib/schema/typebox/gen/codegen/common/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/common/jsdoc.js +0 -117
- package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/compiler.js +0 -364
- package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/errors.js +0 -259
- package/lib/schema/typebox/gen/codegen/expression/errors.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/evaluator.js +0 -254
- package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/expression.js +0 -381
- package/lib/schema/typebox/gen/codegen/expression/expression.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/expression/index.js +0 -32
- package/lib/schema/typebox/gen/codegen/expression/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/index.js +0 -29
- package/lib/schema/typebox/gen/codegen/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/index.js +0 -40
- package/lib/schema/typebox/gen/codegen/model/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js +0 -260
- package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-expression.js +0 -383
- package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js +0 -238
- package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js +0 -274
- package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js +0 -47
- package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js +0 -192
- package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js +0 -33
- package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js +0 -188
- package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js +0 -239
- package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-value.js +0 -43
- package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js +0 -227
- package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-yup.js +0 -225
- package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model-to-zod.js +0 -248
- package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/model/model.js +0 -27
- package/lib/schema/typebox/gen/codegen/model/model.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/typescript/index.js +0 -28
- package/lib/schema/typebox/gen/codegen/typescript/index.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +0 -72
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +0 -1
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js +0 -620
- package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +0 -1
- package/lib/schema/typebox/gen/index.js +0 -3
- package/lib/schema/typebox/gen/index.js.map +0 -1
- package/src/asyncs/sleep.ts +0 -1
- package/src/schema/typebox/gen/codegen/common/encoder.ts +0 -99
- package/src/schema/typebox/gen/codegen/common/formatter.ts +0 -31
- package/src/schema/typebox/gen/codegen/common/index.ts +0 -29
- package/src/schema/typebox/gen/codegen/common/jsdoc.ts +0 -93
- package/src/schema/typebox/gen/codegen/expression/compiler.ts +0 -377
- package/src/schema/typebox/gen/codegen/expression/errors.ts +0 -302
- package/src/schema/typebox/gen/codegen/expression/evaluator.ts +0 -268
- package/src/schema/typebox/gen/codegen/expression/expression.ts +0 -538
- package/src/schema/typebox/gen/codegen/expression/index.ts +0 -32
- package/src/schema/typebox/gen/codegen/index.ts +0 -29
- package/src/schema/typebox/gen/codegen/model/index.ts +0 -40
- package/src/schema/typebox/gen/codegen/model/model-to-arktype.ts +0 -266
- package/src/schema/typebox/gen/codegen/model/model-to-expression.ts +0 -378
- package/src/schema/typebox/gen/codegen/model/model-to-grpc.ts +0 -244
- package/src/schema/typebox/gen/codegen/model/model-to-io-ts.ts +0 -294
- package/src/schema/typebox/gen/codegen/model/model-to-javascript.ts +0 -42
- package/src/schema/typebox/gen/codegen/model/model-to-json-schema.ts +0 -166
- package/src/schema/typebox/gen/codegen/model/model-to-typebox.ts +0 -32
- package/src/schema/typebox/gen/codegen/model/model-to-typescript.ts +0 -189
- package/src/schema/typebox/gen/codegen/model/model-to-valibot.ts +0 -236
- package/src/schema/typebox/gen/codegen/model/model-to-value.ts +0 -42
- package/src/schema/typebox/gen/codegen/model/model-to-yrel.ts +0 -232
- package/src/schema/typebox/gen/codegen/model/model-to-yup.ts +0 -226
- package/src/schema/typebox/gen/codegen/model/model-to-zod.ts +0 -251
- package/src/schema/typebox/gen/codegen/model/model.ts +0 -33
- package/src/schema/typebox/gen/codegen/typescript/index.ts +0 -28
- package/src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts +0 -61
- package/src/schema/typebox/gen/codegen/typescript/typescript-to-typebox.ts +0 -647
- package/src/schema/typebox/gen/gen.test.ts +0 -12
- package/src/schema/typebox/gen/index.ts +0 -1
- /package/src/schema/{typebox/gen/README.md → README.md} +0 -0
package/src/io/ByteBuffer.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isDefined } from '../langs/isDefined';
|
|
2
1
|
import { ArrayBuffers } from './ArrayBuffers';
|
|
3
2
|
|
|
4
3
|
type AnyBuffer = BufferSource | ArrayBufferLike;
|
|
@@ -35,18 +34,40 @@ function asBuffer(o: AnyBuffer) {
|
|
|
35
34
|
/**
|
|
36
35
|
* @see {@link https://www.egret.uk/docs/egretengine/engine/egret.ByteArray egret.ByteArray}
|
|
37
36
|
* @see {@link https://github.com/protobufjs/bytebuffer.js protobufjs/bytebuffer.js}
|
|
38
|
-
* @see {@link https://netty.io/4.1/api/io/netty/buffer/ByteBuf.html ByteBuf}
|
|
37
|
+
* @see {@link https://netty.io/4.1/api/io/netty/buffer/ByteBuf.html io.netty.buffer.ByteBuf}
|
|
38
|
+
* @see {@link https://nodejs.org/api/buffer.html node:buffer}
|
|
39
|
+
* @see {@link https://www.postgresql.org/docs/current/datatype.html PostgreSQL Data Types}
|
|
39
40
|
*/
|
|
40
41
|
export class ByteBuffer {
|
|
41
42
|
position = 0;
|
|
42
43
|
|
|
43
44
|
#buffer: ArrayBufferLike;
|
|
44
45
|
#view: DataView;
|
|
46
|
+
#bytes: Uint8Array;
|
|
47
|
+
// #endian: 'big' | 'little' = 'big';
|
|
48
|
+
#bigEndian = true;
|
|
45
49
|
|
|
46
50
|
constructor(buffer: AnyBuffer = new ArrayBuffer(0, { maxByteLength: 1024 })) {
|
|
47
51
|
this.#buffer = asBuffer(buffer);
|
|
48
52
|
// NOTE prefer view over buffer, avoid the slice overhead ?
|
|
49
53
|
this.#view = new DataView(this.#buffer);
|
|
54
|
+
this.#bytes = new Uint8Array(this.#buffer);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
get littleEndian() {
|
|
58
|
+
return !this.#bigEndian;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
set littleEndian(v: boolean) {
|
|
62
|
+
this.#bigEndian = !v;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
get bigEndian() {
|
|
66
|
+
return this.#bigEndian;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
set bigEndian(v: boolean) {
|
|
70
|
+
this.#bigEndian = v;
|
|
50
71
|
}
|
|
51
72
|
|
|
52
73
|
get view() {
|
|
@@ -60,6 +81,11 @@ export class ByteBuffer {
|
|
|
60
81
|
set buffer(buffer: AnyBuffer) {
|
|
61
82
|
this.#buffer = asBuffer(buffer);
|
|
62
83
|
this.#view = new DataView(this.#buffer);
|
|
84
|
+
this.#bytes = new Uint8Array(this.#buffer);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
get bytes(): Uint8Array {
|
|
88
|
+
return this.#bytes;
|
|
63
89
|
}
|
|
64
90
|
|
|
65
91
|
get length() {
|
|
@@ -70,13 +96,8 @@ export class ByteBuffer {
|
|
|
70
96
|
this.resize(length);
|
|
71
97
|
}
|
|
72
98
|
|
|
73
|
-
private willWrite(length: number) {
|
|
74
|
-
if (this.remaining() < length) {
|
|
75
|
-
this.resize(this.length + length);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
99
|
resize(newLength: number) {
|
|
100
|
+
// 1.2 for buffer growth
|
|
80
101
|
this.buffer = ArrayBuffers.resize(this.buffer, newLength, Math.ceil(newLength * 1.2));
|
|
81
102
|
}
|
|
82
103
|
|
|
@@ -87,9 +108,14 @@ export class ByteBuffer {
|
|
|
87
108
|
|
|
88
109
|
writeBytes(bytes: ArrayBufferLike, len: number = bytes.byteLength) {
|
|
89
110
|
this.willWrite(len);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
111
|
+
// ensure len first
|
|
112
|
+
this.bytes.set(new Uint8Array(bytes).subarray(0, len), this.position);
|
|
113
|
+
if (len > bytes.byteLength) {
|
|
114
|
+
// fill zero
|
|
115
|
+
this.bytes.fill(0, this.position + bytes.byteLength, this.position + len);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
this.position += len;
|
|
93
119
|
}
|
|
94
120
|
|
|
95
121
|
writeInt8(value: number) {
|
|
@@ -106,49 +132,56 @@ export class ByteBuffer {
|
|
|
106
132
|
|
|
107
133
|
writeInt16(value: number) {
|
|
108
134
|
this.willWrite(2);
|
|
109
|
-
this.view.setInt16(this.position, value);
|
|
135
|
+
this.view.setInt16(this.position, value, this.littleEndian);
|
|
110
136
|
this.position += 2;
|
|
111
137
|
}
|
|
112
138
|
|
|
113
139
|
writeUint16(value: number) {
|
|
114
140
|
this.willWrite(2);
|
|
115
|
-
this.view.setUint16(this.position, value);
|
|
141
|
+
this.view.setUint16(this.position, value, this.littleEndian);
|
|
116
142
|
this.position += 2;
|
|
117
143
|
}
|
|
118
144
|
|
|
145
|
+
writeUint24(value: number) {
|
|
146
|
+
this.willWrite(3);
|
|
147
|
+
this.view.setUint8(this.position, value & 0xff);
|
|
148
|
+
this.view.setUint16(this.position + 1, value >> 8, this.littleEndian);
|
|
149
|
+
this.position += 3;
|
|
150
|
+
}
|
|
151
|
+
|
|
119
152
|
writeInt32(value: number) {
|
|
120
153
|
this.willWrite(4);
|
|
121
|
-
this.view.setInt32(this.position, value);
|
|
154
|
+
this.view.setInt32(this.position, value, this.littleEndian);
|
|
122
155
|
this.position += 4;
|
|
123
156
|
}
|
|
124
157
|
|
|
125
158
|
writeUint32(value: number) {
|
|
126
159
|
this.willWrite(4);
|
|
127
|
-
this.view.setUint32(this.position, value);
|
|
160
|
+
this.view.setUint32(this.position, value, this.littleEndian);
|
|
128
161
|
this.position += 4;
|
|
129
162
|
}
|
|
130
163
|
|
|
131
|
-
writeInt64(value: bigint) {
|
|
164
|
+
writeInt64(value: bigint | number) {
|
|
132
165
|
this.willWrite(8);
|
|
133
|
-
this.view.setBigInt64(this.position, value);
|
|
166
|
+
this.view.setBigInt64(this.position, bigintOf(value), this.littleEndian);
|
|
134
167
|
this.position += 8;
|
|
135
168
|
}
|
|
136
169
|
|
|
137
|
-
writeUint64(value: bigint) {
|
|
170
|
+
writeUint64(value: bigint | number) {
|
|
138
171
|
this.willWrite(8);
|
|
139
|
-
this.view.setBigUint64(this.position, value);
|
|
172
|
+
this.view.setBigUint64(this.position, bigintOf(value), this.littleEndian);
|
|
140
173
|
this.position += 8;
|
|
141
174
|
}
|
|
142
175
|
|
|
143
176
|
writeFloat32(value: number) {
|
|
144
177
|
this.willWrite(4);
|
|
145
|
-
this.view.setFloat32(this.position, value);
|
|
178
|
+
this.view.setFloat32(this.position, value, this.littleEndian);
|
|
146
179
|
this.position += 4;
|
|
147
180
|
}
|
|
148
181
|
|
|
149
182
|
writeFloat64(value: number) {
|
|
150
183
|
this.willWrite(8);
|
|
151
|
-
this.view.setFloat64(this.position, value);
|
|
184
|
+
this.view.setFloat64(this.position, value, this.littleEndian);
|
|
152
185
|
this.position += 8;
|
|
153
186
|
}
|
|
154
187
|
|
|
@@ -157,13 +190,32 @@ export class ByteBuffer {
|
|
|
157
190
|
}
|
|
158
191
|
|
|
159
192
|
writeString(value: string): void;
|
|
193
|
+
|
|
160
194
|
writeString(value: string, len?: number): void;
|
|
195
|
+
|
|
161
196
|
writeString(value: string, len?: number) {
|
|
162
|
-
let
|
|
163
|
-
let bytes = encoder.encode(value);
|
|
197
|
+
let bytes = this.encodeText(value);
|
|
164
198
|
this.writeBytes(bytes, len);
|
|
165
199
|
}
|
|
166
200
|
|
|
201
|
+
readSizeString(n?: number) {
|
|
202
|
+
return this.readString(requireNumber(this.readUint(n)));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
writeSizeString(value: string, n?: number) {
|
|
206
|
+
let out = this.encodeText(value);
|
|
207
|
+
this.writeUint(out.length, n);
|
|
208
|
+
this.writeBytes(out);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
encodeText(value: string) {
|
|
212
|
+
return new TextEncoder().encode(value);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
decodeText(bytes: ArrayBufferLike) {
|
|
216
|
+
return new TextDecoder().decode(bytes);
|
|
217
|
+
}
|
|
218
|
+
|
|
167
219
|
readByte() {
|
|
168
220
|
return this.view.getUint8(this.position++);
|
|
169
221
|
}
|
|
@@ -186,67 +238,82 @@ export class ByteBuffer {
|
|
|
186
238
|
return value;
|
|
187
239
|
}
|
|
188
240
|
|
|
241
|
+
readUnsignedByte() {
|
|
242
|
+
return this.readUint8();
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
readThrough(end: number) {
|
|
246
|
+
// readUntil 不包含 end
|
|
247
|
+
let idx = this.bytes.indexOf(end, this.position);
|
|
248
|
+
if (idx === -1) {
|
|
249
|
+
throw new Error(`Byte ${end} not found starting from position ${this.position}`);
|
|
250
|
+
}
|
|
251
|
+
let bytes = this.buffer.slice(this.position, idx + 1);
|
|
252
|
+
this.position = idx + 1;
|
|
253
|
+
return bytes;
|
|
254
|
+
}
|
|
255
|
+
|
|
189
256
|
readInt16() {
|
|
190
|
-
let value = this.view.getInt16(this.position);
|
|
257
|
+
let value = this.view.getInt16(this.position, this.littleEndian);
|
|
191
258
|
this.position += 2;
|
|
192
259
|
return value;
|
|
193
260
|
}
|
|
194
261
|
|
|
195
262
|
readUint16() {
|
|
196
|
-
let value = this.view.getUint16(this.position);
|
|
263
|
+
let value = this.view.getUint16(this.position, this.littleEndian);
|
|
197
264
|
this.position += 2;
|
|
198
265
|
return value;
|
|
199
266
|
}
|
|
200
267
|
|
|
201
268
|
readInt32() {
|
|
202
|
-
let value = this.view.getInt32(this.position);
|
|
269
|
+
let value = this.view.getInt32(this.position, this.littleEndian);
|
|
203
270
|
this.position += 4;
|
|
204
271
|
return value;
|
|
205
272
|
}
|
|
206
273
|
|
|
207
274
|
readUint32() {
|
|
208
|
-
let value = this.view.getUint32(this.position);
|
|
275
|
+
let value = this.view.getUint32(this.position, this.littleEndian);
|
|
209
276
|
this.position += 4;
|
|
210
277
|
return value;
|
|
211
278
|
}
|
|
212
279
|
|
|
213
280
|
readInt64() {
|
|
214
|
-
let value = this.view.getBigInt64(this.position);
|
|
281
|
+
let value = this.view.getBigInt64(this.position, this.littleEndian);
|
|
215
282
|
this.position += 8;
|
|
216
283
|
return safeNumber(value);
|
|
217
284
|
}
|
|
218
285
|
|
|
219
286
|
readUint64() {
|
|
220
|
-
let value = this.view.getBigUint64(this.position);
|
|
287
|
+
let value = this.view.getBigUint64(this.position, this.littleEndian);
|
|
221
288
|
this.position += 8;
|
|
222
289
|
return safeNumber(value);
|
|
223
290
|
}
|
|
224
291
|
|
|
225
292
|
readFloat32() {
|
|
226
|
-
let value = this.view.getFloat32(this.position);
|
|
293
|
+
let value = this.view.getFloat32(this.position, this.littleEndian);
|
|
227
294
|
this.position += 4;
|
|
228
295
|
return value;
|
|
229
296
|
}
|
|
230
297
|
|
|
231
298
|
readFloat64() {
|
|
232
|
-
let value = this.view.getFloat64(this.position);
|
|
299
|
+
let value = this.view.getFloat64(this.position, this.littleEndian);
|
|
233
300
|
this.position += 8;
|
|
234
301
|
return value;
|
|
235
302
|
}
|
|
236
303
|
|
|
237
304
|
readBoolean() {
|
|
305
|
+
// or !== 0?
|
|
238
306
|
return this.readByte() === 1;
|
|
239
307
|
}
|
|
240
308
|
|
|
241
|
-
readString(length: number) {
|
|
309
|
+
readString(length: number): string {
|
|
242
310
|
let bytes = this.readBytes(length);
|
|
243
|
-
let decoder = new TextDecoder();
|
|
244
311
|
let a = new Uint8Array(bytes);
|
|
245
312
|
let idx = a.indexOf(0);
|
|
246
313
|
if (idx !== -1) {
|
|
247
314
|
bytes = bytes.slice(0, idx);
|
|
248
315
|
}
|
|
249
|
-
return
|
|
316
|
+
return this.decodeText(bytes);
|
|
250
317
|
}
|
|
251
318
|
|
|
252
319
|
readHexString(length: number) {
|
|
@@ -254,17 +321,35 @@ export class ByteBuffer {
|
|
|
254
321
|
return ArrayBuffers.toHex(bytes);
|
|
255
322
|
}
|
|
256
323
|
|
|
324
|
+
writeHexString(value: string, len?: number) {
|
|
325
|
+
this.writeBytes(ArrayBuffers.fromHex(value), len);
|
|
326
|
+
}
|
|
327
|
+
|
|
257
328
|
writeInt24(value: number) {
|
|
329
|
+
// fixme byte order
|
|
258
330
|
this.writeUint8(value & 0xff);
|
|
259
331
|
this.writeUint16(value >> 8);
|
|
260
332
|
}
|
|
261
333
|
|
|
262
334
|
readInt24() {
|
|
263
|
-
|
|
335
|
+
// fixme recheck
|
|
336
|
+
let value = this.readUint24();
|
|
337
|
+
if (value & 0x800000) {
|
|
338
|
+
// If the sign bit is set, extend the sign
|
|
339
|
+
value |= 0xff000000;
|
|
340
|
+
}
|
|
341
|
+
return value;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
readUint24() {
|
|
345
|
+
// fixme recheck
|
|
346
|
+
return this.readUint8() | (this.readUint8() << 8) | (this.readUint8() << 16);
|
|
264
347
|
}
|
|
265
348
|
|
|
266
349
|
writeZero(length: number) {
|
|
267
|
-
this.
|
|
350
|
+
this.willWrite(length);
|
|
351
|
+
this.bytes.fill(0, this.position, this.position + length);
|
|
352
|
+
this.position += length;
|
|
268
353
|
}
|
|
269
354
|
|
|
270
355
|
writeValue(typ: TypedValue['type'], val: TypedValue['value']): void;
|
|
@@ -286,16 +371,26 @@ export class ByteBuffer {
|
|
|
286
371
|
case 'int16':
|
|
287
372
|
this.writeInt16(value);
|
|
288
373
|
break;
|
|
374
|
+
case 'uint24':
|
|
375
|
+
this.writeUint24(value);
|
|
376
|
+
break;
|
|
377
|
+
case 'int24':
|
|
378
|
+
this.writeInt24(value);
|
|
379
|
+
break;
|
|
289
380
|
case 'uint32':
|
|
381
|
+
case 'uint':
|
|
290
382
|
this.writeUint32(value);
|
|
291
383
|
break;
|
|
292
384
|
case 'int32':
|
|
385
|
+
case 'int':
|
|
293
386
|
this.writeInt32(value);
|
|
294
387
|
break;
|
|
295
388
|
case 'float32':
|
|
389
|
+
case 'float':
|
|
296
390
|
this.writeFloat32(value);
|
|
297
391
|
break;
|
|
298
392
|
case 'float64':
|
|
393
|
+
case 'double':
|
|
299
394
|
this.writeFloat64(value);
|
|
300
395
|
break;
|
|
301
396
|
case 'string':
|
|
@@ -312,20 +407,130 @@ export class ByteBuffer {
|
|
|
312
407
|
}
|
|
313
408
|
}
|
|
314
409
|
|
|
315
|
-
|
|
316
|
-
return this.
|
|
410
|
+
readUnsignedShort() {
|
|
411
|
+
return this.readUint16();
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
readShort() {
|
|
415
|
+
return this.readInt16();
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
readInt(bytesOrBits: number = 32) {
|
|
419
|
+
switch (bytesOrBits) {
|
|
420
|
+
case 1:
|
|
421
|
+
case 8:
|
|
422
|
+
return this.readInt8();
|
|
423
|
+
case 2:
|
|
424
|
+
case 16:
|
|
425
|
+
return this.readInt16();
|
|
426
|
+
case 3:
|
|
427
|
+
case 24:
|
|
428
|
+
return this.readInt24();
|
|
429
|
+
case 4:
|
|
430
|
+
case 32:
|
|
431
|
+
return this.readInt32();
|
|
432
|
+
// skip 8 byte for bits
|
|
433
|
+
case 64:
|
|
434
|
+
return this.readInt64();
|
|
435
|
+
default:
|
|
436
|
+
throw new Error(`Unknown int${bytesOrBits}`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
readUint(bytesOrBits: number = 32) {
|
|
441
|
+
switch (bytesOrBits) {
|
|
442
|
+
case 1:
|
|
443
|
+
case 8:
|
|
444
|
+
return this.readUint8();
|
|
445
|
+
case 2:
|
|
446
|
+
case 16:
|
|
447
|
+
return this.readUint16();
|
|
448
|
+
case 3:
|
|
449
|
+
case 24:
|
|
450
|
+
return this.readUint24();
|
|
451
|
+
case 4:
|
|
452
|
+
case 32:
|
|
453
|
+
return this.readUint32();
|
|
454
|
+
// skip 8 byte for bits
|
|
455
|
+
case 64:
|
|
456
|
+
return this.readUint64();
|
|
457
|
+
default:
|
|
458
|
+
throw new Error(`Unexpected int size: ${bytesOrBits}`);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
writeUint(value: number, bytesOrBits: number = 32) {
|
|
463
|
+
switch (bytesOrBits) {
|
|
464
|
+
case 1:
|
|
465
|
+
case 8:
|
|
466
|
+
this.writeUint8(value);
|
|
467
|
+
break;
|
|
468
|
+
case 2:
|
|
469
|
+
case 16:
|
|
470
|
+
this.writeUint16(value);
|
|
471
|
+
break;
|
|
472
|
+
case 3:
|
|
473
|
+
case 24:
|
|
474
|
+
this.writeUint24(value);
|
|
475
|
+
break;
|
|
476
|
+
case 4:
|
|
477
|
+
case 32:
|
|
478
|
+
this.writeUint32(value);
|
|
479
|
+
break;
|
|
480
|
+
case 64:
|
|
481
|
+
this.writeUint64(value);
|
|
482
|
+
break;
|
|
483
|
+
default:
|
|
484
|
+
throw new Error(`Unexpected uint size: ${bytesOrBits}`);
|
|
485
|
+
}
|
|
317
486
|
}
|
|
318
487
|
|
|
319
|
-
readFloat() {
|
|
320
|
-
|
|
488
|
+
readFloat(n: number = 32) {
|
|
489
|
+
switch (n) {
|
|
490
|
+
case 4:
|
|
491
|
+
case 32:
|
|
492
|
+
return this.readFloat32();
|
|
493
|
+
case 8:
|
|
494
|
+
case 64:
|
|
495
|
+
return this.readFloat64();
|
|
496
|
+
default:
|
|
497
|
+
throw new Error(`Unexpected float size: ${n}`);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
writeFloat(value: number, n: number = 32) {
|
|
502
|
+
switch (n) {
|
|
503
|
+
case 4:
|
|
504
|
+
case 32:
|
|
505
|
+
this.writeFloat32(value);
|
|
506
|
+
break;
|
|
507
|
+
case 8:
|
|
508
|
+
case 64:
|
|
509
|
+
this.writeFloat64(value);
|
|
510
|
+
break;
|
|
511
|
+
default:
|
|
512
|
+
throw new Error(`Unexpected float size: ${n}`);
|
|
513
|
+
}
|
|
321
514
|
}
|
|
322
515
|
|
|
323
516
|
readDouble() {
|
|
324
517
|
return this.readFloat64();
|
|
325
518
|
}
|
|
326
519
|
|
|
520
|
+
writeDouble(value: number) {
|
|
521
|
+
this.writeFloat64(value);
|
|
522
|
+
}
|
|
523
|
+
|
|
327
524
|
remaining() {
|
|
328
|
-
return this.
|
|
525
|
+
return this.length - this.position;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
hasRemaining() {
|
|
529
|
+
return this.remaining() > 0;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
readRemaining() {
|
|
533
|
+
return this.readBytes(this.remaining());
|
|
329
534
|
}
|
|
330
535
|
|
|
331
536
|
toUint8Array() {
|
|
@@ -339,6 +544,12 @@ export class ByteBuffer {
|
|
|
339
544
|
toBase64() {
|
|
340
545
|
return ArrayBuffers.toBase64(this.buffer);
|
|
341
546
|
}
|
|
547
|
+
|
|
548
|
+
private willWrite(length: number) {
|
|
549
|
+
if (this.remaining() < length) {
|
|
550
|
+
this.resize(this.position + length);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
342
553
|
}
|
|
343
554
|
|
|
344
555
|
export interface TypedValue {
|
|
@@ -349,9 +560,15 @@ export interface TypedValue {
|
|
|
349
560
|
| 'int8'
|
|
350
561
|
| 'uint16'
|
|
351
562
|
| 'int16'
|
|
563
|
+
| 'uint24'
|
|
564
|
+
| 'int24'
|
|
565
|
+
| 'int'
|
|
566
|
+
| 'uint'
|
|
352
567
|
| 'uint32'
|
|
353
568
|
| 'int32'
|
|
569
|
+
| 'float'
|
|
354
570
|
| 'float32'
|
|
571
|
+
| 'double'
|
|
355
572
|
| 'float64'
|
|
356
573
|
| 'string'
|
|
357
574
|
| 'boolean';
|
|
@@ -365,3 +582,17 @@ function safeNumber(n: bigint) {
|
|
|
365
582
|
}
|
|
366
583
|
return Number(n);
|
|
367
584
|
}
|
|
585
|
+
|
|
586
|
+
function bigintOf(n: number | bigint) {
|
|
587
|
+
if (typeof n === 'bigint') {
|
|
588
|
+
return n;
|
|
589
|
+
}
|
|
590
|
+
return BigInt(n);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
function requireNumber(n: number | bigint) {
|
|
594
|
+
if (typeof n !== 'number') {
|
|
595
|
+
throw new Error(`Expected number, got ${n}`);
|
|
596
|
+
}
|
|
597
|
+
return n;
|
|
598
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { computeIfAbsent, getGlobalThis } from '@wener/utils';
|
|
2
|
+
|
|
3
|
+
let _holder: any;
|
|
4
|
+
|
|
5
|
+
export function setGlobalStates(states: Record<string, any>) {
|
|
6
|
+
_holder = states;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function getGlobalStates(): Record<string, any>;
|
|
10
|
+
export function getGlobalStates<T>(key: string, create: () => T): T;
|
|
11
|
+
export function getGlobalStates<T>(key: string): T | undefined;
|
|
12
|
+
export function getGlobalStates(key?: string, create?: () => any): any {
|
|
13
|
+
_holder ||= (getGlobalThis() as any).__GLOBAL_STATES__ ||= {};
|
|
14
|
+
if (key) {
|
|
15
|
+
if (!create) {
|
|
16
|
+
return _holder[key];
|
|
17
|
+
}
|
|
18
|
+
return computeIfAbsent(_holder, key, create);
|
|
19
|
+
}
|
|
20
|
+
return _holder;
|
|
21
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { getGlobalStates } from './getGlobalStates';
|
|
2
|
+
|
|
3
|
+
export function getObjectId(k: any): number {
|
|
4
|
+
const state = getGlobalStates('ObjectId', () => {
|
|
5
|
+
return {
|
|
6
|
+
id: 0,
|
|
7
|
+
map: new WeakMap(),
|
|
8
|
+
};
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const { map } = state;
|
|
12
|
+
|
|
13
|
+
if (map.has(k)) {
|
|
14
|
+
return map.get(k);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const id = state.id++;
|
|
18
|
+
map.set(k, id);
|
|
19
|
+
return id;
|
|
20
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { expect, test } from 'vitest';
|
|
2
|
+
import { mixin } from './mixin';
|
|
3
|
+
|
|
4
|
+
export type Constructor<T = {}> = new (...args: any[]) => T;
|
|
5
|
+
|
|
6
|
+
test('mixin', () => {
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
class User extends mixin(BaseResource, createBarFields()) {}
|
|
9
|
+
|
|
10
|
+
let usr = new User();
|
|
11
|
+
// type not working
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
expect(usr.foo, 'foo');
|
|
14
|
+
expect(usr).toEqual({
|
|
15
|
+
foo: 'foo',
|
|
16
|
+
bar: 'bar',
|
|
17
|
+
id: '',
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
class BaseResource {
|
|
22
|
+
id?: string = '';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function createBarFields() {
|
|
26
|
+
return <TBase extends Constructor>(Base: TBase) => {
|
|
27
|
+
// nested type not working
|
|
28
|
+
// @ts-ignore
|
|
29
|
+
class HasBarMixin extends mixin(Base, withFooFields) {
|
|
30
|
+
bar?: string = 'bar';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return HasBarMixin;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function withFooFields<TBase extends Constructor>(Base: TBase) {
|
|
38
|
+
class HasFieldFooMixin extends Base {
|
|
39
|
+
foo?: string = 'foo';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return HasFieldFooMixin;
|
|
43
|
+
}
|
package/src/logging/slog.ts
CHANGED
package/src/maths/clamp.test.ts
CHANGED
|
@@ -13,7 +13,11 @@ test('clamp', () => {
|
|
|
13
13
|
[[null, { min: 1, max: 10 }], 1],
|
|
14
14
|
[[null, { min: 1, max: 10, default: 5 }], 5],
|
|
15
15
|
[[2n, 1, 10, 5], 2n],
|
|
16
|
+
[[1, 2], 2], // min
|
|
17
|
+
[[1, undefined, 0], 0], // max
|
|
18
|
+
[[], undefined],
|
|
19
|
+
[[null], undefined],
|
|
16
20
|
]) {
|
|
17
|
-
expect(clamp.apply(null, a as any)).toBe(b);
|
|
21
|
+
expect(clamp.apply(null, a as any), `${a} -> ${b}`).toBe(b);
|
|
18
22
|
}
|
|
19
23
|
});
|
package/src/maths/clamp.ts
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
import { isDefined } from '../langs/isDefined';
|
|
2
|
+
import { isNullish } from '../langs/isNullish';
|
|
2
3
|
|
|
4
|
+
// export function clamp<T>(value: T | null | undefined, opts: { min?: T; max?: T; default?: T }): T;
|
|
3
5
|
export function clamp<T>(value: T | null | undefined, min: T, max: T, def?: T): T;
|
|
4
6
|
export function clamp<T>(value: T | null | undefined, ...o: any[]): T {
|
|
5
7
|
let min: T, max: T, def: T;
|
|
6
|
-
if (o.length === 1) {
|
|
8
|
+
if (o.length === 1 && o[0] && typeof o[0] === 'object') {
|
|
7
9
|
({ min, max, default: def = min! } = o[0]);
|
|
8
10
|
} else {
|
|
9
11
|
[min, max, def = min!] = o;
|
|
10
12
|
}
|
|
11
|
-
if (value
|
|
13
|
+
if (isNullish(value)) {
|
|
12
14
|
return def;
|
|
13
15
|
}
|
|
14
|
-
if (value < min) {
|
|
16
|
+
if (isDefined(min) && value < min) {
|
|
15
17
|
return min;
|
|
16
18
|
}
|
|
17
|
-
if (value > max) {
|
|
19
|
+
if (isDefined(max) && value > max) {
|
|
18
20
|
return max;
|
|
19
21
|
}
|
|
20
22
|
return value;
|
|
21
23
|
}
|
|
22
|
-
|
|
23
|
-
// type Comparable = number | string | Date | BigInt;
|
package/src/maths/random.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// javascript pseudo random
|
|
2
2
|
export function createRandom(o: { seed?: string | number } = {}) {
|
|
3
|
-
let seed = typeof o.seed === 'string' ? 0 : o.seed ?? 0;
|
|
3
|
+
let seed = typeof o.seed === 'string' ? 0 : (o.seed ?? 0);
|
|
4
4
|
if (typeof o.seed === 'string') {
|
|
5
5
|
let sum = 0;
|
|
6
6
|
for (let i = 0; i < o.seed.length; i++) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
- https://github.com/developit/mitt/blob/main/src/index.ts
|