turbo-remote-cache-construct
Version:
A Turborepo Remote Cache implementation using AWS API Gateway, Lambda, S3, and DynamoDB.
2 lines (1 loc) • 1.91 kB
JavaScript
import{GetObjectCommand as h,PutObjectCommand as C}from"@aws-sdk/client-s3";import{S3RequestPresigner as E}from"@aws-sdk/s3-request-presigner";import{Hash as _}from"@aws-sdk/hash-node";import{parseUrl as l}from"@aws-sdk/url-parser";import{HttpRequest as A}from"@aws-sdk/protocol-http";import{formatUrl as f}from"@aws-sdk/util-format-url";var R=async e=>{let t=e.headers["access-control-request-method"],o=e.headers["access-control-request-headers"]?.split(",").map(r=>r.trim()).filter(r=>r!=="Authorization"),i=o?.reduce((r,n)=>(e.headers[n]&&(r[n]=e.headers[n]),r),{});if(!t)return{statusCode:400,body:JSON.stringify({error:"Missing required headers"})};let s=e.requestContext.authorizer?.teamId;if(!s)return{statusCode:400,body:JSON.stringify({error:"Missing teamId"})};let a;if(t==="GET"?a=new h({Bucket:process.env.ARTIFACTS_BUCKET,Key:`${s}/${e.pathParameters?.hash}`}):t==="PUT"&&(a=new C({Bucket:process.env.ARTIFACTS_BUCKET,Key:`${s}/${e.pathParameters?.hash}`,ContentType:e.headers["content-type"]})),!a)return{statusCode:400,body:JSON.stringify({error:"Invalid request method"})};if(!process.env.AWS_ACCESS_KEY_ID||!process.env.AWS_SECRET_ACCESS_KEY||!process.env.AWS_REGION)throw new Error("AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_REGION must be set");let c=new E({credentials:{accessKeyId:process.env.AWS_ACCESS_KEY_ID,secretAccessKey:process.env.AWS_SECRET_ACCESS_KEY,sessionToken:process.env.AWS_SESSION_TOKEN},region:process.env.AWS_REGION,sha256:_.bind(null,"sha256")}),m=l(`https://${process.env.ARTIFACTS_BUCKET}.s3.${process.env.AWS_REGION}.amazonaws.com/${s}/${e.pathParameters?.hash}`),S=new A({...m,method:t,query:{teamId:s},headers:i}),p=await c.presign(S,{expiresIn:60*60*24,signableHeaders:o?new Set(o):void 0}),u=f(p),d=new URL(u);return d.searchParams.delete("teamId"),{statusCode:200,headers:{location:d.href,allow_authorization_header:!1},body:""}};export{R as handler};