openreplay/frontend/app/player/web/network/loadFiles.ts
Delirium a24d99f75c
feat(player): player file loader refactoring (#1203)
* change(ui): refactor mob loading

* refactor(player): split message loader into separate file, remove toast dependency out of player lib, fix types, fix inspector and screen context

* refactor(player): simplify file loading, add safe error throws

* refactor(player): move loading status changers to the end of the flow
2023-05-12 15:38:43 +02:00

70 lines
1.8 KiB
TypeScript

import APIClient from 'App/api_client';
const ALLOWED_404 = "No-file-and-this-is-ok"
const NO_BACKUP_FILE = "No-efs-file"
export const NO_URLS = 'No-urls-provided'
export async function loadFiles(
urls: string[],
onData: (data: Uint8Array) => void,
canSkip: boolean = false,
): Promise<void> {
if (!urls.length) {
throw NO_URLS
}
try {
for (let url of urls) {
await loadFile(url, onData, urls.length > 1 ? url !== urls[0] : canSkip)
}
return Promise.resolve()
} catch (e) {
return Promise.reject(e)
}
}
export async function loadFile(
url: string,
onData: (data: Uint8Array) => void,
canSkip: boolean = false,
): Promise<void> {
return window.fetch(url)
.then(response => processAPIStreamResponse(response, canSkip))
.then(data => onData(data))
.catch(e => {
if (e === ALLOWED_404) {
return;
} else {
throw e
}
})
}
export async function requestEFSDom(sessionId: string) {
return await requestEFSMobFile(sessionId + "/dom.mob")
}
export async function requestEFSDevtools(sessionId: string) {
return await requestEFSMobFile(sessionId + "/devtools.mob")
}
async function requestEFSMobFile(filename: string) {
const api = new APIClient()
const res = await api.fetch('/unprocessed/' + filename)
if (res.status >= 400) {
throw NO_BACKUP_FILE
}
return await processAPIStreamResponse(res, false)
}
const processAPIStreamResponse = (response: Response, skippable: boolean) => {
return new Promise<ArrayBuffer>((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))
}