@cloudpss/ubjson 0.3.5 → 0.3.8
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/benchmark-string.js +18 -20
- package/benchmark.js +1 -0
- package/dist/{constants.d.ts → common/constants.d.ts} +0 -0
- package/dist/{constants.js → common/constants.js} +0 -0
- package/dist/common/constants.js.map +1 -0
- package/dist/common/decoder.d.ts +48 -0
- package/dist/{decoder.js → common/decoder.js} +13 -18
- package/dist/common/decoder.js.map +1 -0
- package/dist/common/encoder.d.ts +74 -0
- package/dist/common/encoder.js +282 -0
- package/dist/common/encoder.js.map +1 -0
- package/dist/common/string-decoder.d.ts +13 -0
- package/dist/common/string-decoder.js +106 -0
- package/dist/common/string-decoder.js.map +1 -0
- package/dist/{string-encoder.d.ts → common/string-encoder.d.ts} +0 -0
- package/dist/{string-encoder.js → common/string-encoder.js} +0 -0
- package/dist/common/string-encoder.js.map +1 -0
- package/dist/encoder.d.ts +10 -2
- package/dist/encoder.js +2 -283
- package/dist/encoder.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/stream/encoder.d.ts +14 -0
- package/dist/stream/encoder.js +86 -0
- package/dist/stream/encoder.js.map +1 -0
- package/dist/stream/index.d.ts +4 -0
- package/dist/stream/index.js +7 -0
- package/dist/stream/index.js.map +1 -0
- package/index.d.ts +7 -0
- package/jest.config.js +3 -0
- package/package.json +12 -8
- package/src/{constants.ts → common/constants.ts} +0 -0
- package/src/{decoder.ts → common/decoder.ts} +13 -18
- package/src/common/encoder.ts +305 -0
- package/src/common/string-decoder.ts +107 -0
- package/src/{string-encoder.ts → common/string-encoder.ts} +0 -0
- package/src/encoder.ts +4 -305
- package/src/index.ts +14 -2
- package/src/stream/encoder.ts +83 -0
- package/src/stream/index.ts +8 -0
- package/tests/decode.js +433 -0
- package/{test → tests}/e2e.js +19 -27
- package/tests/encode.js +354 -0
- package/tests/stream/encode.js +380 -0
- package/tests/string-encoding.js +71 -0
- package/tests/tsconfig.json +7 -0
- package/tsconfig.json +1 -2
- package/dist/constants.js.map +0 -1
- package/dist/decoder.d.ts +0 -2
- package/dist/decoder.js.map +0 -1
- package/dist/string-decoder.d.ts +0 -9
- package/dist/string-decoder.js +0 -67
- package/dist/string-decoder.js.map +0 -1
- package/dist/string-encoder.js.map +0 -1
- package/src/string-decoder.ts +0 -69
- package/test/decode.js +0 -491
- package/test/encode.js +0 -432
- package/test/string-encoding.js +0 -62
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests from https://bitbucket.org/shelacek/ubjson
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { encode } from '../../dist/stream/index.js';
|
|
6
|
+
import { decode } from '../../dist/index.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {unknown} value
|
|
10
|
+
*/
|
|
11
|
+
function encodeAsync(value) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const reader = encode(value);
|
|
14
|
+
let result = Buffer.alloc(0);
|
|
15
|
+
reader.on('error', reject);
|
|
16
|
+
reader.on('end', () => resolve(result));
|
|
17
|
+
reader.on('data', (chunk) => {
|
|
18
|
+
result = Buffer.concat([result, chunk]);
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
* @param {[ArrayBuffer] | [Uint8Array] | (number | string)[]} args
|
|
26
|
+
* @returns {number[]}
|
|
27
|
+
*/
|
|
28
|
+
function toArray(...args) {
|
|
29
|
+
if (args[0] instanceof ArrayBuffer) {
|
|
30
|
+
return Array.from(new Uint8Array(args[0]));
|
|
31
|
+
}
|
|
32
|
+
if (args[0] instanceof Uint8Array) {
|
|
33
|
+
return Array.from(args[0]);
|
|
34
|
+
}
|
|
35
|
+
return args.map((x) => (typeof x == 'number' ? x : /** @type {string} */ (x).charCodeAt(0)));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
test('encode function', async () => {
|
|
39
|
+
await expect(() => encodeAsync(function () {})).rejects.toThrow();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('encode bigint', async () => {
|
|
43
|
+
await expect(() => encodeAsync(1n)).rejects.toThrow();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('encode symbol', async () => {
|
|
47
|
+
await expect(() => encodeAsync(Symbol('sym'))).rejects.toThrow();
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('encode undefined', async () => {
|
|
51
|
+
expect(toArray(await encodeAsync(undefined))).toEqual(toArray('N'));
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test('encode null', async () => {
|
|
55
|
+
expect(toArray(await encodeAsync(null))).toEqual(toArray('Z'));
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('encode true', async () => {
|
|
59
|
+
expect(toArray(await encodeAsync(true))).toEqual(toArray('T'));
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
test('encode false', async () => {
|
|
63
|
+
expect(toArray(await encodeAsync(false))).toEqual(toArray('F'));
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('encode int8', async () => {
|
|
67
|
+
expect(toArray(await encodeAsync(-1))).toEqual(toArray('i', 255));
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('encode uint8', async () => {
|
|
71
|
+
expect(toArray(await encodeAsync(200))).toEqual(toArray('U', 200));
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('encode int16', async () => {
|
|
75
|
+
expect(toArray(await encodeAsync(0x1234))).toEqual(toArray('I', 0x12, 0x34));
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test('encode int32', async () => {
|
|
79
|
+
expect(toArray(await encodeAsync(0x12345678))).toEqual(toArray('l', 0x12, 0x34, 0x56, 0x78));
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
test('encode float32', async () => {
|
|
83
|
+
expect(toArray(await encodeAsync(1.00390625))).toEqual(toArray('d', 0x3f, 0x80, 0x80, 0x00));
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test('encode float32 (too large integer)', async () => {
|
|
87
|
+
expect(toArray(await encodeAsync(2147483648))).toEqual(toArray('d', 0x4f, 0x00, 0x00, 0x00));
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('encode float64', async () => {
|
|
91
|
+
expect(toArray(await encodeAsync(100000.00390625))).toEqual(
|
|
92
|
+
toArray('D', 0x40, 0xf8, 0x6a, 0x00, 0x10, 0x00, 0x00, 0x00),
|
|
93
|
+
);
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('encode char', async () => {
|
|
97
|
+
expect(toArray(await encodeAsync('a'))).toEqual(toArray('C', 'a'));
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test('encode char 128', async () => {
|
|
101
|
+
expect(toArray(await encodeAsync('\xcc'))).toEqual(toArray('C', '\xcc'));
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('encode char 257', async () => {
|
|
105
|
+
expect(toArray(await encodeAsync('\u0123'))).toEqual(toArray('S', 'i', 2, 196, 163));
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('encode char emoji', async () => {
|
|
109
|
+
expect(toArray(await encodeAsync('💖'))).toEqual(toArray('S', 'i', 4, 240, 159, 146, 150));
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test('encode string', async () => {
|
|
113
|
+
expect(toArray(await encodeAsync('ubjson'))).toEqual(toArray('S', 'i', 6, 'u', 'b', 'j', 's', 'o', 'n'));
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('encode string (no encodeInto)', async () => {
|
|
117
|
+
const encodeInto = TextEncoder.prototype.encodeInto;
|
|
118
|
+
// @ts-ignore
|
|
119
|
+
TextEncoder.prototype.encodeInto = undefined;
|
|
120
|
+
expect(toArray(await encodeAsync('ubjson'))).toEqual(toArray('S', 'i', 6, 'u', 'b', 'j', 's', 'o', 'n'));
|
|
121
|
+
|
|
122
|
+
TextEncoder.prototype.encodeInto = encodeInto;
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test('encode array', async () => {
|
|
126
|
+
expect(toArray(await encodeAsync([1, 2, 3, -1]))).toEqual(toArray('[', 'U', 1, 'U', 2, 'U', 3, 'i', 255, ']'));
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test('encode array (empty)', async () => {
|
|
130
|
+
expect(toArray(await encodeAsync([]))).toEqual(toArray('[', ']'));
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test('encode array (undefined)', async () => {
|
|
134
|
+
expect(toArray(await encodeAsync([undefined]))).toEqual(toArray('[', 'Z', ']'));
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('encode array (spares)', async () => {
|
|
138
|
+
const array = new Array(3);
|
|
139
|
+
array[1] = true;
|
|
140
|
+
expect(toArray(await encodeAsync(array))).toEqual(toArray('[', 'Z', 'T', 'Z', ']'));
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test('encode array (mixed)', async () => {
|
|
144
|
+
expect(toArray(await encodeAsync([1, 'a', true]))).toEqual(toArray('[', 'U', 1, 'C', 'a', 'T', ']'));
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('encode array (int8)', async () => {
|
|
148
|
+
expect(toArray(await encodeAsync([-1, 2, 3]))).toEqual(toArray('[', 'i', 255, 'U', 2, 'U', 3, ']'));
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('encode array (int16)', async () => {
|
|
152
|
+
expect(toArray(await encodeAsync([255, -1]))).toEqual(toArray('[', 'U', 0xff, 'i', 0xff, ']'));
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('encode array (only null values)', async () => {
|
|
156
|
+
expect(toArray(await encodeAsync([null, null, null]))).toEqual(toArray('[', 'Z', 'Z', 'Z', ']'));
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('encode N-D array', async () => {
|
|
160
|
+
expect(
|
|
161
|
+
decode(
|
|
162
|
+
await encodeAsync([
|
|
163
|
+
[1, 2, 3],
|
|
164
|
+
[4, 5, 6],
|
|
165
|
+
]),
|
|
166
|
+
),
|
|
167
|
+
).toEqual([
|
|
168
|
+
[1, 2, 3],
|
|
169
|
+
[4, 5, 6],
|
|
170
|
+
]);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('encode array of objects', async () => {
|
|
174
|
+
expect(
|
|
175
|
+
decode(
|
|
176
|
+
await encodeAsync([
|
|
177
|
+
{ a: 1, b: 2, c: 3 },
|
|
178
|
+
{ d: 4, e: 5, f: 6 },
|
|
179
|
+
]),
|
|
180
|
+
),
|
|
181
|
+
).toEqual([
|
|
182
|
+
{ a: 1, b: 2, c: 3 },
|
|
183
|
+
{ d: 4, e: 5, f: 6 },
|
|
184
|
+
]);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test('encode array of objects of arrays', async () => {
|
|
188
|
+
expect(
|
|
189
|
+
decode(
|
|
190
|
+
await encodeAsync([
|
|
191
|
+
{ a: [1, 2], b: [3, 4] },
|
|
192
|
+
{ c: [5, 6], d: [7, 8] },
|
|
193
|
+
]),
|
|
194
|
+
),
|
|
195
|
+
).toEqual([
|
|
196
|
+
{ a: [1, 2], b: [3, 4] },
|
|
197
|
+
{ c: [5, 6], d: [7, 8] },
|
|
198
|
+
]);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
test('encode array (int8 typed array)', async () => {
|
|
202
|
+
expect(toArray(await encodeAsync(Int8Array.from([18, -2])))).toEqual(
|
|
203
|
+
toArray('[', '$', 'i', '#', 'i', 2, 0x12, 0xfe),
|
|
204
|
+
);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test('encode array (uint8 typed array)', async () => {
|
|
208
|
+
expect(toArray(await encodeAsync(Uint8Array.from([18, 254])))).toEqual(
|
|
209
|
+
toArray('[', '$', 'U', '#', 'i', 2, 0x12, 0xfe),
|
|
210
|
+
);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test('encode array (int16 typed array)', async () => {
|
|
214
|
+
expect(toArray(await encodeAsync(Int16Array.from([4660, -292])))).toEqual(
|
|
215
|
+
toArray('[', '$', 'I', '#', 'i', 2, 0x12, 0x34, 0xfe, 0xdc),
|
|
216
|
+
);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test('encode array (int32 typed array)', async () => {
|
|
220
|
+
expect(toArray(await encodeAsync(Int32Array.from([305419896, -19088744])))).toEqual(
|
|
221
|
+
toArray('[', '$', 'l', '#', 'i', 2, 0x12, 0x34, 0x56, 0x78, 0xfe, 0xdc, 0xba, 0x98),
|
|
222
|
+
);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test('encode array (float32 typed array)', async () => {
|
|
226
|
+
expect(toArray(await encodeAsync(Float32Array.from([0.25, 0.125])))).toEqual(
|
|
227
|
+
toArray('[', '$', 'd', '#', 'i', 2, 0x3e, 0x80, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00),
|
|
228
|
+
);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test('encode array (float64 typed array)', async () => {
|
|
232
|
+
expect(toArray(await encodeAsync(Float64Array.from([0.25, 0.125])))).toEqual(
|
|
233
|
+
toArray(
|
|
234
|
+
'[',
|
|
235
|
+
'$',
|
|
236
|
+
'D',
|
|
237
|
+
'#',
|
|
238
|
+
'i',
|
|
239
|
+
2,
|
|
240
|
+
0x3f,
|
|
241
|
+
0xd0,
|
|
242
|
+
0x00,
|
|
243
|
+
0x00,
|
|
244
|
+
0x00,
|
|
245
|
+
0x00,
|
|
246
|
+
0x00,
|
|
247
|
+
0x00,
|
|
248
|
+
0x3f,
|
|
249
|
+
0xc0,
|
|
250
|
+
0x00,
|
|
251
|
+
0x00,
|
|
252
|
+
0x00,
|
|
253
|
+
0x00,
|
|
254
|
+
0x00,
|
|
255
|
+
0x00,
|
|
256
|
+
),
|
|
257
|
+
);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
test('encode array (uint8clamped typed array)', async () => {
|
|
261
|
+
await expect(() => encodeAsync(new Uint8ClampedArray())).rejects.toThrow();
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
test('encode array (uint16 typed array)', async () => {
|
|
265
|
+
await expect(() => encodeAsync(new Uint16Array())).rejects.toThrow();
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test('encode array (uint32 typed array)', async () => {
|
|
269
|
+
await expect(() => encodeAsync(new Uint32Array())).rejects.toThrow();
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
test('encode array (uint64 typed array)', async () => {
|
|
273
|
+
await expect(() => encodeAsync(new BigUint64Array())).rejects.toThrow();
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test('encode array (int64 typed array)', async () => {
|
|
277
|
+
await expect(() => encodeAsync(new BigInt64Array())).rejects.toThrow();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
test('encode object', async () => {
|
|
281
|
+
expect(toArray(await encodeAsync({ a: 1, b: 2, c: 3 }))).toEqual(
|
|
282
|
+
toArray('{', 'i', 1, 'a', 'U', 1, 'i', 1, 'b', 'U', 2, 'i', 1, 'c', 'U', 3, '}'),
|
|
283
|
+
);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
test('encode object (empty)', async () => {
|
|
287
|
+
expect(toArray(await encodeAsync({}))).toEqual(toArray('{', '}'));
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
test('encode object (empty key)', async () => {
|
|
291
|
+
expect(toArray(await encodeAsync({ '': '' }))).toEqual(toArray('{', 'i', 0, 'S', 'i', 0, '}'));
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
test('encode object (mixed)', async () => {
|
|
295
|
+
expect(toArray(await encodeAsync({ a: 1, b: 'a', c: true }))).toEqual(
|
|
296
|
+
toArray('{', 'i', 1, 'a', 'U', 1, 'i', 1, 'b', 'C', 'a', 'i', 1, 'c', 'T', '}'),
|
|
297
|
+
);
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
test('encode object (only null values)', async () => {
|
|
301
|
+
expect(toArray(await encodeAsync({ a: null, b: null, c: null }))).toEqual(
|
|
302
|
+
toArray('{', 'i', 1, 'a', 'Z', 'i', 1, 'b', 'Z', 'i', 1, 'c', 'Z', '}'),
|
|
303
|
+
);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
test('encode object (skip prototype)', async () => {
|
|
307
|
+
const obj = Object.create({ a: 2, x: 'xx' });
|
|
308
|
+
obj.a = 1;
|
|
309
|
+
obj.b = 'a';
|
|
310
|
+
obj.c = true;
|
|
311
|
+
expect(toArray(await encodeAsync(obj))).toEqual(
|
|
312
|
+
toArray('{', 'i', 1, 'a', 'U', 1, 'i', 1, 'b', 'C', 'a', 'i', 1, 'c', 'T', '}'),
|
|
313
|
+
);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
test('encode object (skip symbol)', async () => {
|
|
317
|
+
const obj = { [Symbol()]: true, a: 1 };
|
|
318
|
+
expect(toArray(await encodeAsync(obj))).toEqual(toArray('{', 'i', 1, 'a', 'U', 1, '}'));
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
test('encode object (skip non-enumerable)', async () => {
|
|
322
|
+
const obj = {};
|
|
323
|
+
Object.defineProperty(obj, 'a', { value: 1, configurable: true, writable: true });
|
|
324
|
+
expect(toArray(await encodeAsync(obj))).toEqual(toArray('{', '}'));
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
test('encode object (include getter)', async () => {
|
|
328
|
+
const obj = {};
|
|
329
|
+
Object.defineProperty(obj, 'a', { get: () => 1, enumerable: true });
|
|
330
|
+
expect(toArray(await encodeAsync(obj))).toEqual(toArray('{', 'i', 1, 'a', 'U', 1, '}'));
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
test('encode object (skip undefined)', async () => {
|
|
334
|
+
const obj = { a: undefined };
|
|
335
|
+
expect(toArray(await encodeAsync(obj))).toEqual(toArray('{', '}'));
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
test('encode object (function) [error]', async () => {
|
|
339
|
+
const obj = { a: () => {} };
|
|
340
|
+
await expect(() => encodeAsync(obj)).rejects.toThrow(/Unsupported type \[object Function\]/);
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
test('encode object (include null)', async () => {
|
|
344
|
+
const obj = { a: null };
|
|
345
|
+
expect(toArray(await encodeAsync(obj))).toEqual(toArray('{', 'i', 1, 'a', 'Z', '}'));
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
test('encode huge typed array (16K)', async () => {
|
|
349
|
+
const obj = new Uint8Array(16 * 1024);
|
|
350
|
+
expect(toArray((await encodeAsync(obj)).slice(0, 8))).toEqual(toArray('[', '$', 'U', '#', 'I', 0x40, 0x00, 0));
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
test('encode huge typed array (~128M)', async () => {
|
|
354
|
+
const obj = new Uint8Array(128 * 1024 * 1024 - 10);
|
|
355
|
+
expect(toArray((await encodeAsync(obj)).slice(0, 10))).toEqual(
|
|
356
|
+
toArray('[', '$', 'U', '#', 'l', 0x7, 0xff, 0xff, 0xf6, 0),
|
|
357
|
+
);
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
test('encode huge typed array (256M + 1) [error]', async () => {
|
|
361
|
+
const obj = new Uint8Array(256 * 1024 * 1024 + 1);
|
|
362
|
+
await expect(() => encodeAsync(obj)).rejects.toThrow(/Buffer has exceed max size/);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
test('encode huge typed array (3G) [error]', async () => {
|
|
366
|
+
const obj = new Uint8Array(3 * 1024 * 1024 * 1024);
|
|
367
|
+
await expect(() => encodeAsync(obj)).rejects.toThrow(/Buffer has exceed max size/);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
test('encode huge data (~128M)', async () => {
|
|
371
|
+
const obj = [new Uint8Array(128 * 1024 * 1024 - 20)];
|
|
372
|
+
expect(toArray((await encodeAsync(obj)).slice(0, 11))).toEqual(
|
|
373
|
+
toArray('[', '[', '$', 'U', '#', 'l', 0x7, 0xff, 0xff, 0xec, 0),
|
|
374
|
+
);
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
test('encode huge data (256M + 1) [error]', async () => {
|
|
378
|
+
const obj = [new Uint8Array(256 * 1024 * 1024 + 1)];
|
|
379
|
+
await expect(() => encodeAsync(obj)).rejects.toThrow(/Buffer has exceed max size/);
|
|
380
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { StringEncoder } from '../dist/common/string-encoder.js';
|
|
2
|
+
import { StringDecoder } from '../dist/common/string-decoder.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* @param {Pick<TextEncoder, 'encode'>} encoder
|
|
7
|
+
* @param {Pick<TextDecoder, 'decode'>} decoder
|
|
8
|
+
*/
|
|
9
|
+
function testEncoding(encoder, decoder) {
|
|
10
|
+
expect(decoder.decode(encoder.encode(''))).toEqual('');
|
|
11
|
+
expect(decoder.decode(encoder.encode('p4'))).toEqual('p4');
|
|
12
|
+
expect(decoder.decode(encoder.encode('t0'))).toEqual('t0');
|
|
13
|
+
expect(decoder.decode(encoder.encode('ab'))).toEqual('ab');
|
|
14
|
+
expect(decoder.decode(encoder.encode('ba'))).toEqual('ba');
|
|
15
|
+
expect(decoder.decode(encoder.encode('123456'))).toEqual('123456');
|
|
16
|
+
expect(decoder.decode(encoder.encode('123465'))).toEqual('123465');
|
|
17
|
+
expect(decoder.decode(encoder.encode('1234651'))).toEqual('1234651');
|
|
18
|
+
expect(decoder.decode(encoder.encode('1234651'))).toEqual('1234651');
|
|
19
|
+
expect(decoder.decode(encoder.encode('abc 你好 😊🤣'))).toEqual('abc 你好 😊🤣');
|
|
20
|
+
expect(decoder.decode(encoder.encode('abc 你好 😊🤣'.repeat(1000)))).toEqual('abc 你好 😊🤣'.repeat(1000));
|
|
21
|
+
|
|
22
|
+
{
|
|
23
|
+
// 检查所有单字节
|
|
24
|
+
for (let index = 0; index < 0xffff; index++) {
|
|
25
|
+
// 跳过 Surrogate
|
|
26
|
+
if (index >= 0xd800 && index <= 0xdfff) continue;
|
|
27
|
+
const expected = String.fromCharCode(index);
|
|
28
|
+
const actual = decoder.decode(encoder.encode(expected));
|
|
29
|
+
if (expected !== actual) expect(actual).toEqual(expected);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
{
|
|
34
|
+
// 检查所有代理项
|
|
35
|
+
for (let index = 0x10000; index < 0x10ffff; index++) {
|
|
36
|
+
const expected = String.fromCodePoint(index);
|
|
37
|
+
const actual = decoder.decode(encoder.encode(expected));
|
|
38
|
+
if (expected !== actual) expect(actual).toEqual(expected);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
{
|
|
43
|
+
// 检查所有 2 字节 ASCII
|
|
44
|
+
for (let index = 0; index < 0x80; index++) {
|
|
45
|
+
for (let index2 = 0; index2 < 0x80; index2++) {
|
|
46
|
+
const expected = String.fromCharCode(index, index2);
|
|
47
|
+
const actual = decoder.decode(encoder.encode(expected));
|
|
48
|
+
if (expected !== actual) expect(actual).toEqual(expected);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
test('encode string', () => {
|
|
55
|
+
testEncoding(new StringEncoder(), new TextDecoder('utf-8', { ignoreBOM: true, fatal: false }));
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('decode string', () => {
|
|
59
|
+
testEncoding(
|
|
60
|
+
new TextEncoder(),
|
|
61
|
+
new (class extends StringDecoder {
|
|
62
|
+
/**
|
|
63
|
+
* @override
|
|
64
|
+
* @param {Uint8Array} buffer
|
|
65
|
+
*/
|
|
66
|
+
decode(buffer) {
|
|
67
|
+
return super.decode(buffer, 0, buffer.byteLength);
|
|
68
|
+
}
|
|
69
|
+
})(),
|
|
70
|
+
);
|
|
71
|
+
});
|
package/tsconfig.json
CHANGED
package/dist/constants.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAExC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/decoder.d.ts
DELETED
package/dist/decoder.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decoder.js","sourceRoot":"","sources":["../src/decoder.ts"],"names":[],"mappings":"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"}
|
package/dist/string-decoder.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export declare const textDecoder: TextDecoder;
|
|
2
|
-
export declare const decodeAscii: (array: Uint8Array) => string;
|
|
3
|
-
/** 特别优化字符串解码速度 */
|
|
4
|
-
export declare class StringDecoder {
|
|
5
|
-
/** 小字符串缓存 */
|
|
6
|
-
private readonly cache;
|
|
7
|
-
/** 字符串解码 */
|
|
8
|
-
decode(data: Uint8Array): string;
|
|
9
|
-
}
|
package/dist/string-decoder.js
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
export const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: false });
|
|
2
|
-
export const decodeAscii = (() => {
|
|
3
|
-
try {
|
|
4
|
-
const fastDecodeAscii = String.fromCharCode.apply.bind(String.fromCharCode, String);
|
|
5
|
-
// 检查能否直接向 `String.fromCharCode.apply` 传入 `Uint8Array`
|
|
6
|
-
if ('\0\x01\x7f' === fastDecodeAscii(Uint8Array.from([0, 1, 0x7f])))
|
|
7
|
-
return fastDecodeAscii;
|
|
8
|
-
/* c8 ignore next 1 */
|
|
9
|
-
}
|
|
10
|
-
catch {
|
|
11
|
-
/* c8 ignore next 2 */
|
|
12
|
-
}
|
|
13
|
-
return (array) => String.fromCharCode(...array);
|
|
14
|
-
})();
|
|
15
|
-
/** 解码 */
|
|
16
|
-
function decode(data) {
|
|
17
|
-
if (data.byteLength < 50 && // 只有小字符串有优化价值,见 benchmark-string.js
|
|
18
|
-
data.every((b) => b < 128)) {
|
|
19
|
-
// 为 ASCII 字符串优化
|
|
20
|
-
return decodeAscii(data);
|
|
21
|
-
}
|
|
22
|
-
// 使用系统解码
|
|
23
|
-
return textDecoder.decode(data);
|
|
24
|
-
}
|
|
25
|
-
/** 特别优化字符串解码速度 */
|
|
26
|
-
export class StringDecoder {
|
|
27
|
-
constructor() {
|
|
28
|
-
/** 小字符串缓存 */
|
|
29
|
-
this.cache = [
|
|
30
|
-
undefined,
|
|
31
|
-
undefined,
|
|
32
|
-
new Map(),
|
|
33
|
-
new Map(),
|
|
34
|
-
new Map(),
|
|
35
|
-
new Map(),
|
|
36
|
-
new Map(), // 6 字节
|
|
37
|
-
];
|
|
38
|
-
}
|
|
39
|
-
/** 字符串解码 */
|
|
40
|
-
decode(data) {
|
|
41
|
-
const length = data.byteLength;
|
|
42
|
-
// 这里,length 类型为 Uint32
|
|
43
|
-
if (length > 6)
|
|
44
|
-
return decode(data);
|
|
45
|
-
// 这里,length 类型为 0 | 1 | 2 | 3 | 4 | 5 | 6
|
|
46
|
-
// 为小字符串优化
|
|
47
|
-
if (length === 0)
|
|
48
|
-
return '';
|
|
49
|
-
if (length === 1)
|
|
50
|
-
return String.fromCharCode(data[0]);
|
|
51
|
-
// number 最多存储 6 字节数据
|
|
52
|
-
const cache = this.cache[length];
|
|
53
|
-
// 计算缓存 key
|
|
54
|
-
let key = 0;
|
|
55
|
-
for (const byte of data) {
|
|
56
|
-
key *= 256;
|
|
57
|
-
key += byte;
|
|
58
|
-
}
|
|
59
|
-
const match = cache.get(key);
|
|
60
|
-
if (match != null)
|
|
61
|
-
return match;
|
|
62
|
-
const string = decode(data);
|
|
63
|
-
cache.set(key, string);
|
|
64
|
-
return string;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=string-decoder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string-decoder.js","sourceRoot":"","sources":["../src/string-decoder.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAEvF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;IAC7B,IAAI;QACA,MAAM,eAAe,GAAkC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CACjF,MAAM,CAAC,YAAY,EACnB,MAAM,CAC8B,CAAC;QAEzC,sDAAsD;QACtD,IAAI,YAAY,KAAK,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,eAAe,CAAC;QAC5F,sBAAsB;KACzB;IAAC,MAAM;QACJ,sBAAsB;KACzB;IACD,OAAO,CAAC,KAAiB,EAAU,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC;AACxE,CAAC,CAAC,EAAE,CAAC;AAEL,SAAS;AACT,SAAS,MAAM,CAAC,IAAgB;IAC5B,IACI,IAAI,CAAC,UAAU,GAAG,EAAE,IAAI,oCAAoC;QAC5D,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAC5B;QACE,gBAAgB;QAChB,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;KAC5B;IACD,SAAS;IACT,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED,kBAAkB;AAClB,MAAM,OAAO,aAAa;IAA1B;QACI,aAAa;QACI,UAAK,GAAG;YACrB,SAAS;YACT,SAAS;YACT,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB;YACzB,IAAI,GAAG,EAAkB,EAAE,OAAO;SAC5B,CAAC;IA0Bf,CAAC;IAxBG,YAAY;IACZ,MAAM,CAAC,IAAgB;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAuC,CAAC;QAC5D,uBAAuB;QACvB,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpC,0CAA0C;QAC1C,UAAU;QACV,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5B,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,qBAAqB;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,WAAW;QACX,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;YACrB,GAAG,IAAI,GAAG,CAAC;YACX,GAAG,IAAI,IAAI,CAAC;SACf;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"string-encoder.js","sourceRoot":"","sources":["../src/string-encoder.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,MAAM,OAAO,aAAc,SAAQ,WAAW;IAA9C;;QACqB,UAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IA+B3D,CAAC;IA7BG,YAAY;IACH,MAAM,CAAC,KAAa;QACzB,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE;YACnB,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC9B;QACD,SAAS;QACT,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,IAAI,EAAE;YACb,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,EAAE,IAAI,GAAG,EAAE;oBACX,OAAO,GAAG,KAAK,CAAC;oBAChB,MAAM;iBACT;aACJ;YACD,IAAI,OAAO,EAAE;gBACT,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;oBACnC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;iBACnB;aACJ;iBAAM;gBACH,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAC7B;YACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;SAC9B;QACD,OAAO,GAAG,CAAC;IACf,CAAC;CACJ"}
|
package/src/string-decoder.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
export const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: false });
|
|
2
|
-
|
|
3
|
-
export const decodeAscii = (() => {
|
|
4
|
-
try {
|
|
5
|
-
const fastDecodeAscii: (array: Uint8Array) => string = String.fromCharCode.apply.bind(
|
|
6
|
-
String.fromCharCode,
|
|
7
|
-
String,
|
|
8
|
-
) as (array: Iterable<number>) => string;
|
|
9
|
-
|
|
10
|
-
// 检查能否直接向 `String.fromCharCode.apply` 传入 `Uint8Array`
|
|
11
|
-
if ('\0\x01\x7f' === fastDecodeAscii(Uint8Array.from([0, 1, 0x7f]))) return fastDecodeAscii;
|
|
12
|
-
/* c8 ignore next 1 */
|
|
13
|
-
} catch {
|
|
14
|
-
/* c8 ignore next 2 */
|
|
15
|
-
}
|
|
16
|
-
return (array: Uint8Array): string => String.fromCharCode(...array);
|
|
17
|
-
})();
|
|
18
|
-
|
|
19
|
-
/** 解码 */
|
|
20
|
-
function decode(data: Uint8Array): string {
|
|
21
|
-
if (
|
|
22
|
-
data.byteLength < 50 && // 只有小字符串有优化价值,见 benchmark-string.js
|
|
23
|
-
data.every((b) => b < 128)
|
|
24
|
-
) {
|
|
25
|
-
// 为 ASCII 字符串优化
|
|
26
|
-
return decodeAscii(data);
|
|
27
|
-
}
|
|
28
|
-
// 使用系统解码
|
|
29
|
-
return textDecoder.decode(data);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** 特别优化字符串解码速度 */
|
|
33
|
-
export class StringDecoder {
|
|
34
|
-
/** 小字符串缓存 */
|
|
35
|
-
private readonly cache = [
|
|
36
|
-
undefined, // 0 字节字符串,直接返回
|
|
37
|
-
undefined, // 1 字节字符串,使用 String.fromCharCode,兼容 UTF8
|
|
38
|
-
new Map<number, string>(), // 2 字节
|
|
39
|
-
new Map<number, string>(), // 3 字节
|
|
40
|
-
new Map<number, string>(), // 4 字节
|
|
41
|
-
new Map<number, string>(), // 5 字节
|
|
42
|
-
new Map<number, string>(), // 6 字节
|
|
43
|
-
] as const;
|
|
44
|
-
|
|
45
|
-
/** 字符串解码 */
|
|
46
|
-
decode(data: Uint8Array): string {
|
|
47
|
-
const length = data.byteLength as 0 | 1 | 2 | 3 | 4 | 5 | 6;
|
|
48
|
-
// 这里,length 类型为 Uint32
|
|
49
|
-
if (length > 6) return decode(data);
|
|
50
|
-
|
|
51
|
-
// 这里,length 类型为 0 | 1 | 2 | 3 | 4 | 5 | 6
|
|
52
|
-
// 为小字符串优化
|
|
53
|
-
if (length === 0) return '';
|
|
54
|
-
if (length === 1) return String.fromCharCode(data[0]);
|
|
55
|
-
// number 最多存储 6 字节数据
|
|
56
|
-
const cache = this.cache[length];
|
|
57
|
-
// 计算缓存 key
|
|
58
|
-
let key = 0;
|
|
59
|
-
for (const byte of data) {
|
|
60
|
-
key *= 256;
|
|
61
|
-
key += byte;
|
|
62
|
-
}
|
|
63
|
-
const match = cache.get(key);
|
|
64
|
-
if (match != null) return match;
|
|
65
|
-
const string = decode(data);
|
|
66
|
-
cache.set(key, string);
|
|
67
|
-
return string;
|
|
68
|
-
}
|
|
69
|
-
}
|