/**
 * Copyright (c) Microsoft Corporation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
// @ts-ignore
import * as zipImport from '@zip.js/zip.js/lib/zip-no-worker-inflate.js';
const zipjs = zipImport;
export class ZipTraceLoaderBackend {
    _zipReader;
    _entriesPromise;
    constructor(traceUri, progress) {
        zipjs.configure({ baseURL: self.location.href });
        this._zipReader = new zipjs.ZipReader(new zipjs.HttpReader(this._resolveTraceURI(traceUri), { mode: 'cors', preventHeadRequest: true }), { useWebWorkers: false });
        this._entriesPromise = this._zipReader.getEntries({ onprogress: progress }).then(entries => {
            const map = new Map();
            for (const entry of entries)
                map.set(entry.filename, entry);
            return map;
        });
    }
    _resolveTraceURI(traceUri) {
        if (traceUri.startsWith('https://www.dropbox.com/'))
            return 'https://dl.dropboxusercontent.com/' + traceUri.substring('https://www.dropbox.com/'.length);
        return traceUri;
    }
    isLive() {
        return false;
    }
    async entryNames() {
        const entries = await this._entriesPromise;
        return [...entries.keys()];
    }
    async hasEntry(entryName) {
        const entries = await this._entriesPromise;
        return entries.has(entryName);
    }
    async readText(entryName) {
        const entries = await this._entriesPromise;
        const entry = entries.get(entryName);
        if (!entry)
            return;
        const writer = new zipjs.TextWriter();
        await entry.getData?.(writer);
        return writer.getData();
    }
    async readBlob(entryName) {
        const entries = await this._entriesPromise;
        const entry = entries.get(entryName);
        if (!entry)
            return;
        const writer = new zipjs.BlobWriter();
        await entry.getData(writer);
        return writer.getData();
    }
}
export class FetchTraceLoaderBackend {
    _entriesPromise;
    constructor(traceUri) {
        this._entriesPromise = this._readFile(traceUri).then(async (response) => {
            if (!response)
                throw new Error('File not found');
            const json = await response.json();
            const entries = new Map();
            for (const entry of json.entries)
                entries.set(entry.name, entry.path);
            return entries;
        });
    }
    isLive() {
        return true;
    }
    async entryNames() {
        const entries = await this._entriesPromise;
        return [...entries.keys()];
    }
    async hasEntry(entryName) {
        const entries = await this._entriesPromise;
        return entries.has(entryName);
    }
    async readText(entryName) {
        const response = await this._readEntry(entryName);
        return response?.text();
    }
    async readBlob(entryName) {
        const response = await this._readEntry(entryName);
        return response?.status === 200 ? await response?.blob() : undefined;
    }
    async _readEntry(entryName) {
        const entries = await this._entriesPromise;
        const fileUri = entries.get(entryName);
        if (!fileUri)
            return;
        return this._readFile(fileUri);
    }
    async _readFile(uri) {
        const response = await fetch(uri);
        if (response.status === 404)
            return;
        return response;
    }
}
//# sourceMappingURL=traceLoaderBackends.js.map