@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.
- package/benchmark.js +7 -2
- package/coverage/clover.xml +157 -0
- package/coverage/coverage-final.json +4 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +131 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov-report/src/gzip/index-browser.ts.html +118 -0
- package/coverage/lcov-report/src/gzip/index.html +131 -0
- package/coverage/lcov-report/src/gzip/index.ts.html +148 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/index.ts.html +397 -0
- package/coverage/lcov.info +223 -0
- package/dist/gzip/index-browser.js +3 -3
- package/dist/gzip/index-browser.js.map +1 -1
- package/dist/gzip/index.js +1 -1
- package/dist/gzip/index.js.map +1 -1
- package/dist/index.d.ts +15 -7
- package/dist/index.js +41 -17
- package/dist/index.js.map +1 -1
- package/jest.config.js +3 -0
- package/package.json +6 -3
- package/src/gzip/index-browser.ts +3 -3
- package/src/gzip/index.ts +1 -1
- package/src/index.ts +55 -19
- package/tests/e2e.js +132 -0
|
@@ -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 {
|
|
1
|
+
import { gzipSync, gunzipSync } from 'fflate';
|
|
2
2
|
/** 压缩 */
|
|
3
3
|
export function compress(data) {
|
|
4
|
-
return
|
|
4
|
+
return gzipSync(data);
|
|
5
5
|
}
|
|
6
6
|
/** 解压 */
|
|
7
7
|
export function decompress(data) {
|
|
8
|
-
return
|
|
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,
|
|
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"}
|
package/dist/gzip/index.js
CHANGED
package/dist/gzip/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gzip/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,
|
|
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
|
|
5
|
-
zstd:
|
|
6
|
-
|
|
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:
|
|
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:
|
|
23
|
+
export declare function detectCompression(data: BinaryData): CompressionAlgorithm;
|
|
16
24
|
/** 探测压缩算法并解压缩 */
|
|
17
|
-
export declare function decompress(data:
|
|
25
|
+
export declare function decompress(data: BinaryData): CompressionResult;
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
/** 压缩算法的魔数 */
|
|
2
|
-
export const
|
|
3
|
-
zstd:
|
|
4
|
-
|
|
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(
|
|
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(
|
|
42
|
+
const ret = loadLib(algorithm).then((lib) => lib.compress(d));
|
|
24
43
|
ret.algorithm = algorithm;
|
|
25
44
|
return ret;
|
|
26
45
|
}
|
|
27
46
|
/** 探测压缩算法 */
|
|
28
|
-
|
|
29
|
-
for (const key in
|
|
30
|
-
const
|
|
31
|
-
|
|
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
|
|
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
|
|
71
|
+
const d = toUint8Array(data);
|
|
72
|
+
const algorithm = detectCompressionImpl(d);
|
|
49
73
|
if (algorithm === 'none') {
|
|
50
74
|
// 不是压缩数据
|
|
51
|
-
const result = Promise.resolve(
|
|
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(
|
|
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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudpss/compress",
|
|
3
|
-
"version": "0.4.
|
|
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
|
-
"
|
|
28
|
+
"fflate": "^0.7.4"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|
|
30
31
|
"@bokuweb/zstd-wasm": "^0.0.20",
|
|
31
|
-
"@types/node": "^18.
|
|
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 {
|
|
1
|
+
import { gzipSync, gunzipSync } from 'fflate';
|
|
2
2
|
|
|
3
3
|
/** 压缩 */
|
|
4
4
|
export function compress(data: Uint8Array): Uint8Array {
|
|
5
|
-
return
|
|
5
|
+
return gzipSync(data);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
/** 解压 */
|
|
9
9
|
export function decompress(data: Uint8Array): Uint8Array {
|
|
10
|
-
return
|
|
10
|
+
return gunzipSync(data);
|
|
11
11
|
}
|
package/src/gzip/index.ts
CHANGED
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
|
|
6
|
-
zstd:
|
|
7
|
-
|
|
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:
|
|
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(
|
|
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(
|
|
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
|
-
|
|
38
|
-
for (const key in
|
|
39
|
-
const
|
|
40
|
-
|
|
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
|
|
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:
|
|
56
|
-
const
|
|
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(
|
|
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(
|
|
101
|
+
const result = loadLib(algorithm).then(({ decompress }) => decompress(d)) as CompressionResult;
|
|
66
102
|
result.algorithm = algorithm;
|
|
67
103
|
return result;
|
|
68
104
|
}
|