UNPKG

@fly/edge

Version:
115 lines 14.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.gitlabPages = void 0; /** * @module Backends */ const proxy_1 = require("../proxy"); const util_1 = require("../util"); const errors = require("../errors"); /** * Creates a fetch-like proxy function for making requests to GitLab pages * hosted sites. * * Example: * * ```typescript * import { gitlabPages } from "./src/backends"; * const backend = gitlabPages({ * owner: "superfly", * repo: "cdn", * hostname: "docs.fly.io" * }); * ``` * @param config The GitLab repository to proxy to * @module Backends */ function gitlabPages(options) { const config = _normalizeOptions(options); let glFetch = buildGitlabPagesProxy(config); let buildTime = 0; // first failure might need a retry const c = config; const fn = async function gitlabPagesFetch(req, init) { const original = glFetch; if (typeof req === "string") { req = new Request(req, init); } console.debug("glpages starting fetch:", req.url, buildTime); let resp = await glFetch(req, init); console.debug("glpages resp status:", resp.status); if (resp.status === 404 && glFetch.proxyConfig.hostname) { // hostname might've been cleared const url = new URL(req.url); const diff = Date.now() - buildTime; if ((url.pathname === "/" && diff > 10000) // retry after 10s for root || diff > 30000) { // wait 5min for everything else console.debug("glpages hostname request got 404:", c.hostname); c.hostname = undefined; glFetch = buildGitlabPagesProxy(c); } } if (resp.status === 301 && !glFetch.proxyConfig.hostname) { // 301s happen when you request <org>.github.io/<repo> and need a custom domain let location = resp.headers.get("location"); if (location) { const url = new URL(location); c.hostname = url.hostname; glFetch = buildGitlabPagesProxy(c); console.debug("glpages found hostname:", c); } } if (original !== glFetch) { // underlying proxy function changed, store it and retry console.debug("glpages got a new fetch fn"); self.proxyConfig = glFetch.proxyConfig; resp = await glFetch(req, init); } return resp; }; let self = Object.assign(fn, { proxyConfig: glFetch.proxyConfig }); return self; } exports.gitlabPages = gitlabPages; gitlabPages.normalizeOptions = _normalizeOptions; function _normalizeOptions(input) { const options = { owner: "", repository: "" }; if (typeof input === "string" && input.includes("/")) { [options.owner, options.repository] = input.split("/"); } else if (util_1.isObject(input)) { util_1.merge(options, input, ["owner", "repository", "hostname"]); } else { throw errors.invalidInput("options must be a GitLabPagesOptions object or `owner/repo` string"); } if (!options.owner) { throw errors.invalidProperty("owner", "is required"); } if (!options.repository) { throw errors.invalidProperty("repository", "is required"); } return options; } function buildGitlabPagesProxy(options) { const { owner, repository, hostname } = options; const glHost = `${owner}.gitlab.io`; const headers = { host: glHost, "x-forwarded-host": false }; let path = `/${repository}/`; if (hostname) { path = '/'; // no repo path when hostname exists headers.host = hostname; } console.debug("glpages creating proxy:", `https://${glHost}${path}`, { headers: headers, stripPath: path }); const fn = proxy_1.proxy(`https://${glHost}${path}`, { headers: headers, stripPath: path }); return Object.assign(fn, { proxyConfig: options }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiX3BhZ2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL2dpdGxhYl9wYWdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILG9DQUFnRDtBQUNoRCxrQ0FBMEM7QUFDMUMsb0NBQW9DO0FBa0JwQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxPQUFvQztJQUM5RCxNQUFNLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUxQyxJQUFJLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMzQyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUEsQ0FBQyxtQ0FBbUM7SUFFckQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFBO0lBRWhCLE1BQU0sRUFBRSxHQUFHLEtBQUssVUFBVSxnQkFBZ0IsQ0FBQyxHQUFnQixFQUFFLElBQWtCO1FBQzdFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUN4QixJQUFHLE9BQU8sR0FBRyxLQUFLLFFBQVEsRUFBQztZQUN6QixHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFBO1NBQzdCO1FBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFBO1FBQzVELElBQUksSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNuQyxPQUFPLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNsRCxJQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFDO1lBQ3JELGlDQUFpQztZQUNqQyxNQUFNLEdBQUcsR0FBRyxJQUFJ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LE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLE9BQTJCO0lBQ3hELE1BQU0sRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxHQUFHLE9BQU8sQ0FBQTtJQUM3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLEtBQUssWUFBWSxDQUFBO0lBQ25DLE1BQU0sT0FBTyxHQUFHO1FBQ2QsSUFBSSxFQUFFLE1BQU07UUFDWixrQkFBa0IsRUFBRSxLQUFLO0tBQzFCLENBQUE7SUFDRCxJQUFJLElBQUksR0FBSSxJQUFJLFVBQVUsR0FBRyxDQUFBO0lBRTdCLElBQUcsUUFBUSxFQUFDO1FBQ1YsSUFBSSxHQUFHLEdBQUcsQ0FBQSxDQUFDLG9DQUFvQztRQUMvQyxPQUFPLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQTtLQUN4QjtJQUVELE9BQU8sQ0FBQyxLQUFLLENBQUMseUJBQXlCLEVBQUUsV0FBVyxNQUFNLEdBQUcsSUFBSSxFQUFFLEVBQUU7UUFDbkUsT0FBTyxFQUFFLE9BQU87UUFDaEIsU0FBUyxFQUFFLElBQUk7S0FDaEIsQ0FBQyxDQUFBO0lBQ0YsTUFBTSxFQUFFLEdBQUcsYUFBSyxDQUFDLFdBQVcsTUFBTSxHQUFHLElBQUksRUFBRSxFQUFFO1FBQzNDLE9BQU8sRUFBRSxPQUFPO1FBQ2hCLFNBQVMsRUFBRSxJQUFJO0tBQ2hCLENBQUMsQ0FBQTtJQUVGLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUUsQ0FBQTtBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIEJhY2tlbmRzXG4gKi9cbmltcG9ydCB7IHByb3h5LCBQcm94eUZ1bmN0aW9uIH0gZnJvbSBcIi4uL3Byb3h5XCI7XG5pbXBvcnQgeyBpc09iamVjdCwgbWVyZ2UgfSBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0ICogYXMgZXJyb3JzIGZyb20gXCIuLi9lcnJvcnNcIjtcblxuXG4vKipcbiAqIEdpdExhYiBSZXBvc2l0b3J5IGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdpdExhYlBhZ2VzT3B0aW9ucyB7XG5cbiAgLyoqIFJlcG9zaXRvcnkgb3duZXIgKi9cbiAgb3duZXI6IHN0cmluZyxcblxuICAvKiogUmVwb3NpdG9yeSBuYW1lIDxyZXBvc2l0b3J5PiBmb3JtYXQgKi9cbiAgcmVwb3NpdG9yeTogc3RyaW5nLFxuXG4gIC8qKiBUaGUgY3VzdG9tIGhvc3RuYW1lIG9uIHJlcG9zaXRvcnkgKi9cbiAgaG9zdG5hbWU/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZmV0Y2gtbGlrZSBwcm94eSBmdW5jdGlvbiBmb3IgbWFraW5nIHJlcXVlc3RzIHRvIEdpdExhYiBwYWdlc1xuICogaG9zdGVkIHNpdGVzLlxuICogXG4gKiBFeGFtcGxlOlxuICogXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBnaXRsYWJQYWdlcyB9IGZyb20gXCIuL3NyYy9iYWNrZW5kc1wiO1xuICogY29uc3QgYmFja2VuZCA9IGdpdGxhYlBhZ2VzKHtcbiAqICBvd25lcjogXCJzdXBlcmZseVwiLFxuICogIHJlcG86IFwiY2RuXCIsXG4gKiAgaG9zdG5hbWU6IFwiZG9jcy5mbHkuaW9cIlxuICogfSk7XG4gKiBgYGBcbiAqIEBwYXJhbSBjb25maWcgVGhlIEdpdExhYiByZXBvc2l0b3J5IHRvIHByb3h5IHRvXG4gKiBAbW9kdWxlIEJhY2tlbmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnaXRsYWJQYWdlcyhvcHRpb25zOiBHaXRMYWJQYWdlc09wdGlvbnMgfCBzdHJpbmcpOiBQcm94eUZ1bmN0aW9uPEdpdExhYlBhZ2VzT3B0aW9ucz4ge1xuICBjb25zdCBjb25maWcgPSBfbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKTtcblxuICBsZXQgZ2xGZXRjaCA9IGJ1aWxkR2l0bGFiUGFnZXNQcm94eShjb25maWcpXG4gIGxldCBidWlsZFRpbWUgPSAwIC8vIGZpcnN0IGZhaWx1cmUgbWlnaHQgbmVlZCBhIHJldHJ5XG5cbiAgY29uc3QgYyA9IGNvbmZpZ1xuXG4gIGNvbnN0IGZuID0gYXN5bmMgZnVuY3Rpb24gZ2l0bGFiUGFnZXNGZXRjaChyZXE6IFJlcXVlc3RJbmZvLCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGdsRmV0Y2hcbiAgICBpZih0eXBlb2YgcmVxID09PSBcInN0cmluZ1wiKXtcbiAgICAgIHJlcSA9IG5ldyBSZXF1ZXN0KHJlcSwgaW5pdClcbiAgICB9XG4gICAgY29uc29sZS5kZWJ1ZyhcImdscGFnZXMgc3RhcnRpbmcgZmV0Y2g6XCIsIHJlcS51cmwsIGJ1aWxkVGltZSlcbiAgICBsZXQgcmVzcCA9IGF3YWl0IGdsRmV0Y2gocmVxLCBpbml0KVxuICAgIGNvbnNvbGUuZGVidWcoXCJnbHBhZ2VzIHJlc3Agc3RhdHVzOlwiLCByZXNwLnN0YXR1cylcbiAgICBpZihyZXNwLnN0YXR1cyA9PT0gNDA0ICYmIGdsRmV0Y2gucHJveHlDb25maWcuaG9zdG5hbWUpe1xuICAgICAgLy8gaG9zdG5hbWUgbWlnaHQndmUgYmVlbiBjbGVhcmVkXG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpXG4gICAgICBjb25zdCBkaWZmID0gRGF0ZS5ub3coKSAtIGJ1aWxkVGltZVxuICAgICAgaWYoXG4gICAgICAgICh1cmwucGF0aG5hbWUgPT09IFwiL1wiICYmIGRpZmYgPiAxMDAwMCkgLy8gcmV0cnkgYWZ0ZXIgMTBzIGZvciByb290XG4gICAgICAgfHwgZGlmZiA+IDMwMDAwKXsgLy8gd2FpdCA1bWluIGZvciBldmVyeXRoaW5nIGVsc2VcblxuXG4gICAgICAgIGNvbnNvbGUuZGVidWcoXCJnbHBhZ2VzIGhvc3RuYW1lIHJlcXVlc3QgZ290IDQwNDpcIiwgYy5ob3N0bmFtZSlcbiAgICAgICAgYy5ob3N0bmFtZSA9IHVuZGVmaW5lZFxuICAgICAgICBnbEZldGNoID0gYnVpbGRHaXRsYWJQYWdlc1Byb3h5KGMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmKHJlc3Auc3RhdHVzID09PSAzMDEgJiYgIWdsRmV0Y2gucHJveHlDb25maWcuaG9zdG5hbWUpe1xuICAgICAgLy8gMzAxcyBoYXBwZW4gd2hlbiB5b3UgcmVxdWVzdCA8b3JnPi5naXRodWIuaW8vPHJlcG8+IGFuZCBuZWVkIGEgY3VzdG9tIGRvbWFpblxuICAgICAgbGV0IGxvY2F0aW9uID0gcmVzcC5oZWFkZXJzLmdldChcImxvY2F0aW9uXCIpXG4gICAgICBpZihsb2NhdGlvbil7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwobG9jYXRpb24pXG4gICAgICAgIGMuaG9zdG5hbWUgPSB1cmwuaG9zdG5hbWVcbiAgICAgICAgZ2xGZXRjaCA9IGJ1aWxkR2l0bGFiUGFnZXNQcm94eShjKVxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiZ2xwYWdlcyBmb3VuZCBob3N0bmFtZTpcIiwgYylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYob3JpZ2luYWwgIT09IGdsRmV0Y2gpe1xuICAgICAgLy8gdW5kZXJseWluZyBwcm94eSBmdW5jdGlvbiBjaGFuZ2VkLCBzdG9yZSBpdCBhbmQgcmV0cnlcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJnbHBhZ2VzIGdvdCBhIG5ldyBmZXRjaCBmblwiKVxuICAgICAgc2VsZi5wcm94eUNvbmZpZyA9IGdsRmV0Y2gucHJveHlDb25maWdcbiAgICAgIHJlc3AgPSBhd2FpdCBnbEZldGNoKHJlcSwgaW5pdClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BcbiAgfVxuXG4gIGxldCBzZWxmID0gT2JqZWN0LmFzc2lnbihmbiwgeyBwcm94eUNvbmZpZzogZ2xGZXRjaC5wcm94eUNvbmZpZ30pXG4gIHJldHVybiBzZWxmXG59XG5cbmdpdGxhYlBhZ2VzLm5vcm1hbGl6ZU9wdGlvbnMgPSBfbm9ybWFsaXplT3B0aW9ucztcblxuZnVuY3Rpb24gX25vcm1hbGl6ZU9wdGlvbnMoaW5wdXQ6IHVua25vd24pOiBHaXRMYWJQYWdlc09wdGlvbnMge1xuICBjb25zdCBvcHRpb25zOiBHaXRMYWJQYWdlc09wdGlvbnMgPSB7IG93bmVyOiBcIlwiLCByZXBvc2l0b3J5OiBcIlwiIH07XG5cbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiAmJiBpbnB1dC5pbmNsdWRlcyhcIi9cIikpIHtcbiAgICBbb3B0aW9ucy5vd25lciwgb3B0aW9ucy5yZXBvc2l0b3J5XSA9IGlucHV0LnNwbGl0KFwiL1wiKTtcbiAgfSBlbHNlIGlmIChpc09iamVjdChpbnB1dCkpIHtcbiAgICBtZXJnZShvcHRpb25zLCBpbnB1dCwgW1wib3duZXJcIiwgXCJyZXBvc2l0b3J5XCIsIFwiaG9zdG5hbWVcIl0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGVycm9ycy5pbnZhbGlkSW5wdXQoXCJvcHRpb25zIG11c3QgYmUgYSBHaXRMYWJQYWdlc09wdGlvbnMgb2JqZWN0IG9yIGBvd25lci9yZXBvYCBzdHJpbmdcIik7XG4gIH1cblxuICBpZiAoIW9wdGlvbnMub3duZXIpIHtcbiAgICB0aHJvdyBlcnJvcnMuaW52YWxpZFByb3BlcnR5KFwib3duZXJcIiwgXCJpcyByZXF1aXJlZFwiKTtcbiAgfVxuICBpZiAoIW9wdGlvbnMucmVwb3NpdG9yeSkge1xuICAgIHRocm93IGVycm9ycy5pbnZhbGlkUHJvcGVydHkoXCJyZXBvc2l0b3J5XCIsIFwiaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuZnVuY3Rpb24gYnVpbGRHaXRsYWJQYWdlc1Byb3h5KG9wdGlvbnM6IEdpdExhYlBhZ2VzT3B0aW9ucyk6IFByb3h5RnVuY3Rpb248R2l0TGFiUGFnZXNPcHRpb25zPiB7XG4gIGNvbnN0IHtvd25lciwgcmVwb3NpdG9yeSwgaG9zdG5hbWV9ID0gb3B0aW9uc1xuICBjb25zdCBnbEhvc3QgPSBgJHtvd25lcn0uZ2l0bGFiLmlvYFxuICBjb25zdCBoZWFkZXJzID0ge1xuICAgIGhvc3Q6IGdsSG9zdCxcbiAgICBcIngtZm9yd2FyZGVkLWhvc3RcIjogZmFsc2VcbiAgfVxuICBsZXQgcGF0aCAgPSBgLyR7cmVwb3NpdG9yeX0vYFxuICBcbiAgaWYoaG9zdG5hbWUpe1xuICAgIHBhdGggPSAnLycgLy8gbm8gcmVwbyBwYXRoIHdoZW4gaG9zdG5hbWUgZXhpc3RzXG4gICAgaGVhZGVycy5ob3N0ID0gaG9zdG5hbWVcbiAgfVxuXG4gIGNvbnNvbGUuZGVidWcoXCJnbHBhZ2VzIGNyZWF0aW5nIHByb3h5OlwiLCBgaHR0cHM6Ly8ke2dsSG9zdH0ke3BhdGh9YCwge1xuICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgc3RyaXBQYXRoOiBwYXRoXG4gIH0pXG4gIGNvbnN0IGZuID0gcHJveHkoYGh0dHBzOi8vJHtnbEhvc3R9JHtwYXRofWAsIHtcbiAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgIHN0cmlwUGF0aDogcGF0aFxuICB9KVxuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKGZuLCB7IHByb3h5Q29uZmlnOiBvcHRpb25zIH0gKVxufSJdfQ==