import { client } from 'App/mstore' 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 { 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 { 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'); } export async function requestTarball(url: string) { const res = await window.fetch(url); if (res.ok) { const buf = await res.arrayBuffer(); return new Uint8Array(buf); } else { throw new Error(res.status.toString()); } } const urlPattern = /https?:\/\/[a-zA-Z0-9.-]+(:\d+)?\/(\d+)\/session\/\d+/; function getSiteId(url) { const match = url.match(urlPattern); return match ? match[2] : null; // match[2] contains the siteId } async function requestEFSMobFile(filename: string) { const siteId = getSiteId(document.location.href) if (siteId) { client.forceSiteId(siteId); client.setSiteIdCheck(() => ({ siteId })); } const res = await client.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((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(async (buf) => new Uint8Array(buf)); };