@cloudpss/ubjson 0.4.32 → 0.4.33

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 (56) hide show
  1. package/dist/common/constants.d.ts +22 -20
  2. package/dist/common/constants.js +1 -21
  3. package/dist/common/constants.js.map +1 -1
  4. package/dist/common/decoder.d.ts +4 -20
  5. package/dist/common/decoder.js +217 -178
  6. package/dist/common/decoder.js.map +1 -1
  7. package/dist/common/encoder.d.ts +4 -52
  8. package/dist/common/encoder.js +215 -259
  9. package/dist/common/encoder.js.map +1 -1
  10. package/dist/common/string-decoder.d.ts +3 -8
  11. package/dist/common/string-decoder.js +190 -46
  12. package/dist/common/string-decoder.js.map +1 -1
  13. package/dist/common/string-encoder.d.ts +2 -8
  14. package/dist/common/string-encoder.js +4 -44
  15. package/dist/common/string-encoder.js.map +1 -1
  16. package/dist/encoder.js +2 -21
  17. package/dist/encoder.js.map +1 -1
  18. package/dist/index.d.ts +1 -2
  19. package/dist/index.js +2 -4
  20. package/dist/index.js.map +1 -1
  21. package/dist/rxjs/decoder.js +2 -2
  22. package/dist/rxjs/decoder.js.map +1 -1
  23. package/dist/rxjs/index.d.ts +1 -0
  24. package/dist/rxjs/index.js +1 -0
  25. package/dist/rxjs/index.js.map +1 -1
  26. package/dist/stream/index.d.ts +1 -0
  27. package/dist/stream/index.js +2 -1
  28. package/dist/stream/index.js.map +1 -1
  29. package/dist/stream-helper/decoder.d.ts +1 -1
  30. package/dist/stream-helper/decoder.js +1 -1
  31. package/dist/stream-helper/decoder.js.map +1 -1
  32. package/dist/utils.d.ts +5 -1
  33. package/dist/utils.js +13 -4
  34. package/dist/utils.js.map +1 -1
  35. package/package.json +3 -2
  36. package/src/common/constants.ts +22 -21
  37. package/src/common/decoder.ts +197 -162
  38. package/src/common/encoder.ts +200 -275
  39. package/src/common/string-decoder.ts +173 -41
  40. package/src/common/string-encoder.ts +6 -41
  41. package/src/encoder.ts +2 -16
  42. package/src/index.ts +2 -5
  43. package/src/rxjs/decoder.ts +2 -2
  44. package/src/rxjs/index.ts +1 -0
  45. package/src/stream/index.ts +2 -0
  46. package/src/stream-helper/decoder.ts +1 -1
  47. package/src/utils.ts +14 -4
  48. package/tests/decode.js +69 -5
  49. package/tests/e2e.js +12 -1
  50. package/tests/encode.js +33 -16
  51. package/tests/rxjs/decode.js +3 -2
  52. package/tests/rxjs/encode.js +2 -3
  53. package/tests/stream/decode.js +2 -1
  54. package/tests/stream/encode.js +2 -3
  55. package/tests/string-encoding.js +77 -25
  56. package/tsconfig.json +3 -1
@@ -5,6 +5,7 @@ import { jest } from '@jest/globals';
5
5
  import { firstValueFrom, of, Subject } from 'rxjs';
6
6
  import { decode as decodePipe } from '../../dist/rxjs/index.js';
7
7
  import { toBuffer } from '../.utils.js';
8
+ import { UnexpectedEof } from '../../dist/utils.js';
8
9
 
