@cloudpss/compress 0.4.14 → 0.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,223 @@
1
+ TN:
2
+ SF:src\index.ts
3
+ FN:29,zstd
4
+ FN:30,gzip
5
+ FN:34,loadLib
6
+ FN:40,toUint8Array
7
+ FN:51,compress
8
+ FN:67,detectCompressionImpl
9
+ FN:84,detectCompression
10
+ FN:90,decompress
11
+ FNF:8
12
+ FNH:8
13
+ FNDA:12,zstd
14
+ FNDA:4,gzip
15
+ FNDA:17,loadLib
16
+ FNDA:37,toUint8Array
17
+ FNDA:13,compress
18
+ FNDA:23,detectCompressionImpl
19
+ FNDA:13,detectCompression
20
+ FNDA:11,decompress
21
+ DA:1,1
22
+ DA:2,1
23
+ DA:3,1
24
+ DA:4,1
25
+ DA:5,1
26
+ DA:6,1
27
+ DA:7,1
28
+ DA:8,1
29
+ DA:9,1
30
+ DA:10,1
31
+ DA:11,1
32
+ DA:12,1
33
+ DA:13,1
34
+ DA:14,1
35
+ DA:15,1
36
+ DA:16,1
37
+ DA:17,1
38
+ DA:18,1
39
+ DA:19,1
40
+ DA:20,1
41
+ DA:21,1
42
+ DA:22,1
43
+ DA:23,1
44
+ DA:24,1
45
+ DA:25,1
46
+ DA:26,1
47
+ DA:27,1
48
+ DA:28,1
49
+ DA:29,1
50
+ DA:30,1
51
+ DA:31,1
52
+ DA:32,1
53
+ DA:33,1
54
+ DA:34,17
55
+ DA:35,17
56
+ DA:36,16
57
+ DA:37,16
58
+ DA:38,1
59
+ DA:39,1
60
+ DA:40,37
61
+ DA:41,37
62
+ DA:42,3
63
+ DA:43,3
64
+ DA:44,37
65
+ DA:45,33
66
+ DA:46,33
67
+ DA:47,1
68
+ DA:48,1
69
+ DA:49,1
70
+ DA:50,1
71
+ DA:51,1
72
+ DA:52,13
73
+ DA:53,13
74
+ DA:54,2
75
+ DA:55,2
76
+ DA:56,2
77
+ DA:57,2
78
+ DA:58,9
79
+ DA:59,9
80
+ DA:60,9
81
+ DA:61,9
82
+ DA:62,1
83
+ DA:63,1
84
+ DA:64,1
85
+ DA:65,1
86
+ DA:66,1
87
+ DA:67,23
88
+ DA:68,23
89
+ DA:69,35
90
+ DA:70,35
91
+ DA:71,25
92
+ DA:72,35
93
+ DA:73,63
94
+ DA:74,9
95
+ DA:75,9
96
+ DA:76,9
97
+ DA:77,63
98
+ DA:78,35
99
+ DA:79,35
100
+ DA:80,7
101
+ DA:81,7
102
+ DA:82,1
103
+ DA:83,1
104
+ DA:84,1
105
+ DA:85,13
106
+ DA:86,13
107
+ DA:87,13
108
+ DA:88,1
109
+ DA:89,1
110
+ DA:90,1
111
+ DA:91,11
112
+ DA:92,11
113
+ DA:93,11
114
+ DA:94,11
115
+ DA:95,2
116
+ DA:96,2
117
+ DA:97,2
118
+ DA:98,2
119
+ DA:99,2
120
+ DA:100,8
121
+ DA:101,8
122
+ DA:102,8
123
+ DA:103,8
124
+ DA:104,8
125
+ LF:104
126
+ LH:104
127
+ BRDA:29,0,0,12
128
+ BRDA:30,1,0,4
129
+ BRDA:34,2,0,17
130
+ BRDA:35,3,0,1
131
+ BRDA:36,4,0,16
132
+ BRDA:40,5,0,37
133
+ BRDA:41,6,0,35
134
+ BRDA:41,7,0,3
135
+ BRDA:44,8,0,34
136
+ BRDA:44,9,0,33
137
+ BRDA:47,10,0,1
138
+ BRDA:51,11,0,13
139
+ BRDA:53,12,0,2
140
+ BRDA:58,13,0,9
141
+ BRDA:58,14,0,8
142
+ BRDA:67,15,0,23
143
+ BRDA:68,16,0,35
144
+ BRDA:70,17,0,10
145
+ BRDA:71,18,0,25
146
+ BRDA:72,19,0,63
147
+ BRDA:73,20,0,9
148
+ BRDA:78,21,0,25
149
+ BRDA:78,22,0,16
150
+ BRDA:80,23,0,7
151
+ BRDA:84,24,0,13
152
+ BRDA:90,25,0,11
153
+ BRDA:94,26,0,2
154
+ BRDA:100,27,0,8
155
+ BRDA:101,28,0,8
156
+ BRF:29
157
+ BRH:29
158
+ end_of_record
159
+ TN:
160
+ SF:src\gzip\index-browser.ts
161
+ FN:1,(empty-report)
162
+ FNF:1
163
+ FNH:0
164
+ FNDA:0,(empty-report)
165
+ DA:1,0
166
+ DA:2,0
167
+ DA:3,0
168
+ DA:4,0
169
+ DA:5,0
170
+ DA:6,0
171
+ DA:7,0
172
+ DA:8,0
173
+ DA:9,0
174
+ DA:10,0
175
+ DA:11,0
176
+ LF:11
177
+ LH:0
178
+ BRDA:1,0,0,0
179
+ BRF:1
180
+ BRH:0
181
+ end_of_record
182
+ TN:
183
+ SF:src\gzip\index.ts
184
+ FN:4,compress
185
+ FN:14,decompress
186
+ FNF:2
187
+ FNH:2
188
+ FNDA:2,compress
189
+ FNDA:2,decompress
190
+ DA:1,1
191
+ DA:2,1
192
+ DA:3,1
193
+ DA:4,1
194
+ DA:5,2
195
+ DA:6,2
196
+ DA:7,2
197
+ DA:8,2
198
+ DA:9,2
199
+ DA:10,2
200
+ DA:11,2
201
+ DA:12,1
202
+ DA:13,1
203
+ DA:14,1
204
+ DA:15,2
205
+ DA:16,2
206
+ DA:17,2
207
+ DA:18,2
208
+ DA:19,2
209
+ DA:20,2
210
+ DA:21,2
211
+ LF:21
212
+ LH:21
213
+ BRDA:4,0,0,2
214
+ BRDA:5,1,0,2
215
+ BRDA:6,2,0,2
216
+ BRDA:7,3,0,0
217
+ BRDA:14,4,0,2
218
+ BRDA:15,5,0,2
219
+ BRDA:16,6,0,2
220
+ BRDA:17,7,0,0
221
+ BRF:8
222
+ BRH:6
223
+ end_of_record
@@ -1,10 +1,10 @@
1
- import { gzip, ungzip } from 'pako';
1
+ import { gzipSync, gunzipSync } from 'fflate';
2
2
  /** 压缩 */
