refactor(player): simplify loadFiles code

This commit is contained in:
Alex Kaminskii 2023-01-20 16:24:24 +01:00
parent bfe14db353
commit 983fef55ef

View file

@ -1,43 +1,33 @@
import APIClient from 'App/api_client'; import APIClient from 'App/api_client';
const NO_NTH_FILE = "nnf" const NO_FILE_OK = "No-file-but-this-is-ok"
const NO_UNPROCESSED_FILES = "nuf" const NO_BACKUP_FILE = "No-efs-file"
export const loadFiles = ( export const loadFiles = (
urls: string[], urls: string[],
onData: (data: Uint8Array) => void, onData: (data: Uint8Array) => void,
): Promise<void> => { ): Promise<void> => {
const firstFileURL = urls[0] if (!urls.length) {
urls = urls.slice(1)
if (!firstFileURL) {
return Promise.reject("No urls provided") return Promise.reject("No urls provided")
} }
return window.fetch(firstFileURL) return urls.reduce((p, url, index) =>
.then(r => { p.then(() =>
return processAPIStreamResponse(r, true) window.fetch(url)
}) .then(r => {
.then(onData) return processAPIStreamResponse(r, index===0)
.then(() => })
urls.reduce((p, url) => .then(onData)
p.then(() => ),
window.fetch(url) Promise.resolve(),
.then(r => {
return processAPIStreamResponse(r, false)
})
.then(onData)
),
Promise.resolve(),
)
) )
.catch(e => { .catch(e => {
if (e === NO_NTH_FILE) { if (e === NO_FILE_OK) {
return return
} }
throw e throw e
}) })
} }
export async function requestEFSDom(sessionId: string) { export async function requestEFSDom(sessionId: string) {
return await requestEFSMobFile(sessionId + "/dom.mob") return await requestEFSMobFile(sessionId + "/dom.mob")
} }
@ -50,21 +40,18 @@ async function requestEFSMobFile(filename: string) {
const api = new APIClient() const api = new APIClient()
const res = await api.fetch('/unprocessed/' + filename) const res = await api.fetch('/unprocessed/' + filename)
if (res.status >= 400) { if (res.status >= 400) {
throw NO_UNPROCESSED_FILES throw NO_BACKUP_FILE
} }
return await processAPIStreamResponse(res, false) return await processAPIStreamResponse(res, false)
} }
const processAPIStreamResponse = (response: Response, isFirstFile: boolean) => { const processAPIStreamResponse = (response: Response, canBeMissed: boolean) => {
return new Promise<ArrayBuffer>((res, rej) => { return new Promise<ArrayBuffer>((res, rej) => {
if (response.status === 404 && !isFirstFile) { if (response.status === 404 && canBeMissed) {
return rej(NO_NTH_FILE) return rej(NO_FILE_OK)
} }
if (response.status >= 400) { if (response.status >= 400) {
return rej( return rej(`Bad file status code ${response.status}. Url: ${response.url}`)
isFirstFile ? `no start file. status code ${ response.status }`
: `Bad endfile status code ${response.status}`
)
} }
res(response.arrayBuffer()) res(response.arrayBuffer())
}).then(buffer => new Uint8Array(buffer)) }).then(buffer => new Uint8Array(buffer))