9
10
  /**
10
11
  * 包装为 promise
@@ -109,7 +110,7 @@ test('decode string (bad size) [error]', async () => {
109
110
  });
110
111
 
111
112
  test('decode string (unexpected eof) [error]', async () => {
112
- await expect(() => decode(toBuffer('S', 'i', 2, 'x'))).rejects.toThrow(/Unexpected EOF/);
113
+ await expect(() => decode(toBuffer('S', 'i', 2, 'x'))).rejects.toThrow(UnexpectedEof);
113
114
  });
114
115
 
115
116
  test('decode ascii string', async () => {
@@ -306,7 +307,7 @@ test('decode array of objects of arrays (optimized)', async () => {
306
307
  });
307
308
 
308
309
  test('decode array (strongly typed, unexpected eof, optimized)', async () => {
309
- await expect(() => decode(toBuffer('[', '$', 'i', '#', 'i', 3, 1, 2))).rejects.toThrow();
310
+ await expect(() => decode(toBuffer('[', '$', 'i', '#', 'i', 3, 1, 2))).rejects.toThrow(UnexpectedEof);
310
311
  });
311
312
 
312
313
  test('decode array (strongly typed, invalid length value, optimized)', async () => {
@@ -85,8 +85,8 @@ test('encode char', async () => {
85
85
  expect(toArray(await encodeAsync('a'))).toEqual(toArray('C', 'a'));
86
86
  });
87
87
 
88
- test('encode char 128', async () => {
89
- expect(toArray(await encodeAsync('\u00CC'))).toEqual(toArray('C', '\u00CC'));
88
+ test('encode char 127', async () => {
89
+ expect(toArray(await encodeAsync('\u007F'))).toEqual(toArray('C', '\u007F'));
90
90
  });
91
91
 
92
92
  test('encode char 257', async () => {
@@ -109,7 +109,6 @@ test('encode huge string', async () => {
109
109
  test('encode string (no encodeInto)', async () => {
110
110
  // eslint-disable-next-line @typescript-eslint/unbound-method
111
111
  const encodeInto = TextEncoder.prototype.encodeInto;
112
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
113
112
  // @ts-expect-error 移除 encodeInto 以测试兼容性
114
113
  TextEncoder.prototype.encodeInto = undefined;
115
114
  expect(toArray(await encodeAsync('ubjson'))).toEqual(toArray('S', 'i', 6, 'u', 'b', 'j', 's', 'o', 'n'));
@@ -5,6 +5,7 @@ import { jest } from '@jest/globals';
5
5
  import { Readable } from 'node:stream';
6
6
  import { decoder as decodeStream, decode as decodeAsync } from '../../dist/stream/index.js';
7
7
  import { toBuffer } from '../.utils.js';
8
+ import { UnexpectedEof } from '../../dist/utils.js';
8
9
 
9
10
  /**
10
11
  * 包装为 promise
@@ -104,7 +105,7 @@ test('decode string (bad size) [error]', async () => {
104
105
  });
105
106
 
106
107
  test('decode string (unexpected eof) [error]', async () => {
107
- await expect(() => decode(toBuffer('S', 'i', 2, 'x'))).rejects.toThrow(/Unexpected EOF/);
108
+ await expect(() => decode(toBuffer('S', 'i', 2, 'x'))).rejects.toThrow(UnexpectedEof);
108
109
  });
109
110
 
110
111
  test('decode ascii string', async () => {
@@ -80,8 +80,8 @@ test('encode char', async () => {
80
80
  expect(toArray(await encodeAsync('a'))).toEqual(toArray('C', 'a'));
81
81
  });
82
82
 
83
- test('encode char 128', async () => {
84
- expect(toArray(await encodeAsync('\u00CC'))).toEqual(toArray('C', '\u00CC'));
83
+ test('encode char 127', async () => {
84
+ expect(toArray(await encodeAsync('\u007F'))).toEqual(toArray('C', '\u007F'));
85
85
  });
86
86
 
87
87
  test('encode char 257', async () => {
@@ -104,7 +104,6 @@ test('encode huge string', async () => {
104
104
  test('encode string (no encodeInto)', async () => {
105
105
  // eslint-disable-next-line @typescript-eslint/unbound-method
106
106
  const encodeInto = TextEncoder.prototype.encodeInto;
107
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
108
107
  // @ts-expect-error 移除 encodeInto 以测试兼容性
109
108
  TextEncoder.prototype.encodeInto = undefined;
110
109
  expect(toArray(await encodeAsync('ubjson'))).toEqual(toArray('S', 'i', 6, 'u', 'b', 'j', 's', 'o', 'n'));
@@ -1,5 +1,6 @@
1
- import { StringEncoder } from '../dist/common/string-encoder.js';
2
- import { StringDecoder, decodeJs } from '../dist/common/string-decoder.js';
1
+ import { Encoder } from '../dist/encoder.js';
2
+ import { decode, decodeKey, decodeJs } from '../dist/common/string-decoder.js';
3
+ import '../dist/common/constants.js';
3
4
 
4
5
  /**
5
6
  * 测试编码
@@ -9,25 +10,59 @@ function testEncoding(
9
10
  /** @type {Pick<TextDecoder, 'decode'>} */ decoder,