3
3
  export function compress(data) {
4
- return gzip(data);
4
+ return gzipSync(data);
5
5
  }
6
6
  /** 解压 */
7
7
  export function decompress(data) {
8
- return ungzip(data);
8
+ return gunzipSync(data);
9
9
  }
10
10
  //# sourceMappingURL=index-browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-browser.js","sourceRoot":"","sources":["../../src/gzip/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,SAAS;AACT,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,SAAS;AACT,MAAM,UAAU,UAAU,CAAC,IAAgB;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"index-browser.js","sourceRoot":"","sources":["../../src/gzip/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9C,SAAS;AACT,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACrC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS;AACT,MAAM,UAAU,UAAU,CAAC,IAAgB;IACvC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -1,4 +1,4 @@
1
- import { gzip, gunzip } from 'zlib';
1
+ import { gzip, gunzip } from 'node:zlib';
2
2
  /** 压缩 */
3
3
  export function compress(data) {
4
4
  return new Promise((resolve, reject) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gzip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,SAAS;AACT,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YACvB,IAAI,GAAG,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS;AACT,MAAM,UAAU,UAAU,CAAC,IAAgB;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YACzB,IAAI,GAAG,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gzip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEzC,SAAS;AACT,MAAM,UAAU,QAAQ,CAAC,IAAgB;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YACvB,IAAI,GAAG,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS;AACT,MAAM,UAAU,UAAU,CAAC,IAAgB;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;YACzB,IAAI,GAAG,IAAI,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,17 +1,25 @@
1
1
  /** 可用的压缩算法 */
2
2
  export type CompressionAlgorithm = 'zstd' | 'gzip' | 'none';
3
3
  /** 压缩算法的魔数 */
4
- export declare const MAGIC_NUMBERS: {
5
- zstd: number[];
6
- gzip: number[];
7
- };
4
+ export declare const CompressionAlgorithms: Readonly<{
5
+ zstd: Readonly<{
6
+ algorithm: "zstd";
7
+ magicNumber: readonly number[];
8
+ minSize: 8;
9
+ }>;
10
+ gzip: Readonly<{
11
+ algorithm: "gzip";
12
+ magicNumber: readonly number[];
13
+ minSize: 18;
14
+ }>;
15
+ }>;
8
16
  /** 使用指定算法压缩 */
9
- export declare function compress(data: Uint8Array, algorithm?: CompressionAlgorithm): CompressionResult;
17
+ export declare function compress(data: BinaryData, algorithm?: CompressionAlgorithm): CompressionResult;
10
18
  /** 压缩/解压缩结果 */
11
19
  export type CompressionResult = Promise<Uint8Array> & {
12
20
  algorithm: CompressionAlgorithm;
13
21
  };
14
22
  /** 探测压缩算法 */
15
- export declare function detectCompression(data: Uint8Array): CompressionAlgorithm;
23
+ export declare function detectCompression(data: BinaryData): CompressionAlgorithm;
16
24
  /** 探测压缩算法并解压缩 */
17
- export declare function decompress(data: Uint8Array): CompressionResult;
25
+ export declare function decompress(data: BinaryData): CompressionResult;
package/dist/index.js CHANGED
@@ -1,8 +1,16 @@
1
1
  /** 压缩算法的魔数 */
2
- export const MAGIC_NUMBERS = {
3
- zstd: [0x28, 0xb5, 0x2f, 0xfd],
4
- gzip: [0x1f, 0x8b],
5
- };
2
+ export const CompressionAlgorithms = Object.freeze({
3
+ zstd: Object.freeze({
4
+ algorithm: 'zstd',
5
+ magicNumber: Object.freeze([0x28, 0xb5, 0x2f, 0xfd]),
6
+ minSize: 8,
7
+ }),
8
+ gzip: Object.freeze({
9
+ algorithm: 'gzip',
10
+ magicNumber: Object.freeze([0x1f, 0x8b]),
11
+ minSize: 18,
12
+ }),
13
+ });
6
14
  const modules = {
7
15
  zstd: () => import('@cloudpss/zstd'),
8
16
  gzip: () => import('./gzip/index.js'),
@@ -13,46 +21,62 @@ function loadLib(algorithm) {
13
21
  throw new Error(`Unknown compression algorithm: ${algorithm}`);
14
22
  return modules[algorithm]();
15
23
  }
24
+ /** 支持的数据转为 Uint8Array */
25
+ function toUint8Array(data) {
26
+ if (data == null || typeof data != 'object' || typeof data.byteLength != 'number') {
27
+ throw new TypeError('Invalid data');
28
+ }
29
+ if (ArrayBuffer.isView(data)) {
30
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
31
+ }
32
+ return new Uint8Array(data, 0, data.byteLength);
33
+ }
16
34
  /** 使用指定算法压缩 */
17
35
  export function compress(data, algorithm = 'zstd') {
36
+ const d = toUint8Array(data);
18
37
  if (algorithm === 'none') {
19
- const ret = Promise.resolve(data);
38
+ const ret = Promise.resolve(d);
20
39
  ret.algorithm = 'none';
21
40
  return ret;
22
41
  }
23
- const ret = loadLib(algorithm).then((lib) => lib.compress(data));
42
+ const ret = loadLib(algorithm).then((lib) => lib.compress(d));
24
43
  ret.algorithm = algorithm;
25
44
  return ret;
26
45
  }
27
46
  /** 探测压缩算法 */
28
- export function detectCompression(data) {
29
- for (const key in MAGIC_NUMBERS) {
30
- const k = key;
31
- const magicNumber = MAGIC_NUMBERS[k];
32
- if (data.length <= magicNumber.length)
47
+ function detectCompressionImpl(data) {
48
+ for (const key in CompressionAlgorithms) {
49
+ const info = CompressionAlgorithms[key];
50
+ if (data.length < info.minSize)
33
51
  continue;
34
52
  let match = true;
35
- for (let i = 0; i < magicNumber.length; i++) {
36
- if (data[i] !== magicNumber[i]) {
53
+ for (let i = 0; i < info.magicNumber.length; i++) {
54
+ if (data[i] !== info.magicNumber[i]) {
37
55
  match = false;
38
56
  break;
39
57
  }
40
58
  }
41
59
  if (match)
42
- return k;
60
+ return info.algorithm;
43
61
  }
44
62
  return 'none';
45
63
  }
64
+ /** 探测压缩算法 */
65
+ export function detectCompression(data) {
66
+ const d = toUint8Array(data);
67
+ return detectCompressionImpl(d);
68
+ }
46
69
  /** 探测压缩算法并解压缩 */
47
70
  export function decompress(data) {
48
- const algorithm = detectCompression(data);
71
+ const d = toUint8Array(data);
72
+ const algorithm = detectCompressionImpl(d);
49
73
  if (algorithm === 'none') {
50
74
  // 不是压缩数据
51
- const result = Promise.resolve(data);
75
+ const result = Promise.resolve(d);
52
76
  result.algorithm = 'none';
53
77
  return result;
54
78
  }
55
- const result = loadLib(algorithm).then(({ decompress }) => decompress(data));
79
+ const result = loadLib(algorithm).then(({ decompress }) => decompress(d));
56
80
  result.algorithm = algorithm;
57
81
  return result;
58
82
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc;AACd,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAC9B,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;CACrB,CAAC;AAEF,MAAM,OAAO,GAAG;IACZ,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACpC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC;CACxC,CAAC;AAEF,YAAY;AACZ,SAAS,OAAO,CAAC,SAAgD;IAC7D,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;IAC5F,OAAO,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,eAAe;AACf,MAAM,UAAU,QAAQ,CAAC,IAAgB,EAAE,YAAkC,MAAM;IAC/E,IAAI,SAAS,KAAK,MAAM,EAAE;QACtB,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAsB,CAAC;QACvD,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;QACvB,OAAO,GAAG,CAAC;KACd;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAsB,CAAC;IACtF,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1B,OAAO,GAAG,CAAC;AACf,CAAC;AAKD,aAAa;AACb,MAAM,UAAU,iBAAiB,CAAC,IAAgB;IAC9C,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE;QAC7B,MAAM,CAAC,GAAG,GAAiC,CAAC;QAC5C,MAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM;YAAE,SAAS;QAChD,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACzC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE;gBAC5B,KAAK,GAAG,KAAK,CAAC;gBACd,MAAM;aACT;SACJ;QACD,IAAI,KAAK;YAAE,OAAO,CAAC,CAAC;KACvB;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,UAAU,CAAC,IAAgB;IACvC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE1C,IAAI,SAAS,KAAK,MAAM,EAAE;QACtB,SAAS;QACT,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAsB,CAAC;QAC1D,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC;QAC1B,OAAO,MAAM,CAAC;KACjB;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAsB,CAAC;IAClG,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,OAAO,MAAM,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/jest.config.js ADDED
@@ -0,0 +1,3 @@
1
+ import { config } from '../../jest.config.js';
2
+
3
+ export default { ...config };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cloudpss/compress",
3
- "version": "0.4.14",
3
+ "version": "0.4.16",
4
4
  "author": "CloudPSS",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -18,20 +18,23 @@
18
18
  "scripts": {
19
19
  "start": "yarn clean && tsc --watch",
20
20
  "build": "yarn clean && tsc",
21
+ "test": "cross-env NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest",
21
22
  "prepublishOnly": "yarn build",
22
23
  "clean": "rimraf dist",
23
24
  "benchmark": "node ./benchmark"
24
25
  },
25
26
  "dependencies": {
26
27
  "@cloudpss/zstd": "^0.2.0",
27
- "pako": "^2.1.0"
28
+ "fflate": "^0.7.4"
28
29
  },
29
30
  "devDependencies": {
30
31
  "@bokuweb/zstd-wasm": "^0.0.20",
31
- "@types/node": "^18.15.12",
32
+ "@types/node": "^18.16.0",
32
33
  "@types/pako": "^2.0.0",
33
34
  "@xingrz/cppzst": "^2.1.0-alpha.8",
34
35
  "brotli-wasm": "^1.3.1",
36
+ "fzstd": "^0.1.0",
37
+ "pako": "^2.1.0",
35
38
  "pretty-bytes": "^6.1.0",
36
39
  "type-fest": "^3.8.0",
37
40
  "wasm-flate": "1.0.2"
@@ -1,11 +1,11 @@
1
- import { gzip, ungzip } from 'pako';
1
+ import { gzipSync, gunzipSync } from 'fflate';
2
2
 
3
3
  /** 压缩 */
4
4
  export function compress(data: Uint8Array): Uint8Array {
5
- return gzip(data);
5
+ return gzipSync(data);
6
6
  }
7
7
 
8
8
  /** 解压 */
9
9
  export function decompress(data: Uint8Array): Uint8Array {
10
- return ungzip(data);
10
+ return gunzipSync(data);
11
11
  }
package/src/gzip/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { gzip, gunzip } from 'zlib';
1
+ import { gzip, gunzip } from 'node:zlib';
2
2
 
3
3
  /** 压缩 */
4
4
  export function compress(data: Uint8Array): Promise<Uint8Array> {
package/src/index.ts CHANGED
@@ -1,11 +1,29 @@
1
1
  /** 可用的压缩算法 */
2
2
  export type CompressionAlgorithm = 'zstd' | 'gzip' | 'none';
3
3
 
4
+ /** 压缩算法的信息 */
5
+ interface CompressionInfo {
6
+ /** 算法 */
7
+ readonly algorithm: CompressionAlgorithm;
8
+ /** 压缩算法的魔数 */
9
+ readonly magicNumber: readonly number[];
10
+ /** 压缩算法的最小结果大小 */
11
+ readonly minSize: number;
12
+ }
13
+
4
14
  /** 压缩算法的魔数 */
5
- export const MAGIC_NUMBERS = {
6
- zstd: [0x28, 0xb5, 0x2f, 0xfd],
7
- gzip: [0x1f, 0x8b],
8
- };
15
+ export const CompressionAlgorithms = Object.freeze({
16
+ zstd: Object.freeze({
17
+ algorithm: 'zstd' as const,
18
+ magicNumber: Object.freeze([0x28, 0xb5, 0x2f, 0xfd]),
19
+ minSize: 8,
20
+ }),
21
+ gzip: Object.freeze({
22
+ algorithm: 'gzip' as const,
23
+ magicNumber: Object.freeze([0x1f, 0x8b]),
24
+ minSize: 18,
25
+ }),
26
+ } satisfies Record<string, CompressionInfo>);
9
27
 
10
28
  const modules = {
11
29
  zstd: () => import('@cloudpss/zstd'),
@@ -18,14 +36,26 @@ function loadLib(algorithm: Exclude<CompressionAlgorithm, 'none'>): ReturnType<(
18
36
  return modules[algorithm]();
19
37
  }
20
38
 
39
+ /** 支持的数据转为 Uint8Array */
40
+ function toUint8Array(data: BinaryData): Uint8Array {
41
+ if (data == null || typeof data != 'object' || typeof data.byteLength != 'number') {
42
+ throw new TypeError('Invalid data');
43
+ }
44
+ if (ArrayBuffer.isView(data)) {
45
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
46
+ }
47
+ return new Uint8Array(data, 0, data.byteLength);
48
+ }
49
+
21
50
  /** 使用指定算法压缩 */
22
- export function compress(data: Uint8Array, algorithm: CompressionAlgorithm = 'zstd'): CompressionResult {
51
+ export function compress(data: BinaryData, algorithm: CompressionAlgorithm = 'zstd'): CompressionResult {
52
+ const d = toUint8Array(data);
23
53
  if (algorithm === 'none') {
24
- const ret = Promise.resolve(data) as CompressionResult;
54
+ const ret = Promise.resolve(d) as CompressionResult;
25
55
  ret.algorithm = 'none';
26
56
  return ret;
27
57
  }
28
- const ret = loadLib(algorithm).then((lib) => lib.compress(data)) as CompressionResult;
58
+ const ret = loadLib(algorithm).then((lib) => lib.compress(d)) as CompressionResult;
29
59
  ret.algorithm = algorithm;
30
60
  return ret;
31
61
  }
@@ -34,35 +64,41 @@ export function compress(data: Uint8Array, algorithm: CompressionAlgorithm = 'zs
34
64
  export type CompressionResult = Promise<Uint8Array> & { algorithm: CompressionAlgorithm };
35
65
 
36
66
  /** 探测压缩算法 */
37
- export function detectCompression(data: Uint8Array): CompressionAlgorithm {
38
- for (const key in MAGIC_NUMBERS) {
39
- const k = key as keyof typeof MAGIC_NUMBERS;
40
- const magicNumber = MAGIC_NUMBERS[k];
41
- if (data.length <= magicNumber.length) continue;
67
+ function detectCompressionImpl(data: Uint8Array): CompressionAlgorithm {
68
+ for (const key in CompressionAlgorithms) {
69
+ const info = CompressionAlgorithms[key as keyof typeof CompressionAlgorithms];
70
+ if (data.length < info.minSize) continue;
42
71
  let match = true;
43
- for (let i = 0; i < magicNumber.length; i++) {
44
- if (data[i] !== magicNumber[i]) {
72
+ for (let i = 0; i < info.magicNumber.length; i++) {
73
+ if (data[i] !== info.magicNumber[i]) {
45
74
  match = false;
46
75
  break;
47
76
  }
48
77
  }
49
- if (match) return k;
78
+ if (match) return info.algorithm;
50
79
  }
51
80
  return 'none';
52
81
  }
53
82
 
83
+ /** 探测压缩算法 */
84
+ export function detectCompression(data: BinaryData): CompressionAlgorithm {
85
+ const d = toUint8Array(data);
86
+ return detectCompressionImpl(d);
87
+ }
88
+
54
89
  /** 探测压缩算法并解压缩 */
55
- export function decompress(data: Uint8Array): CompressionResult {
56
- const algorithm = detectCompression(data);
90
+ export function decompress(data: BinaryData): CompressionResult {
91
+ const d = toUint8Array(data);
92
+ const algorithm = detectCompressionImpl(d);
57
93
 
58
94
  if (algorithm === 'none') {
59
95
  // 不是压缩数据
60
- const result = Promise.resolve(data) as CompressionResult;
96
+ const result = Promise.resolve(d) as CompressionResult;
61
97
  result.algorithm = 'none';
62
98
  return result;
63
99
  }
64
100
 
65
- const result = loadLib(algorithm).then(({ decompress }) => decompress(data)) as CompressionResult;
101
+ const result = loadLib(algorithm).then(({ decompress }) => decompress(d)) as CompressionResult;
66
102
  result.algorithm = algorithm;
67
103
  return result;
68
104
  }