UNPKG

@fly/edge

Version:
82 lines 10.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.awsS3 = void 0; /** * @module Backends */ const aws_1 = require("../aws"); const allowedMethods = ["GET", "HEAD"]; /** * Creates a fetch-like proxy function for making requests to AWS S3. * * Example: * * ```typescript * import { awsS3 } from "./src/backends"; * const backend = awsS3({ * bucket: "flyio-test-website", * // region: "us-east-1" * // credentials: { // for private S3 buckets * // accessKeyId: app.config.aws_access_key_id, * // secretAccessKey: app.config.aws_secret_access_key, // store this as a secret * // } * }); * ``` * @param options AWS S3 bucket to proxy to * @module Backends */ function awsS3(options) { const opts = normalizeOptions(options); const fn = async function awsS3Fetch(req, init) { if (typeof req === "string") req = new Request(req, init); if (!allowedMethods.includes(req.method)) return new Response(`HTTP Method not allowed, only ${allowedMethods.join(", ")} are allowed.`, { status: 405 }); const url = new URL(req.url); if (url.pathname.endsWith("/")) url.pathname += "index.html"; let res; if (typeof opts.credentials !== 'object') res = await fetch(buildS3Url(opts, url.pathname), { method: req.method, headers: req.headers }); else res = await aws_1.default.fetch({ path: `/${opts.bucket}${url.pathname}`, service: 's3', region: opts.region, method: req.method, }, opts.credentials); if (res.status >= 500) { console.error(`AWS S3 returned a server error, status code: ${res.status}, body:`, await res.text()); return new Response(req.method === "GET" ? "Something went wrong." : null, { status: 500 }); } if (res.status === 404) return new Response(req.method === "GET" ? "Not found." : null, { status: 404 }); if (res.status >= 400) { console.error(`AWS S3 returned a client error, status code: ${res.status}, body:`, await res.text()); return new Response(req.method === "GET" ? "Something went wrong." : null, { status: 500 }); } for (let h in res.headers) if (h.startsWith("x-amz-")) res.headers.delete(h); return res; }; return Object.assign(fn, { proxyConfig: opts }); } exports.awsS3 = awsS3; function normalizeOptions(options) { if (typeof options === 'string') options = { bucket: options }; return options; } function buildS3Url(opts, path) { const region = opts.region || 'us-east-1'; let host; if (region === 'us-east-1') { host = "s3.amazonaws.com"; } else { host = `s3-${opts.region}.amazonaws.com`; } return `http://${host}/${opts.bucket}${path}`; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzX3MzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhY2tlbmRzL2F3c19zMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILGdDQUF5QztBQVl6QyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQTtBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsU0FBZ0IsS0FBSyxDQUFDLE9BQThCO0lBQ2hELE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXZDLE1BQU0sRUFBRSxHQUFHLEtBQUssVUFBVSxVQUFVLENBQUMsR0FBZ0IsRUFBRSxJQUFrQjtRQUNyRSxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxHQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTFELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFDcEMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxpQ0FBaUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFFbkgsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFBO1FBRWhDLElBQUksR0FBYSxDQUFDO1FBRWxCLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxLQUFLLFFBQVE7WUFDcEMsR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBOztZQUUvRixHQUFHLEdBQUcsTUFBTSxhQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNsQixJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3RDLE9BQU8sRUFBRSxJQUFJO2dCQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtnQkFDbkIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2FBQ3JCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxnREFBZ0QsR0FBRyxDQUFDLE1BQU0sU0FBUyxFQUFFLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckcsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1NBQzlGO1FBRUQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUc7WUFDbEIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtRQUVwRixJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELEdBQUcsQ0FBQyxNQUFNLFNBQVMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3JHLE9BQU8sSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQTtTQUM5RjtRQUVELEtBQUssSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQU87WUFDckIsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztnQkFDdEIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFN0IsT0FBTyxHQUFHLENBQUE7SUFDZCxDQUFDLENBQUE7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7QUFDbkQsQ0FBQztBQTlDRCxzQkE4Q0M7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE9BQThCO0lBQ3BELElBQUksT0FBTyxPQUFPLEtBQUssUUFBUTtRQUMzQixPQUFPLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUE7SUFDakMsT0FBTyxPQUFPLENBQUE7QUFDbEIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLElBQWtCLEVBQUUsSUFBWTtJQUNoRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQztJQUMxQyxJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLE1BQU0sS0FBSyxXQUFXLEVBQUU7UUFDeEIsSUFBSSxHQUFHLGtCQUFrQixDQUFBO0tBQzVCO1NBQU07UUFDSCxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxnQkFBZ0IsQ0FBQTtLQUMzQztJQUVELE9BQU8sVUFBVSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQTtBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbW9kdWxlIEJhY2tlbmRzXG4gKi9cbmltcG9ydCBhd3MsIHsgQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hd3MnXG5pbXBvcnQgeyBQcm94eUZ1bmN0aW9uIH0gZnJvbSAnLi4vcHJveHknO1xuXG4vKipcbiAqIEFXUyBTMyBidWNrZXQgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF3c1MzT3B0aW9ucyB7XG4gICAgYnVja2V0OiBzdHJpbmcsXG4gICAgcmVnaW9uPzogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzPzogQ3JlZGVudGlhbHNcbn1cblxuY29uc3QgYWxsb3dlZE1ldGhvZHMgPSBbXCJHRVRcIiwgXCJIRUFEXCJdXG5cbi8qKlxuICogQ3JlYXRlcyBhIGZldGNoLWxpa2UgcHJveHkgZnVuY3Rpb24gZm9yIG1ha2luZyByZXF1ZXN0cyB0byBBV1MgUzMuXG4gKiBcbiAqIEV4YW1wbGU6XG4gKiBcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGF3c1MzIH0gZnJvbSBcIi4vc3JjL2JhY2tlbmRzXCI7XG4gKiBjb25zdCBiYWNrZW5kID0gYXdzUzMoe1xuICogIGJ1Y2tldDogXCJmbHlpby10ZXN0LXdlYnNpdGVcIixcbiAqICAvLyByZWdpb246IFwidXMtZWFzdC0xXCJcbiAqICAvLyBjcmVkZW50aWFsczogeyAvLyBmb3IgcHJpdmF0ZSBTMyBidWNrZXRzXG4gKiAgLy8gICBhY2Nlc3NLZXlJZDogYXBwLmNvbmZpZy5hd3NfYWNjZXNzX2tleV9pZCxcbiAqICAvLyAgIHNlY3JldEFjY2Vzc0tleTogYXBwLmNvbmZpZy5hd3Nfc2VjcmV0X2FjY2Vzc19rZXksIC8vIHN0b3JlIHRoaXMgYXMgYSBzZWNyZXRcbiAqICAvLyB9XG4gKiB9KTtcbiAqIGBgYFxuICogQHBhcmFtIG9wdGlvbnMgQVdTIFMzIGJ1Y2tldCB0byBwcm94eSB0b1xuICogQG1vZHVsZSBCYWNrZW5kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXdzUzMob3B0aW9uczogQXdzUzNPcHRpb25zIHwgc3RyaW5nKTogUHJveHlGdW5jdGlvbjxBd3NTM09wdGlvbnM+IHtcbiAgICBjb25zdCBvcHRzID0gbm9ybWFsaXplT3B0aW9ucyhvcHRpb25zKTtcblxuICAgIGNvbnN0IGZuID0gYXN5bmMgZnVuY3Rpb24gYXdzUzNGZXRjaChyZXE6IFJlcXVlc3RJbmZvLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxID09PSBcInN0cmluZ1wiKSByZXEgPSBuZXcgUmVxdWVzdChyZXEsIGluaXQpO1xuXG4gICAgICAgIGlmICghYWxsb3dlZE1ldGhvZHMuaW5jbHVkZXMocmVxLm1ldGhvZCkpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGBIVFRQIE1ldGhvZCBub3QgYWxsb3dlZCwgb25seSAke2FsbG93ZWRNZXRob2RzLmpvaW4oXCIsIFwiKX0gYXJlIGFsbG93ZWQuYCwgeyBzdGF0dXM6IDQwNSB9KVxuXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCk7XG4gICAgICAgIGlmICh1cmwucGF0aG5hbWUuZW5kc1dpdGgoXCIvXCIpKVxuICAgICAgICAgICAgdXJsLnBhdGhuYW1lICs9IFwiaW5kZXguaHRtbFwiXG5cbiAgICAgICAgbGV0IHJlczogUmVzcG9uc2U7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLmNyZWRlbnRpYWxzICE9PSAnb2JqZWN0JylcbiAgICAgICAgICAgIHJlcyA9IGF3YWl0IGZldGNoKGJ1aWxkUzNVcmwob3B0cywgdXJsLnBhdGhuYW1lKSwgeyBtZXRob2Q6IHJlcS5tZXRob2QsIGhlYWRlcnM6IHJlcS5oZWFkZXJzIH0pXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJlcyA9IGF3YWl0IGF3cy5mZXRjaCh7XG4gICAgICAgICAgICAgICAgcGF0aDogYC8ke29wdHMuYnVja2V0fSR7dXJsLnBhdGhuYW1lfWAsXG4gICAgICAgICAgICAgICAgc2VydmljZTogJ3MzJyxcbiAgICAgICAgICAgICAgICByZWdpb246IG9wdHMucmVnaW9uLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgICAgIH0sIG9wdHMuY3JlZGVudGlhbHMpO1xuXG4gICAgICAgIGlmIChyZXMuc3RhdHVzID49IDUwMCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgQVdTIFMzIHJldHVybmVkIGEgc2VydmVyIGVycm9yLCBzdGF0dXMgY29kZTogJHtyZXMuc3RhdHVzfSwgYm9keTpgLCBhd2FpdCByZXMudGV4dCgpKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UocmVxLm1ldGhvZCA9PT0gXCJHRVRcIiA/IFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuXCIgOiBudWxsLCB7IHN0YXR1czogNTAwIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0KVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXEubWV0aG9kID09PSBcIkdFVFwiID8gXCJOb3QgZm91bmQuXCIgOiBudWxsLCB7IHN0YXR1czogNDA0IH0pXG5cbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBBV1MgUzMgcmV0dXJuZWQgYSBjbGllbnQgZXJyb3IsIHN0YXR1cyBjb2RlOiAke3Jlcy5zdGF0dXN9LCBib2R5OmAsIGF3YWl0IHJlcy50ZXh0KCkpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXEubWV0aG9kID09PSBcIkdFVFwiID8gXCJTb21ldGhpbmcgd2VudCB3cm9uZy5cIiA6IG51bGwsIHsgc3RhdHVzOiA1MDAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGggaW4gcmVzLmhlYWRlcnMpXG4gICAgICAgICAgICBpZiAoaC5zdGFydHNXaXRoKFwieC1hbXotXCIpKVxuICAgICAgICAgICAgICAgIHJlcy5oZWFkZXJzLmRlbGV0ZShoKVxuXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihmbiwgeyBwcm94eUNvbmZpZzogb3B0cyB9KVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVPcHRpb25zKG9wdGlvbnM6IEF3c1MzT3B0aW9ucyB8IHN0cmluZyk6IEF3c1MzT3B0aW9ucyB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJylcbiAgICAgICAgb3B0aW9ucyA9IHsgYnVja2V0OiBvcHRpb25zIH1cbiAgICByZXR1cm4gb3B0aW9uc1xufVxuXG5mdW5jdGlvbiBidWlsZFMzVXJsKG9wdHM6IEF3c1MzT3B0aW9ucywgcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZWdpb24gPSBvcHRzLnJlZ2lvbiB8fCAndXMtZWFzdC0xJztcbiAgICBsZXQgaG9zdDogc3RyaW5nO1xuICAgIGlmIChyZWdpb24gPT09ICd1cy1lYXN0LTEnKSB7XG4gICAgICAgIGhvc3QgPSBcInMzLmFtYXpvbmF3cy5jb21cIlxuICAgIH0gZWxzZSB7XG4gICAgICAgIGhvc3QgPSBgczMtJHtvcHRzLnJlZ2lvbn0uYW1hem9uYXdzLmNvbWBcbiAgICB9XG5cbiAgICByZXR1cm4gYGh0dHA6Ly8ke2hvc3R9LyR7b3B0cy5idWNrZXR9JHtwYXRofWBcbn1cbiJdfQ==