@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.
Files changed (194) hide show
  1. package/README.md +9 -1
  2. package/lib/asyncs/Promises.js +54 -0
  3. package/lib/asyncs/Promises.js.map +1 -0
  4. package/lib/asyncs/createLazyPromise.js +52 -51
  5. package/lib/asyncs/createLazyPromise.js.map +1 -1
  6. package/lib/asyncs/firstOfAsyncIterator.js.map +1 -1
  7. package/lib/asyncs/isPromise.js +2 -3
  8. package/lib/asyncs/isPromise.js.map +1 -1
  9. package/lib/asyncs/nextOfAsyncIterator.js.map +1 -1
  10. package/lib/asyncs/timeout.js +4 -4
  11. package/lib/asyncs/timeout.js.map +1 -1
  12. package/lib/cn/division/DivisionCode.js +30 -17
  13. package/lib/cn/division/DivisionCode.js.map +1 -1
  14. package/lib/cn/id/{Mod11Checksum.js → Mod11.js} +3 -6
  15. package/lib/cn/id/Mod11.js.map +1 -0
  16. package/lib/cn/id/ResidentIdNumber.js +10 -12
  17. package/lib/cn/id/ResidentIdNumber.js.map +1 -1
  18. package/lib/cn/types.js +3 -0
  19. package/lib/cn/types.js.map +1 -0
  20. package/lib/cn/uscc/{Mod31Checksum.js → Mod31.js} +3 -6
  21. package/lib/cn/uscc/Mod31.js.map +1 -0
  22. package/lib/cn/uscc/USCC.js +6 -9
  23. package/lib/cn/uscc/USCC.js.map +1 -1
  24. package/lib/cn/uscc/isUSCC.js +1 -1
  25. package/lib/cn/uscc/isUSCC.js.map +1 -1
  26. package/lib/crypto/getNodeCrypto.js +14 -10
  27. package/lib/crypto/getNodeCrypto.js.map +1 -1
  28. package/lib/crypto/getRandomValues.js +5 -1
  29. package/lib/crypto/getRandomValues.js.map +1 -1
  30. package/lib/emitter/types.js +3 -0
  31. package/lib/emitter/types.js.map +1 -0
  32. package/lib/fetch/createFetchWith.js.map +1 -1
  33. package/lib/fetch/createFetchWithRetry.js.map +1 -1
  34. package/lib/fetch/http.types.js +4 -0
  35. package/lib/fetch/http.types.js.map +1 -0
  36. package/lib/index.js +6 -3
  37. package/lib/index.js.map +1 -1
  38. package/lib/io/ArrayBuffers.js.map +1 -1
  39. package/lib/io/ByteBuffer.js +235 -36
  40. package/lib/io/ByteBuffer.js.map +1 -1
  41. package/lib/langs/getGlobalStates.js +17 -0
  42. package/lib/langs/getGlobalStates.js.map +1 -0
  43. package/lib/langs/getObjectId.js +18 -0
  44. package/lib/langs/getObjectId.js.map +1 -0
  45. package/lib/langs/isNullish.js +5 -0
  46. package/lib/langs/isNullish.js.map +1 -0
  47. package/lib/logging/slog.js.map +1 -1
  48. package/lib/maths/clamp.js +7 -6
  49. package/lib/maths/clamp.js.map +1 -1
  50. package/lib/maths/random.js.map +1 -1
  51. package/lib/mitt/index.js +77 -0
  52. package/lib/mitt/index.js.map +1 -0
  53. package/lib/objects/computeIfAbsent.js +1 -1
  54. package/lib/objects/computeIfAbsent.js.map +1 -1
  55. package/lib/schema/typebox/typebox.js.map +1 -1
  56. package/lib/server/fetch/createFetchWithProxyByUndici.js.map +1 -1
  57. package/package.json +6 -14
  58. package/src/asyncs/Promises.ts +62 -0
  59. package/src/asyncs/createLazyPromise.test.ts +52 -13
  60. package/src/asyncs/createLazyPromise.ts +66 -61
  61. package/src/asyncs/firstOfAsyncIterator.ts +1 -1
  62. package/src/asyncs/isPromise.ts +3 -3
  63. package/src/asyncs/nextOfAsyncIterator.ts +1 -1
  64. package/src/asyncs/timeout.ts +4 -4
  65. package/src/cn/division/DivisionCode.ts +61 -8
  66. package/src/cn/division/division.test.ts +6 -0
  67. package/src/cn/id/{Mod11Checksum.ts → Mod11.ts} +3 -6
  68. package/src/cn/id/ResidentIdNumber.ts +11 -13
  69. package/src/cn/id/id.test.ts +5 -5
  70. package/src/cn/scripts/gen.test.ts +2 -1
  71. package/src/cn/types.ts +11 -0
  72. package/src/cn/uscc/{Mod31Checksum.ts → Mod31.ts} +3 -7
  73. package/src/cn/uscc/USCC.ts +7 -11
  74. package/src/cn/uscc/isUSCC.ts +1 -1
  75. package/src/cn/uscc/uscc.test.ts +4 -4
  76. package/src/crypto/getNodeCrypto.ts +16 -11
  77. package/src/crypto/getRandomValues.ts +6 -1
  78. package/src/emitter/types.ts +18 -0
  79. package/src/fetch/createFetchWith.ts +1 -1
  80. package/src/fetch/createFetchWithRetry.ts +1 -1
  81. package/src/fetch/http.types.ts +46 -0
  82. package/src/index.ts +7 -3
  83. package/src/io/ArrayBuffers.ts +7 -3
  84. package/src/io/ByteBuffer.test.ts +33 -6
  85. package/src/io/ByteBuffer.ts +272 -41
  86. package/src/langs/getGlobalStates.ts +21 -0
  87. package/src/langs/getObjectId.ts +20 -0
  88. package/src/langs/isNullish.ts +3 -0
  89. package/src/langs/mixin.test.ts +43 -0
  90. package/src/logging/slog.ts +1 -1
  91. package/src/maths/clamp.test.ts +5 -1
  92. package/src/maths/clamp.ts +7 -7
  93. package/src/maths/random.ts +1 -1
  94. package/src/mitt/README.md +1 -0
  95. package/src/mitt/index.ts +114 -0
  96. package/src/objects/computeIfAbsent.ts +3 -2
  97. package/src/objects/merge/merge.test.ts +1 -1
  98. package/src/schema/typebox/typebox.ts +1 -1
  99. package/src/server/fetch/createFetchWithProxyByUndici.ts +2 -2
  100. package/tsconfig.json +4 -1
  101. package/lib/asyncs/sleep.js +0 -3
  102. package/lib/asyncs/sleep.js.map +0 -1
  103. package/lib/cn/id/Mod11Checksum.js.map +0 -1
  104. package/lib/cn/uscc/Mod31Checksum.js.map +0 -1
  105. package/lib/schema/typebox/gen/codegen/common/encoder.js +0 -94
  106. package/lib/schema/typebox/gen/codegen/common/encoder.js.map +0 -1
  107. package/lib/schema/typebox/gen/codegen/common/formatter.js +0 -33
  108. package/lib/schema/typebox/gen/codegen/common/formatter.js.map +0 -1
  109. package/lib/schema/typebox/gen/codegen/common/index.js +0 -29
  110. package/lib/schema/typebox/gen/codegen/common/index.js.map +0 -1
  111. package/lib/schema/typebox/gen/codegen/common/jsdoc.js +0 -117
  112. package/lib/schema/typebox/gen/codegen/common/jsdoc.js.map +0 -1
  113. package/lib/schema/typebox/gen/codegen/expression/compiler.js +0 -364
  114. package/lib/schema/typebox/gen/codegen/expression/compiler.js.map +0 -1
  115. package/lib/schema/typebox/gen/codegen/expression/errors.js +0 -259
  116. package/lib/schema/typebox/gen/codegen/expression/errors.js.map +0 -1
  117. package/lib/schema/typebox/gen/codegen/expression/evaluator.js +0 -254
  118. package/lib/schema/typebox/gen/codegen/expression/evaluator.js.map +0 -1
  119. package/lib/schema/typebox/gen/codegen/expression/expression.js +0 -381
  120. package/lib/schema/typebox/gen/codegen/expression/expression.js.map +0 -1
  121. package/lib/schema/typebox/gen/codegen/expression/index.js +0 -32
  122. package/lib/schema/typebox/gen/codegen/expression/index.js.map +0 -1
  123. package/lib/schema/typebox/gen/codegen/index.js +0 -29
  124. package/lib/schema/typebox/gen/codegen/index.js.map +0 -1
  125. package/lib/schema/typebox/gen/codegen/model/index.js +0 -40
  126. package/lib/schema/typebox/gen/codegen/model/index.js.map +0 -1
  127. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js +0 -260
  128. package/lib/schema/typebox/gen/codegen/model/model-to-arktype.js.map +0 -1
  129. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js +0 -383
  130. package/lib/schema/typebox/gen/codegen/model/model-to-expression.js.map +0 -1
  131. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js +0 -238
  132. package/lib/schema/typebox/gen/codegen/model/model-to-grpc.js.map +0 -1
  133. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js +0 -274
  134. package/lib/schema/typebox/gen/codegen/model/model-to-io-ts.js.map +0 -1
  135. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js +0 -47
  136. package/lib/schema/typebox/gen/codegen/model/model-to-javascript.js.map +0 -1
  137. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js +0 -192
  138. package/lib/schema/typebox/gen/codegen/model/model-to-json-schema.js.map +0 -1
  139. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js +0 -33
  140. package/lib/schema/typebox/gen/codegen/model/model-to-typebox.js.map +0 -1
  141. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js +0 -188
  142. package/lib/schema/typebox/gen/codegen/model/model-to-typescript.js.map +0 -1
  143. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js +0 -239
  144. package/lib/schema/typebox/gen/codegen/model/model-to-valibot.js.map +0 -1
  145. package/lib/schema/typebox/gen/codegen/model/model-to-value.js +0 -43
  146. package/lib/schema/typebox/gen/codegen/model/model-to-value.js.map +0 -1
  147. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js +0 -227
  148. package/lib/schema/typebox/gen/codegen/model/model-to-yrel.js.map +0 -1
  149. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js +0 -225
  150. package/lib/schema/typebox/gen/codegen/model/model-to-yup.js.map +0 -1
  151. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js +0 -248
  152. package/lib/schema/typebox/gen/codegen/model/model-to-zod.js.map +0 -1
  153. package/lib/schema/typebox/gen/codegen/model/model.js +0 -27
  154. package/lib/schema/typebox/gen/codegen/model/model.js.map +0 -1
  155. package/lib/schema/typebox/gen/codegen/typescript/index.js +0 -28
  156. package/lib/schema/typebox/gen/codegen/typescript/index.js.map +0 -1
  157. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js +0 -72
  158. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-model.js.map +0 -1
  159. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js +0 -620
  160. package/lib/schema/typebox/gen/codegen/typescript/typescript-to-typebox.js.map +0 -1
  161. package/lib/schema/typebox/gen/index.js +0 -3
  162. package/lib/schema/typebox/gen/index.js.map +0 -1
  163. package/src/asyncs/sleep.ts +0 -1
  164. package/src/schema/typebox/gen/codegen/common/encoder.ts +0 -99
  165. package/src/schema/typebox/gen/codegen/common/formatter.ts +0 -31
  166. package/src/schema/typebox/gen/codegen/common/index.ts +0 -29
  167. package/src/schema/typebox/gen/codegen/common/jsdoc.ts +0 -93
  168. package/src/schema/typebox/gen/codegen/expression/compiler.ts +0 -377
  169. package/src/schema/typebox/gen/codegen/expression/errors.ts +0 -302
  170. package/src/schema/typebox/gen/codegen/expression/evaluator.ts +0 -268
  171. package/src/schema/typebox/gen/codegen/expression/expression.ts +0 -538
  172. package/src/schema/typebox/gen/codegen/expression/index.ts +0 -32
  173. package/src/schema/typebox/gen/codegen/index.ts +0 -29
  174. package/src/schema/typebox/gen/codegen/model/index.ts +0 -40
  175. package/src/schema/typebox/gen/codegen/model/model-to-arktype.ts +0 -266
  176. package/src/schema/typebox/gen/codegen/model/model-to-expression.ts +0 -378
  177. package/src/schema/typebox/gen/codegen/model/model-to-grpc.ts +0 -244
  178. package/src/schema/typebox/gen/codegen/model/model-to-io-ts.ts +0 -294
  179. package/src/schema/typebox/gen/codegen/model/model-to-javascript.ts +0 -42
  180. package/src/schema/typebox/gen/codegen/model/model-to-json-schema.ts +0 -166
  181. package/src/schema/typebox/gen/codegen/model/model-to-typebox.ts +0 -32
  182. package/src/schema/typebox/gen/codegen/model/model-to-typescript.ts +0 -189
  183. package/src/schema/typebox/gen/codegen/model/model-to-valibot.ts +0 -236
  184. package/src/schema/typebox/gen/codegen/model/model-to-value.ts +0 -42
  185. package/src/schema/typebox/gen/codegen/model/model-to-yrel.ts +0 -232
  186. package/src/schema/typebox/gen/codegen/model/model-to-yup.ts +0 -226
  187. package/src/schema/typebox/gen/codegen/model/model-to-zod.ts +0 -251
  188. package/src/schema/typebox/gen/codegen/model/model.ts +0 -33
  189. package/src/schema/typebox/gen/codegen/typescript/index.ts +0 -28
  190. package/src/schema/typebox/gen/codegen/typescript/typescript-to-model.ts +0 -61
  191. package/src/schema/typebox/gen/codegen/typescript/typescript-to-typebox.ts +0 -647
  192. package/src/schema/typebox/gen/gen.test.ts +0 -12
  193. package/src/schema/typebox/gen/index.ts +0 -1
  194. /package/src/schema/{typebox/gen/README.md → README.md} +0 -0
@@ -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
- if (len !== bytes.byteLength) bytes = bytes.slice(0, len);
91
- new Uint8Array(this.buffer).set(new Uint8Array(bytes), this.position);
92
- this.position += bytes.byteLength;
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 encoder = new TextEncoder();
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 decoder.decode(bytes);
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
- return this.readUint8() | (this.readUint16() << 8);
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.writeBytes(new Uint8Array(length).buffer);
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
- readInt() {
316
- return this.readInt32();
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
- return this.readFloat32();
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.view.byteLength - this.position;
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,3 @@
1
+ export function isNullish(value: any): value is null | undefined {
2
+ return value === null || value === undefined;
3
+ }
@@ -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
+ }
@@ -1,4 +1,4 @@
1
- import { Logger, LogLevel } from './Logger';
1
+ import type { Logger, LogLevel } from './Logger';
2
2
 
3
3
  enum Level {
4
4
  trace = -8,
@@ -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
  });
@@ -1,23 +1,23 @@
1
- // export function clamp<T>(value: T | null | undefined, o: { min: T; max: T; default?: T }): T;
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 === null || value === undefined) {
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;
@@ -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