10
11
  ) {
11
12
  expect(decoder.decode(encoder.encode(''))).toEqual('');
13
+ expect(decoder.decode(encoder.encode('a'))).toEqual('a');
12
14
  expect(decoder.decode(encoder.encode('p4'))).toEqual('p4');
13
15
  expect(decoder.decode(encoder.encode('t0'))).toEqual('t0');
14
- expect(decoder.decode(encoder.encode('ab'))).toEqual('ab');
15
- expect(decoder.decode(encoder.encode('ba'))).toEqual('ba');
16
+ expect(decoder.decode(encoder.encode('qwe'))).toEqual('qwe');
17
+ expect(decoder.decode(encoder.encode('1qaz'))).toEqual('1qaz');
16
18
  expect(decoder.decode(encoder.encode('123456'))).toEqual('123456');
17
19
  expect(decoder.decode(encoder.encode('123465'))).toEqual('123465');
18
20
  expect(decoder.decode(encoder.encode('1234651'))).toEqual('1234651');
19
21
  expect(decoder.decode(encoder.encode('1234651'))).toEqual('1234651');
22
+ expect(decoder.decode(encoder.encode('12346511234651'))).toEqual('12346511234651');
23
+ expect(decoder.decode(encoder.encode('123465112346511234651'))).toEqual('123465112346511234651');
20
24
  expect(decoder.decode(encoder.encode('abc 你好 😊🤣'))).toEqual('abc 你好 😊🤣');
25
+ expect(decoder.decode(encoder.encode('abc 你好abc 你好abc 你好 😊🤣'))).toEqual('abc 你好abc 你好abc 你好 😊🤣');
26
+ expect(decoder.decode(encoder.encode('水'.repeat(127)))).toEqual('水'.repeat(127));
27
+ expect(decoder.decode(encoder.encode('水'.repeat(32767)))).toEqual('水'.repeat(32767));
21
28
  expect(decoder.decode(encoder.encode('abc 你好 😊🤣'.repeat(1000)))).toEqual('abc 你好 😊🤣'.repeat(1000));
22
29
 
30
+ for (let length = 1; length < 1024; length++) {
31
+ const expected = 'a'.repeat(length);
32
+ const actual = decoder.decode(encoder.encode(expected));
33
+ expect(actual).toEqual(expected);
34
+
35
+ const expected2 = '©'.repeat(length);
36
+ const actual2 = decoder.decode(encoder.encode(expected2));
37
+ expect(actual2).toEqual(expected2);
38
+
39
+ const expected3 = '水'.repeat(length);
40
+ const actual3 = decoder.decode(encoder.encode(expected3));
41
+ expect(actual3).toEqual(expected3);
42
+
43
+ const expected4 = '😊'.repeat(length);
44
+ const actual4 = decoder.decode(encoder.encode(expected4));
45
+ expect(actual4).toEqual(expected4);
46
+
47
+ const bad = new Uint8Array(length);
48
+ bad.fill(0xff);
49
+ expect(decoder.decode(bad)).toEqual('\uFFFD'.repeat(length));
50
+
51
+ bad.fill('a'.charCodeAt(0), 0, length - 1);
52
+ expect(decoder.decode(bad)).toEqual('a'.repeat(length - 1) + '\uFFFD');
53
+ }
54
+
23
55
  {
24
56
  // 检查所有单字节
25
57
  for (let index = 0; index < 0xffff; index++) {
26
58
  // 跳过 Surrogate
27
59
  if (index >= 0xd800 && index <= 0xdfff) continue;
28
60
  const expected = String.fromCharCode(index);
29
- const actual = decoder.decode(encoder.encode(expected));
30
- if (expected !== actual) expect(actual).toEqual(expected);
61
+ const encoded = encoder.encode(expected);
62
+ const actual = decoder.decode(encoded);
63
+ if (expected !== actual) {
64
+ expect(actual).toEqual(expected);
65
+ }
31
66
  }
32
67
  }
33
68
 
@@ -53,32 +88,49 @@ function testEncoding(
53
88
  }
54
89
 
55
90
  test('encode string', () => {
56
- testEncoding(new StringEncoder(), new TextDecoder('utf8', { ignoreBOM: true, fatal: false }));
91
+ testEncoding(
92
+ {
93
+ encode(s) {
94
+ const encoder = new Encoder(s);
95
+ const buffer = encoder.encode();
96
+ if (buffer[0] === 67) return buffer.subarray(1);
97
+ if (buffer[1] === 105) return buffer.subarray(3);
98
+ if (buffer[1] === 73) return buffer.subarray(4);
99
+ if (buffer[1] === 108) return buffer.subarray(6);
100
+ throw new Error('Invalid buffer');
101
+ },
102
+ },
103
+ new TextDecoder('utf8', { ignoreBOM: true, fatal: false }),
104
+ );
57
105
  });
58
106
 
59
107
  test('decode string', () => {
60
- testEncoding(
61
- new TextEncoder(),
62
- new (class extends StringDecoder {
63
- /** @override */ decode(/** @type {Uint8Array} */ buffer) {
64
- return super.decode(buffer, 0, buffer.byteLength);
65
- }
66
- })(),
67
- );
108
+ testEncoding(new TextEncoder(), {
109
+ decode(buffer) {
110
+ if (!(buffer instanceof Uint8Array)) return '';
111
+ return decode(buffer, 0, buffer.byteLength);
112
+ },
113
+ });
114
+ });
115
+
116
+ test('decode string key', () => {
117
+ testEncoding(new TextEncoder(), {
118
+ decode(buffer) {
119
+ if (!(buffer instanceof Uint8Array)) return '';
120
+ return decodeKey(buffer, 0, buffer.byteLength);
121
+ },
122
+ });
68
123
  });
69
124
 
70
125
  test('decode string js', () => {
71
- testEncoding(
72
- new TextEncoder(),
73
- new (class extends StringDecoder {
74
- /** @override */ decode(/** @type {Uint8Array} */ buffer) {
75
- return decodeJs(buffer, 0, buffer.byteLength);
76
- }
77
- })(),
78
- );
126
+ testEncoding(new TextEncoder(), {
127
+ decode(buffer) {
128
+ if (!(buffer instanceof Uint8Array)) return '';
129
+ return decodeJs(buffer, 0, buffer.byteLength);
130
+ },
131
+ });
79
132
  });
80
133
 
81
134
  test('decode malformed', () => {
82
- const decoder = new StringDecoder();
83
- expect(decoder.decode(new Uint8Array([0xff, 'a'.charCodeAt(0)]), 0, 2)).toEqual('\uFFFDa');
135
+ expect(decode(new Uint8Array([0xff, 'a'.charCodeAt(0)]), 0, 2)).toEqual('\uFFFDa');
84
136
  });
package/tsconfig.json CHANGED
@@ -2,6 +2,8 @@
2
2
  "extends": "../../tsconfig",
3
3
  "include": ["./src/"],
4
4
  "compilerOptions": {
5
- "outDir": "./dist"
5
+ "outDir": "./dist",
6
+ "isolatedModules": false,
7
+ "verbatimModuleSyntax": false
6
8
  }
7
9
  }