@fly/edge
Version:
Fly's TypeScript Edge
82 lines • 10.9 kB
JavaScript
;
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==