"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const fetch_1 = require("@pnpm/fetch");
const npm_registry_agent_1 = require("@pnpm/npm-registry-agent");
const url_1 = require("url");
const USER_AGENT = 'pnpm'; // or maybe make it `${pkg.name}/${pkg.version} (+https://npm.im/${pkg.name})`
const CORGI_DOC = 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*';
const JSON_DOC = 'application/json';
const MAX_FOLLOWED_REDIRECTS = 20;
function default_1(defaultOpts) {
    return async (url, opts) => {
        const headers = {
            'user-agent': USER_AGENT,
            ...getHeaders({
                auth: opts === null || opts === void 0 ? void 0 : opts.authHeaderValue,
                fullMetadata: defaultOpts.fullMetadata,
                userAgent: defaultOpts.userAgent,
            }),
        };
        let redirects = 0;
        let urlObject = new url_1.URL(url);
        const originalHost = urlObject.host;
        while (true) {
            const agent = npm_registry_agent_1.default(urlObject.href, {
                ...defaultOpts,
                ...opts,
            }); // tslint:disable-line
            headers['connection'] = agent ? 'keep-alive' : 'close';
            // We should pass a URL object to node-fetch till this is not resolved:
            // https://github.com/bitinn/node-fetch/issues/245
            let response = await fetch_1.default(urlObject, {
                agent,
                // if verifying integrity, node-fetch must not decompress
                compress: false,
                headers,
                redirect: 'manual',
                retry: defaultOpts.retry,
            });
            if (!fetch_1.isRedirect(response.status) || redirects >= MAX_FOLLOWED_REDIRECTS) {
                return response;
            }
            // This is a workaround to remove authorization headers on redirect.
            // Related pnpm issue: https://github.com/pnpm/pnpm/issues/1815
            redirects++;
            urlObject = new url_1.URL(response.headers.get('location'));
            if (!headers['authorization'] || originalHost === urlObject.host)
                continue;
            delete headers['authorization'];
        }
    };
}
exports.default = default_1;
function getHeaders(opts) {
    const headers = {
        accept: opts.fullMetadata === true ? JSON_DOC : CORGI_DOC,
    };
    if (opts.auth) {
        headers['authorization'] = opts.auth; // tslint:disable-line
    }
    if (opts.userAgent) {
        headers['user-agent'] = opts.userAgent;
    }
    return headers;
}
//# sourceMappingURL=index.js.map