feat(ui): compression zstd support

This commit is contained in:
nick-delirium 2023-12-04 15:54:14 +01:00
parent d5372c13f5
commit d04fb30048
5 changed files with 49 additions and 25 deletions

View file

@ -7,6 +7,7 @@ import type {
Message,
} from './messages';
import logger from 'App/logger';
import * as fzstd from 'fzstd';
interface State {
@ -37,31 +38,44 @@ export default class MessageLoader {
? (b: Uint8Array) => decryptSessionBytes(b, this.session.fileKey!)
: (b: Uint8Array) => Promise.resolve(b)
// Each time called - new fileReader created
const fileReader = new MFileReader(new Uint8Array(), this.session.startedAt)
return (b: Uint8Array) => decrypt(b).then(b => {
toggleStatus?.(true);
fileReader.append(b)
fileReader.checkForIndexes()
const msgs: Array<Message & { _index?: number }> = []
for (let msg = fileReader.readNext();msg !== null;msg = fileReader.readNext()) {
msgs.push(msg)
const unarchived = (b: Uint8Array) => {
const isZstd = b[0] === 0x28 && b[1] === 0xb5 && b[2] === 0x2f && b[3] === 0xfd
// zstd magical numbers 40 181 47 253
console.log(isZstd, b[0], b[1], b[2], b[3])
if (isZstd) {
return fzstd.decompress(b)
} else {
return b
}
const sorted = msgs.sort((m1, m2) => {
return m1.time - m2.time
})
}
const fileReader = new MFileReader(new Uint8Array(), this.session.startedAt)
return (b: Uint8Array) => {
decrypt(b).then(b => {
const data = unarchived(b)
toggleStatus?.(true);
fileReader.append(data)
fileReader.checkForIndexes()
const msgs: Array<Message & { _index?: number }> = []
for (let msg = fileReader.readNext();msg !== null;msg = fileReader.readNext()) {
msgs.push(msg)
}
const sorted = msgs.sort((m1, m2) => {
return m1.time - m2.time
})
sorted.forEach(msg => {
this.messageManager.distributeMessage(msg)
})
logger.info("Messages count: ", msgs.length, sorted, file)
sorted.forEach(msg => {
this.messageManager.distributeMessage(msg)
})
logger.info("Messages count: ", msgs.length, sorted, file)
this.messageManager._sortMessagesHack(sorted)
toggleStatus?.(false);
this.messageManager.setMessagesLoading(false)
}).catch(e => {
console.error(e)
this.uiErrorHandler?.error('Error parsing file: ' + e.message)
})
this.messageManager._sortMessagesHack(sorted)
toggleStatus?.(false);
this.messageManager.setMessagesLoading(false)
}).catch(e => {
console.error(e)
this.uiErrorHandler?.error('Error parsing file: ' + e.message)
})
}
}
loadDomFiles(urls: string[], parser: (b: Uint8Array) => Promise<void>) {

View file

@ -58,13 +58,13 @@ async function requestEFSMobFile(filename: string) {
}
const processAPIStreamResponse = (response: Response, skippable: boolean) => {
return new Promise<ArrayBuffer>((res, rej) => {
return new Promise<Blob>((res, rej) => {
if (response.status === 404 && skippable) {
return rej(ALLOWED_404)
}
if (response.status >= 400) {
return rej(`Bad file status code ${response.status}. Url: ${response.url}`)
}
res(response.arrayBuffer())
}).then(buffer => new Uint8Array(buffer))
res(response.blob())
}).then(async blob => new Uint8Array(await blob.arrayBuffer()))
}

View file

@ -37,6 +37,7 @@
"country-flag-icons": "^1.5.7",
"deep-diff": "^1.0.2",
"fflate": "^0.7.4",
"fzstd": "^0.1.0",
"html-to-image": "^1.9.0",
"html2canvas": "^1.4.1",
"immutable": "^4.0.0-rc.12",

View file

@ -12293,6 +12293,13 @@ __metadata:
languageName: node
linkType: hard
"fzstd@npm:^0.1.0":
version: 0.1.0
resolution: "fzstd@npm:0.1.0"
checksum: 0d3f0e499d6eb285e390cdcccd4ee8fb56c83834542153e47fc60f41971ee485dde8e0569db01c6ae6afe7c1335236ebcc612563771f20f4ec9b82c6d11fb5c7
languageName: node
linkType: hard
"gauge@npm:^3.0.0":
version: 3.0.2
resolution: "gauge@npm:3.0.2"
@ -18130,6 +18137,7 @@ __metadata:
fflate: ^0.7.4
file-loader: ^6.2.0
flow-bin: ^0.115.0
fzstd: ^0.1.0
html-to-image: ^1.9.0
html-webpack-plugin: ^5.5.0
html2canvas: ^1.4.1

View file

@ -121,3 +121,4 @@ Below is the list of dependencies used in OpenReplay software. Licenses may chan
| eget | MIT | Infrastructure |
| @medv/finder | MIT | JavaScript |
| fflate | MIT | JavaScript |
| fzstd | MIT | JavaScript |