Skip to content

Commit 4069e40

Browse files
committed
refactor: Replace Gzip compression with LZ4 in file handling
On MCU we have stricter resource requirements and having deflate to work is often difficult and inefficient. Signed-off-by: Omar <omar.brbutovic@secomind.com>
1 parent 6f69ea8 commit 4069e40

File tree

3 files changed

+25
-26
lines changed

3 files changed

+25
-26
lines changed

frontend/package-lock.json

Lines changed: 14 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"@types/js-cookie": "^3.0.6",
2424
"@types/leaflet": "^1.9.12",
2525
"@types/lodash": "^4.17.6",
26+
"@types/lz4js": "^0.2.2",
2627
"@types/react": "^18.3.3",
2728
"@types/react-dom": "^18.3.0",
2829
"@types/react-relay": "^18.2.1",
@@ -34,13 +35,13 @@
3435
"class-variance-authority": "^0.7.1",
3536
"clsx": "^2.1.1",
3637
"dayjs": "^1.11.19",
37-
"fflate": "^0.8.2",
3838
"graphql": "^16.9.0",
3939
"history": "^5.1.0",
4040
"js-cookie": "^3.0.5",
4141
"leaflet": "^1.9.4",
4242
"lodash": "^4.17.21",
4343
"lucide-react": "^0.577.0",
44+
"lz4js": "^0.2.0",
4445
"react": "^18.3.1",
4546
"react-apexcharts": "^2.1.0",
4647
"react-bootstrap": "^2.10.4",

frontend/src/lib/files.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
* SPDX-License-Identifier: Apache-2.0
1919
*/
2020

21-
import { gzip } from "fflate";
21+
import { compress } from "lz4js";
2222

2323
const BLOCK_SIZE = 512;
2424

@@ -112,15 +112,6 @@ const createTarArchive = async (files: File[]): Promise<Uint8Array> => {
112112
const nameBytes = encoder.encode(fileName);
113113
header.set(nameBytes.slice(0, 100), 0);
114114

115-
// File mode (offset 100, 8 bytes) - 0000644
116-
header.set(encoder.encode("0000644\0"), 100);
117-
118-
// Owner ID (offset 108, 8 bytes) - 0000000
119-
header.set(encoder.encode("0000000\0"), 108);
120-
121-
// Group ID (offset 116, 8 bytes) - 0000000
122-
header.set(encoder.encode("0000000\0"), 116);
123-
124115
// File size in octal (offset 124, 12 bytes)
125116
const sizeOctal = fileData.length.toString(8).padStart(11, "0");
126117
header.set(encoder.encode(sizeOctal + "\0"), 124);
@@ -176,18 +167,18 @@ const createTarArchive = async (files: File[]): Promise<Uint8Array> => {
176167
return tarData;
177168
};
178169

179-
// Creates a tar.gz archive from multiple files.
170+
// Creates an LZ4 compressed tar archive from multiple files.
180171
// Returns a Blob of the compressed archive.
181172
const createTarGzArchive = async (files: File[]): Promise<Blob> => {
182173
const tarData = await createTarArchive(files);
183-
const gzippedData = await new Promise<Uint8Array>((resolve, reject) => {
184-
gzip(tarData, (err, data) => {
185-
if (err) reject(err);
186-
else resolve(data);
187-
});
174+
175+
// Run compression on a later tick so callers can await it asynchronously.
176+
const lz4Data = await new Promise<Uint8Array>((resolve) => {
177+
setTimeout(() => resolve(compress(tarData)), 0);
188178
});
189-
return new Blob([gzippedData.buffer as ArrayBuffer], {
190-
type: "application/gzip",
179+
180+
return new Blob([lz4Data.buffer as ArrayBuffer], {
181+
type: "application/x-lz4",
191182
});
192183
};
193184

0 commit comments

Comments
 (0)