feat(ui): compression zstd support
This commit is contained in:
parent
d5372c13f5
commit
d04fb30048
5 changed files with 49 additions and 25 deletions
|
|
@ -7,6 +7,7 @@ import type {
|
||||||
Message,
|
Message,
|
||||||
} from './messages';
|
} from './messages';
|
||||||
import logger from 'App/logger';
|
import logger from 'App/logger';
|
||||||
|
import * as fzstd from 'fzstd';
|
||||||
|
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
|
|
@ -37,31 +38,44 @@ export default class MessageLoader {
|
||||||
? (b: Uint8Array) => decryptSessionBytes(b, this.session.fileKey!)
|
? (b: Uint8Array) => decryptSessionBytes(b, this.session.fileKey!)
|
||||||
: (b: Uint8Array) => Promise.resolve(b)
|
: (b: Uint8Array) => Promise.resolve(b)
|
||||||
// Each time called - new fileReader created
|
// Each time called - new fileReader created
|
||||||
const fileReader = new MFileReader(new Uint8Array(), this.session.startedAt)
|
const unarchived = (b: Uint8Array) => {
|
||||||
return (b: Uint8Array) => decrypt(b).then(b => {
|
const isZstd = b[0] === 0x28 && b[1] === 0xb5 && b[2] === 0x2f && b[3] === 0xfd
|
||||||
toggleStatus?.(true);
|
// zstd magical numbers 40 181 47 253
|
||||||
fileReader.append(b)
|
console.log(isZstd, b[0], b[1], b[2], b[3])
|
||||||
fileReader.checkForIndexes()
|
if (isZstd) {
|
||||||
const msgs: Array<Message & { _index?: number }> = []
|
return fzstd.decompress(b)
|
||||||
for (let msg = fileReader.readNext();msg !== null;msg = fileReader.readNext()) {
|
} else {
|
||||||
msgs.push(msg)
|
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 => {
|
sorted.forEach(msg => {
|
||||||
this.messageManager.distributeMessage(msg)
|
this.messageManager.distributeMessage(msg)
|
||||||
})
|
})
|
||||||
logger.info("Messages count: ", msgs.length, sorted, file)
|
logger.info("Messages count: ", msgs.length, sorted, file)
|
||||||
|
|
||||||
this.messageManager._sortMessagesHack(sorted)
|
this.messageManager._sortMessagesHack(sorted)
|
||||||
toggleStatus?.(false);
|
toggleStatus?.(false);
|
||||||
this.messageManager.setMessagesLoading(false)
|
this.messageManager.setMessagesLoading(false)
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
console.error(e)
|
console.error(e)
|
||||||
this.uiErrorHandler?.error('Error parsing file: ' + e.message)
|
this.uiErrorHandler?.error('Error parsing file: ' + e.message)
|
||||||
})
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loadDomFiles(urls: string[], parser: (b: Uint8Array) => Promise<void>) {
|
loadDomFiles(urls: string[], parser: (b: Uint8Array) => Promise<void>) {
|
||||||
|
|
|
||||||
|
|
@ -58,13 +58,13 @@ async function requestEFSMobFile(filename: string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const processAPIStreamResponse = (response: Response, skippable: boolean) => {
|
const processAPIStreamResponse = (response: Response, skippable: boolean) => {
|
||||||
return new Promise<ArrayBuffer>((res, rej) => {
|
return new Promise<Blob>((res, rej) => {
|
||||||
if (response.status === 404 && skippable) {
|
if (response.status === 404 && skippable) {
|
||||||
return rej(ALLOWED_404)
|
return rej(ALLOWED_404)
|
||||||
}
|
}
|
||||||
if (response.status >= 400) {
|
if (response.status >= 400) {
|
||||||
return rej(`Bad file status code ${response.status}. Url: ${response.url}`)
|
return rej(`Bad file status code ${response.status}. Url: ${response.url}`)
|
||||||
}
|
}
|
||||||
res(response.arrayBuffer())
|
res(response.blob())
|
||||||
}).then(buffer => new Uint8Array(buffer))
|
}).then(async blob => new Uint8Array(await blob.arrayBuffer()))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@
|
||||||
"country-flag-icons": "^1.5.7",
|
"country-flag-icons": "^1.5.7",
|
||||||
"deep-diff": "^1.0.2",
|
"deep-diff": "^1.0.2",
|
||||||
"fflate": "^0.7.4",
|
"fflate": "^0.7.4",
|
||||||
|
"fzstd": "^0.1.0",
|
||||||
"html-to-image": "^1.9.0",
|
"html-to-image": "^1.9.0",
|
||||||
"html2canvas": "^1.4.1",
|
"html2canvas": "^1.4.1",
|
||||||
"immutable": "^4.0.0-rc.12",
|
"immutable": "^4.0.0-rc.12",
|
||||||
|
|
|
||||||
|
|
@ -12293,6 +12293,13 @@ __metadata:
|
||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
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":
|
"gauge@npm:^3.0.0":
|
||||||
version: 3.0.2
|
version: 3.0.2
|
||||||
resolution: "gauge@npm:3.0.2"
|
resolution: "gauge@npm:3.0.2"
|
||||||
|
|
@ -18130,6 +18137,7 @@ __metadata:
|
||||||
fflate: ^0.7.4
|
fflate: ^0.7.4
|
||||||
file-loader: ^6.2.0
|
file-loader: ^6.2.0
|
||||||
flow-bin: ^0.115.0
|
flow-bin: ^0.115.0
|
||||||
|
fzstd: ^0.1.0
|
||||||
html-to-image: ^1.9.0
|
html-to-image: ^1.9.0
|
||||||
html-webpack-plugin: ^5.5.0
|
html-webpack-plugin: ^5.5.0
|
||||||
html2canvas: ^1.4.1
|
html2canvas: ^1.4.1
|
||||||
|
|
|
||||||
|
|
@ -121,3 +121,4 @@ Below is the list of dependencies used in OpenReplay software. Licenses may chan
|
||||||
| eget | MIT | Infrastructure |
|
| eget | MIT | Infrastructure |
|
||||||
| @medv/finder | MIT | JavaScript |
|
| @medv/finder | MIT | JavaScript |
|
||||||
| fflate | MIT | JavaScript |
|
| fflate | MIT | JavaScript |
|
||||||
|
| fzstd | MIT | JavaScript |
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue