serverless-aws-lambda
Version:
AWS Application Load Balancer and API Gateway - Lambda dev tool for Serverless. Allows Express synthax in handlers. Supports packaging, local invoking and offline ALB, APG, S3, SNS, SQS, DynamoDB Stream server mocking.
61 lines • 58.4 kB
JavaScript
"use strict";var ft=Object.create;var X=Object.defineProperty,yt=Object.defineProperties,bt=Object.getOwnPropertyDescriptor,kt=Object.getOwnPropertyDescriptors,It=Object.getOwnPropertyNames,Ue=Object.getOwnPropertySymbols,xt=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty,St=Object.prototype.propertyIsEnumerable;var De=i=>{throw TypeError(i)};var Te=(i,n,e)=>n in i?X(i,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[n]=e,pe=(i,n)=>{for(var e in n||(n={}))Be.call(n,e)&&Te(i,e,n[e]);if(Ue)for(var e of Ue(n))St.call(n,e)&&Te(i,e,n[e]);return i},Ke=(i,n)=>yt(i,kt(n));var Ct=(i,n)=>{for(var e in n)X(i,e,{get:n[e],enumerable:!0})},Oe=(i,n,e,t)=>{if(n&&typeof n=="object"||typeof n=="function")for(let s of It(n))!Be.call(i,s)&&s!==e&&X(i,s,{get:()=>n[s],enumerable:!(t=bt(n,s))||t.enumerable});return i};var A=(i,n,e)=>(e=i!=null?ft(xt(i)):{},Oe(n||!i||!i.__esModule?X(e,"default",{value:i,enumerable:!0}):e,i)),Rt=i=>Oe(X({},"__esModule",{value:!0}),i);var o=(i,n,e)=>Te(i,typeof n!="symbol"?n+"":n,e),qe=(i,n,e)=>n.has(i)||De("Cannot "+e);var W=(i,n,e)=>(qe(i,n,"read from private field"),e?e.call(i):n.get(i)),_=(i,n,e)=>n.has(i)?De("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(i):n.set(i,e),$e=(i,n,e,t)=>(qe(i,n,"write to private field"),t?t.call(i,e):n.set(i,e),e),M=(i,n,e)=>(qe(i,n,"access private method"),e);var g=(i,n,e)=>new Promise((t,s)=>{var r=a=>{try{p(e.next(a))}catch(u){s(u)}},c=a=>{try{p(e.throw(a))}catch(u){s(u)}},p=a=>a.done?t(a.value):Promise.resolve(a.value).then(r,c);p((e=e.apply(i,n)).next())});var Wt={};Ct(Wt,{default:()=>Xt,s3Plugin:()=>ht});module.exports=Rt(Wt);var Fe=require("fs"),Ve=A(require("path")),Xe=i=>{let n=typeof i=="string"?i:"localS3/";n=Ve.default.resolve(n),n.endsWith("/")||(n+="/");try{if((0,Fe.statSync)(n).isDirectory())return n;throw new Error(`Provided localStorageDir '${i}' is not a directory`)}catch(e){if(e.code=="ENOENT")return n;throw e.code=="ENOTDIR"?new Error(`Provided localStorageDir '${i}' is not a directory`):e}};var Je=require("crypto"),H=require("fs/promises"),be=require("fs"),U=A(require("path"));var We=({Bucket:i,RequestId:n})=>`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>NoSuchBucket</Code><Message>The specified bucket does not exist</Message><BucketName>${i}</BucketName><RequestId>${n}</RequestId><HostId>local</HostId></Error>
`,R=({Key:i,RequestId:n})=>`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>NoSuchKey</Code><Message>The specified key does not exist.</Message><Key>${i}</Key><RequestId>${n}</RequestId><HostId>local</HostId></Error>`;var Ht={PutObject:["ObjectCreated","Put"],CopyObject:["ObjectCreated","Copy"],DeleteObject:["ObjectRemoved","Delete"]},wt=({bucket:i,eTag:n,size:e,key:t,eventName:s,sourceIPAddress:r,requestId:c})=>({eventVersion:"2.1",eventSource:"aws:s3",awsRegion:"eu-west-3",eventTime:new Date().toUTCString(),eventName:s,userIdentity:{principalId:"AWS:AIDA6ECTW4PP5BZ6IKOGM"},requestParameters:{sourceIPAddress:r},responseElements:{"x-amz-request-id":c,"x-amz-id-2":"K9uTQdtIwO9VVKYvEk0BrLAAO9zWajA33cUGdcrZvjoLHLwBUBocXu1GU50BEcMIfNTLdt2KKmzaagHcGBWncOyUgcXx8UILLYKd26F/pf4="},s3:{s3SchemaVersion:"1.0",configurationId:"975e5867-6fe6-4b2c-925e-ef15389f6d3f",bucket:{name:i,ownerIdentity:{principalId:"A1HCF0AO1IXCSI"},arn:`arn:aws:s3:::${i}`},object:{key:t,size:e,eTag:n,sequencer:"0063E38F8ED88A5726"}}}),Tt=(i,n)=>{if(i){if(Array.isArray(i))return i.map(e=>typeof e.prefix=="string"?n.startsWith(e.prefix):typeof e.suffix=="string"?n.endsWith(e.suffix):!1).every(e=>e===!0)}else return!0},N=(a,u)=>g(void 0,[a,u],function*(i,{bucket:n,eTag:e,size:t,key:s,requestCmd:r,sourceIPAddress:c,requestId:p}){let l=Ht[r];for(let m of i)for(let h of m.s3){if(n!=h.bucket)continue;let[b,k]=h.type;if(b==l[0]&&(k=="*"||k==l[1])&&Tt(h.rules,s))try{yield m.invoke({Records:[wt({bucket:n,eTag:e,size:t,key:s,sourceIPAddress:c,requestId:p,eventName:l.join(":")})]},{kind:"s3",event:h})}catch(I){console.log(I)}}});var _e=require("crypto"),le=i=>(0,_e.createHash)("md5").update(i).digest("hex");var ts=5*1024*1024;var z=i=>`"${le(i)}"`;var y=class i extends Error{constructor({Code:e,Message:t,SenderFault:s,RequestId:r,statusCode:c}){super(t);o(this,"statusCode");o(this,"Code");o(this,"SenderFault",!0);o(this,"RequestId");this.Code=e,this.RequestId=r,this.statusCode=c,typeof s=="boolean"&&(this.SenderFault=s)}toXml(e=""){return i.genericError({Code:this.Code,Message:this.message,RequestId:this.RequestId,info:e})}static genericError({Code:e,Message:t,RequestId:s,info:r}){return`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>${e}</Code><Message>${t}</Message>${r!=null?r:""}<RequestId>${s}</RequestId><HostId>local</HostId></Error>`}},T=class extends y{constructor({TagKey:e,Message:t,RequestId:s}){super({Code:"InvalidTag",Message:t,SenderFault:!0,statusCode:400,RequestId:s});o(this,"TagKey");this.TagKey=e}toXml(){return super.toXml(`<TagKey>${this.TagKey}</TagKey>`)}},me=class extends y{constructor(n){super({Code:"MalformedXML",Message:"The XML you provided was not well-formed or did not validate against our published schema",RequestId:n})}},j=class extends y{constructor({Message:n,RequestId:e}){super({Code:"BadRequest",Message:n,RequestId:e})}},ge=class extends y{constructor({Message:e,RequestId:t,ArgumentName:s,ArgumentValue:r}){super({Code:"InvalidArgument",Message:e,RequestId:t});o(this,"ArgumentName");o(this,"ArgumentValue");this.ArgumentName=s,this.ArgumentValue=r}toXml(){return super.toXml(`<ArgumentName>${this.ArgumentName}</ArgumentName><ArgumentValue>${this.ArgumentValue}</ArgumentValue>`)}},he=class extends y{constructor(n){super({Code:"NoSuchTagSet",Message:"The TagSet does not exist",RequestId:n,statusCode:404})}},q=class extends y{constructor(n,e){super({Code:"UnsupportedCommand",Message:`${n} is currently not supported`,RequestId:e,statusCode:500})}};var ke=require("fast-xml-parser");var vt=new ke.XMLParser,Mt=["STANDARD","REDUCED_REDUNDANCY","STANDARD_IA","ONEZONE_IA","INTELLIGENT_TIERING","GLACIER","DEEP_ARCHIVE","OUTPOSTS","GLACIER_IR","SNOW"],Lt=/\.{2,}/,Et=/^(\d{1,3}\.){3}\d{1,3}$/,At=/^[a-z0-9]+[a-z0-9.-]+[a-z0-9]$/,fe,S=class S{constructor(n){o(this,"requestId");o(this,"metadata",{});var t;this.requestId=(t=n["amz-sdk-invocation-id"])!=null?t:(0,Je.randomUUID)(),Object.keys(n).filter(s=>s.startsWith("x-amz-meta-")).forEach(s=>this.metadata[s]=n[s])}static genLocalKey(n,e,t){return le(U.default.posix.join(n,e,t!=null?t:""))}static bootstrap(){return g(this,null,function*(){try{let n=yield(0,H.readFile)(U.default.join(this.localStoragePath,"__items.json"),"utf-8"),e=JSON.parse(n);if(e.version==2){this.persistence=e;return}this.persistence=yield W(this,fe).call(this,e)}catch(n){}})}static createBucketDir(n,e){return g(this,null,function*(){let t=U.default.join(this.localStoragePath,n);try{if(!(yield(0,H.stat)(t)).isDirectory())throw yield(0,H.rm)(t),new Error}catch(s){try{yield(0,H.mkdir)(t,{recursive:!0}),this.persistence.buckets[n]=Ke(pe({date:Date.now()},e),{objects:{}})}catch(r){console.error(r)}}})}static saveState(){S.persist?(0,be.writeFileSync)(U.default.join(this.localStoragePath,"__items.json"),JSON.stringify(this.persistence)):(0,be.rmSync)(this.localStoragePath,{force:!0,recursive:!0})}static isValidBucketName(n){let e=n.length;return e<3||e>63||Lt.test(n)||Et.test(n)||n.startsWith("xn--")||n.startsWith("sthree-")||n.endsWith("-s3alias")||n.endsWith("--ol-s3")?!1:At.test(n)}isValidStorageClass(n,e){return Mt.includes(n)?!0:(e.writeHead(400,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(`<Error><Code>InvalidStorageClass</Code><Message>The storage class you specified is not valid</Message><StorageClassRequested>${n}</StorageClassRequested><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`),!1)}hasNot(n,e){if(!S.isValidBucketName(n)){e.writeHead(400,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidBucketName</Code><Message>The specified bucket is not valid.</Message><BucketName>${n}</BucketName><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`);return}if(!S.persistence.buckets[n])return e.writeHead(404,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(We({Bucket:n,RequestId:this.requestId})),!0}static removeObject(n,e,t,s){return g(this,null,function*(){let r=this.persistence.buckets[n].objects[e];if(!r)return;let c=U.default.join(this.localStoragePath,n,r.currentKey);try{let p=yield(0,H.stat)(c);p.isFile()&&(yield(0,H.rm)(c)),yield N(this.callableLambdas,{bucket:n,key:e,requestId:s,requestCmd:"DeleteObject",eTag:r.ETag,sourceIPAddress:t,size:p.size}),delete this.persistence.buckets[n].objects[e]}catch(p){}})}static getTagsFromRequest(n,e,t){return g(this,null,function*(){let s;n.on("data",m=>{s=typeof s=="undefined"?m:Buffer.concat([s,m])});let r=yield new Promise(m=>{n.on("end",()=>g(this,null,function*(){m(s)}))}),c=new me(e);if(!r)throw new y({Code:"MissingRequestBodyError",Message:"Request Body is empty",RequestId:e});let p;try{p=vt.parse(r)}catch(m){throw c}if(p.Tagging=="")return;let a=p.Tagging.TagSet.Tag;a&&!Array.isArray(a)&&(a=[a]);let u={};for(let m of a){if(m===null||typeof m!="object"||Array.isArray(m))throw c;let{Key:h,Value:b}=m;if(typeof h!="string"||typeof b!="string")throw c;if(h in u)throw new T({TagKey:h,RequestId:e,Message:"Cannot provide multiple Tags with the same key"});if(h.length>128||h.length<1)throw new T({TagKey:h,RequestId:e,Message:"The TagKey you have provided is invalid"});if(b.length>256)throw new T({TagKey:h,RequestId:e,Message:"The TagValue you have provided is invalid"});u[h]=b}let l=t=="Bucket"?50:10;if(Object.keys(u).length>l)throw new j({Message:`${t} tag count cannot be greater than ${l}`,RequestId:e});return u})}};fe=new WeakMap,o(S,"localStoragePath"),o(S,"persist",!0),o(S,"persistence",{version:2,buckets:{}}),o(S,"XMLBuilder",new ke.XMLBuilder),_(S,fe,n=>g(S,null,function*(){let e={version:2,buckets:{}};for(let[t,s]of Object.entries(n.files))try{let[r,...c]=t.replace(S.localStoragePath,"").split("/").filter(Boolean),p=yield(0,H.stat)(t),a=c.join("/"),u=S.genLocalKey(r,a),l={currentKey:u,type:s.type,cacheControl:s.cacheControl,StorageClass:"STANDARD",size:p.size,LastModified:p.mtimeMs,ETag:z(yield(0,H.readFile)(t)),metadata:{},versions:{[u]:{}}};e.buckets[r]?e.buckets[r].objects[a]=l:e.buckets[r]={date:Date.now(),deletionPolicy:"Retain",objects:{[a]:l}}}catch(r){}return e})),o(S,"callableLambdas",[]);var d=S;var Ie=class extends d{constructor(e,t){super(t);o(this,"bucket");o(this,"delimiter");o(this,"encodingType");o(this,"maxKeys",1e3);o(this,"prefix");o(this,"expectedOwner");o(this,"optionalObjectAttributes");o(this,"requestPayer");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s,this.delimiter=e.searchParams.get("delimiter"),this.encodingType=e.searchParams.get("encoding-type");let r=e.searchParams.get("max-keys");r&&(this.maxKeys=r),this.prefix=e.searchParams.get("prefix"),this.expectedOwner=e.searchParams.get("x-amz-expected-bucket-owner"),this.optionalObjectAttributes=e.searchParams.get("x-amz-optional-object-attributes"),this.requestPayer=e.searchParams.get("x-amz-request-payer")}getKeys(){let e=Object.keys(d.persistence.buckets[this.bucket].objects);return this.prefix&&(e=e.filter(t=>t.startsWith(this.prefix))),e.sort(),e}isInvalidMaxKeys(e){if(this.maxKeys){if(isNaN(this.maxKeys))return e.statusCode=400,e.setHeader("Server","AmazonS3"),e.setHeader("Content-Type","application/xml"),e.setHeader("x-amzn-requestid",this.requestId),e.end(`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidArgument</Code><Message>Provided max-keys not an integer or within integer range</Message><ArgumentName>max-keys</ArgumentName><ArgumentValue>${this.maxKeys}</ArgumentValue><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`),!0;if(this.maxKeys=Number(this.maxKeys),this.maxKeys<0||this.maxKeys>2147483647)return e.statusCode=400,e.setHeader("Server","AmazonS3"),e.setHeader("Content-Type","application/xml"),e.setHeader("x-amzn-requestid",this.requestId),e.end(`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidArgument</Code><Message>Argument maxKeys must be an integer between 0 and 2147483647</Message><ArgumentName>maxKeys</ArgumentName><ArgumentValue>${this.maxKeys}</ArgumentValue><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`),!0}}};function Ye(i,n,e){let t=[];for(let s of e)if(s.startsWith(i)){let r=s.indexOf(n,i.length);if(r>0){let c=s.substring(0,r+n.length);t.includes(c)||t.push(c)}}return t}var L=class extends Ie{constructor(e,t){super(e,t);o(this,"marker");this.marker=e.searchParams.get("marker")}exec(e){var h,b;if(this.hasNot(this.bucket,e)||this.isInvalidMaxKeys(e))return;let t=!1,s="",r="",c=[],p="",a=this.getKeys();if(this.marker){a=a.filter(I=>I.localeCompare(this.marker)>0);let k=a.findIndex(I=>I.startsWith(this.marker));k>-1&&(a=a.slice(k+1))}let u=Number(this.maxKeys),l=a.length;l>u&&(t=!0,a=a.slice(0,u),l>a.length&&(s=a[a.length-1])),this.delimiter&&(r=`<Delimiter>${this.delimiter}</Delimiter>`,c=Ye((h=this.prefix)!=null?h:"",this.delimiter,a),this.marker&&(c=c.filter(k=>k!=this.marker))),c.length&&(a=a.filter(k=>!c.some(I=>k.startsWith(I))),p=c.map(k=>`<CommonPrefixes><Prefix>${k}</Prefix></CommonPrefixes>`).join("")),this.marker&&t&&!a.length&&c.length&&(s=c[0]),e.statusCode=200,e.setHeader("Server","AmazonS3"),e.setHeader("Content-Type","application/xml"),e.setHeader("x-amzn-requestid",this.requestId);let m=a.map(k=>{let I=d.persistence.buckets[this.bucket].objects[k];return`<Contents>
<Key>${k}</Key>
<LastModified>${new Date(I.LastModified).toISOString()}</LastModified>
<ETag>${I.ETag}</ETag>
<Size>${I.size}</Size>
<StorageClass>${I.StorageClass}</StorageClass>
</Contents>`}).join("");e.end(`<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>${this.bucket}</Name>
<Prefix>${(b=this.prefix)!=null?b:""}</Prefix>
${this.marker?`<Marker>${this.marker}</Marker>`:""}
${r}
${p}
${s?`<NextMarker>${s}</NextMarker>`:""}
<MaxKeys>${this.maxKeys}</MaxKeys>
<IsTruncated>${t}</IsTruncated>
${m}
</ListBucketResult>`)}},E=class extends Ie{constructor(e,t){super(e,t);o(this,"continuationToken");o(this,"fetchOwner");o(this,"startAfter");this.continuationToken=e.searchParams.get("continuation-token"),this.fetchOwner=e.searchParams.get("fetch-owner"),this.startAfter=e.searchParams.get("start-after")}exec(e){var k,I;if(this.hasNot(this.bucket,e)||this.isInvalidMaxKeys(e))return;let t=!1,s="",r="",c=[],p="",a=this.getKeys(),u="";if(this.continuationToken?u=Buffer.from(this.continuationToken,"base64").toString():this.startAfter&&(u=this.startAfter),u){a=a.filter(w=>w.localeCompare(u)>0);let C=a.findIndex(w=>w.startsWith(u));C>-1&&(a=a.slice(C+1))}let l=Number(this.maxKeys);a.length>l&&(t=!0,a=a.slice(0,l)),this.delimiter&&(r=`<Delimiter>${this.delimiter}</Delimiter>`,c=Ye((k=this.prefix)!=null?k:"",this.delimiter,a),u&&(c=c.filter(C=>C!=u))),c.length&&(a=a.filter(C=>!c.some(w=>C.startsWith(w))),p=c.map(C=>`<CommonPrefixes><Prefix>${C}</Prefix></CommonPrefixes>`).join(""));let h=a.length+c.length;t&&(a.length?s=Buffer.from(a[a.length-1]).toString("base64"):c.length&&(s=Buffer.from(c[0]).toString("base64"))),e.statusCode=200,e.setHeader("Server","AmazonS3"),e.setHeader("Content-Type","application/xml"),e.setHeader("x-amzn-requestid",this.requestId);let b=a.map(C=>{let w=d.persistence.buckets[this.bucket].objects[C];return`<Contents>
<Key>${C}</Key>
<LastModified>${new Date(w.LastModified).toISOString()}</LastModified>
<ETag>${w.ETag}</ETag>
<Size>${w.size}</Size>
<StorageClass>${w.StorageClass}</StorageClass>
</Contents>`}).join("");e.end(`<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>${this.bucket}</Name>
<Prefix>${(I=this.prefix)!=null?I:""}</Prefix>
${r}
${p}
<KeyCount>${h}</KeyCount>
${s?`<NextContinuationToken>${s}</NextContinuationToken>`:""}
<MaxKeys>${this.maxKeys}</MaxKeys>
<IsTruncated>${t}</IsTruncated>
${this.continuationToken?`<ContinuationToken>${this.continuationToken}</ContinuationToken>`:""}
${!this.continuationToken&&this.startAfter?`<StartAfter>${this.startAfter}</StartAfter>`:""}
${b}
</ListBucketResult>`)}};var B=class extends d{constructor(n,e){super(e)}exec(n){return g(this,null,function*(){let e=[];Object.entries(d.persistence.buckets).forEach(([t,s])=>{e.push({name:t,date:new Date(s.date).toISOString()})}),n.writeHead(200,{"x-amz-request-id":this.requestId,"Content-Type":"application/xml","transfer-encoding":"chunked",Server:"AmazonS3"}),n.end(`<?xml version="1.0" encoding="UTF-8"?>
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<DisplayName>local-User</DisplayName>
<ID>1234567890123456789</ID>
</Owner>
<Buckets>
${e.map(t=>`<Bucket>
<CreationDate>${t.date}</CreationDate>
<Name>${t.name}</Name>
</Bucket>`).join(`
`)}
</Buckets>
</ListAllMyBucketsResult>`)})}};var Ge=require("fs"),Ee=A(require("path"));var J=({ifMatch:i,ifNoneMatch:n,ifModifiedSince:e,ifUnmodifiedSince:t},{ETag:s,LastModified:r})=>i&&i!==s?{statusCode:412,Code:"PreconditionFailed",Condition:"If-Match"}:n&&n===s?{statusCode:304,Code:"PreconditionFailed",Condition:"If-None-Match"}:e&&e>=r?{statusCode:304,Code:"PreconditionFailed",Condition:"If-Modified-Since"}:t&&t<r?{statusCode:412,Code:"PreconditionFailed",Condition:"If-Unmodified-Since"}:200,D=class i extends d{constructor(e,t){super(t);o(this,"bucketPath");o(this,"bucket");o(this,"key");o(this,"versionId");o(this,"partNumber");o(this,"range");o(this,"ifMatch");o(this,"ifNoneMatch");o(this,"ifModifiedSince");o(this,"ifUnmodifiedSince");let s=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")),[r,...c]=s.split("/").filter(Boolean);if(this.bucket=r,this.key=c.join("/"),this.bucketPath=Ee.default.join(i.localStoragePath,r),this.versionId=e.searchParams.get("versionId"),this.partNumber=e.searchParams.has("partNumber")?Number(e.searchParams.get("partNumber")):null,t.range){let[p]=t.range.split("bytes=").filter(Boolean),[a,u]=p.split("-");!isNaN(Number(a))&&!isNaN(Number(u))&&(this.range=[Number(a),Number(u)])}this.ifMatch=t["if-match"],this.ifNoneMatch=t["if-none-match"],t["if-modified-since"]&&(this.ifModifiedSince=new Date(t["if-modified-since"]).getTime()),t["if-unmodified-since"]&&(this.ifUnmodifiedSince=new Date(t["if-unmodified-since"]).getTime())}exec(e){return g(this,null,function*(){if(!this.hasNot(this.bucket,e)){if(!d.persistence.buckets[this.bucket].objects[this.key]){e.writeHead(404,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(R({Key:this.key,RequestId:this.requestId}));return}try{let t={ifMatch:this.ifMatch,ifModifiedSince:this.ifModifiedSince,ifNoneMatch:this.ifNoneMatch,ifUnmodifiedSince:this.ifUnmodifiedSince},s=d.persistence.buckets[this.bucket].objects[this.key],r=J(t,s);if(r==200){let c=200,p=s.size,a,u=s.type,l={};if(this.range){c=206,l.start=this.range[0],l.end=this.range[1];let m=1;l.end>s.size&&(l.end=s.size,m--),p=m+l.end-l.start,a=`bytes ${l.start}-${l.end}/${s.size}`,u="application/octet-stream"}e.statusCode=c,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("x-amz-server-side-encryption","AES256"),e.setHeader("Date",new Date().toUTCString()),e.setHeader("Last-Modified",new Date(s.LastModified).toUTCString()),e.setHeader("ETag",s.ETag),e.setHeader("Accept-Ranges","bytes"),a&&e.setHeader("Content-Range",a),e.setHeader("Content-Length",p),u&&e.setHeader("Content-Type",u),e.setHeader("Server","AmazonS3"),s.cacheControl&&e.setHeader("Cache-Control",s.cacheControl),s.contentDisposition&&e.setHeader("Content-Disposition",s.contentDisposition),s.contentEncoding&&e.setHeader("Content-Encoding",s.contentEncoding),s.contentLanguage&&e.setHeader("Content-Language",s.contentLanguage),s.expires&&e.setHeader("Expires",new Date(s.expires).toUTCString()),s.websiteRedirectLocation&&e.setHeader("x-amz-website-redirect-location",s.websiteRedirectLocation),Object.entries(s.metadata).forEach(([m,h])=>{e.setHeader(m,h)}),(0,Ge.createReadStream)(Ee.default.join(this.bucketPath,s.currentKey),l).pipe(e)}else e.writeHead(r.statusCode,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(`<?xml version="1.0" encoding="UTF-8"?><Error><Code>${r.Code}</Code><Message>At least one of the pre-conditions you specified did not hold</Message><Condition>${r.Condition}</Condition><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`)}catch(t){e.statusCode=500,e.end("Internal Server Error")}}})}};var v=class extends d{constructor(n,e){super(e)}exec(n){n.statusCode=500,n.setHeader("x-amzn-requestid",this.requestId),n.setHeader("Content-Type","application/xml"),n.setHeader("Server","AmazonS3"),n.end(`<Error><Code>UnknownOperation</Code><Message>Your request is currently not supported.</Message><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`)}};var Y=class extends d{constructor(e,t){super(t);o(this,"bucket");o(this,"key");o(this,"versionId");let[s,...r]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s,this.key=r.join("/"),this.versionId=e.searchParams.get("versionId")}exec(e){return g(this,null,function*(){var t;if(!this.hasNot(this.bucket,e)){if(!d.persistence.buckets[this.bucket].objects[this.key]){e.writeHead(404,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(R({Key:this.key,RequestId:this.requestId}));return}try{e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Content-Type","application/xml"),e.statusCode=200;let s={Tagging:{TagSet:{Tag:[]}}},r=d.persistence.buckets[this.bucket].objects[this.key].tags;if(r)for(let[p,a]of Object.entries(r))s.Tagging.TagSet.Tag.push({Key:p,Value:a});let c=d.XMLBuilder.build(s);e.end(`<?xml version="1.0" encoding="UTF-8"?>${c}`)}catch(s){if(e.statusCode=400,s instanceof y){e.setHeader("Content-Type","application/xml"),s.statusCode&&(e.statusCode=s.statusCode),e.end(s.toXml());return}if(s instanceof Error){e.setHeader("Content-Type","application/xml"),e.end(y.genericError({Code:"UnknownError",Message:s.message,RequestId:this.requestId}));return}e.end((t=s==null?void 0:s.toString)==null?void 0:t.call(s))}}})}};var G=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e){return g(this,null,function*(){var t;if(!this.hasNot(this.bucket,e))try{e.setHeader("x-amzn-requestid",this.requestId);let s=d.persistence.buckets[this.bucket].tags;if(!s)throw new he(this.requestId);e.statusCode=200;let r={Tagging:{TagSet:{Tag:[]}}};for(let[p,a]of Object.entries(s))r.Tagging.TagSet.Tag.push({Key:p,Value:a});let c=d.XMLBuilder.build(r);e.setHeader("Content-Type","application/xml"),e.end(`<?xml version="1.0" encoding="UTF-8"?>${c}`)}catch(s){if(e.statusCode=400,s instanceof y){e.setHeader("Content-Type","application/xml"),s.statusCode&&(e.statusCode=s.statusCode),e.end(s.toXml());return}if(s instanceof Error){e.setHeader("Content-Type","application/xml"),e.end(y.genericError({Code:"UnknownError",Message:s.message,RequestId:this.requestId}));return}e.end((t=s==null?void 0:s.toString)==null?void 0:t.call(s))}})}};var Qe=i=>{let{url:n,headers:e}=i,t=new URL(n,"http://localhost:3000"),s=t.searchParams.get("x-id"),r=e["user-agent"],c=t.pathname.replace("/%40s3/","").replace("/@s3/","").split("/").filter(Boolean).length==1;if(r&&r.startsWith("aws-cli")){let[,p]=r.split("command/"),[,...a]=p.split(".");switch(a.join(".")){case"ls":return/@s3\/?$/.test(n)?new B(t,e):t.searchParams.get("list-type")=="2"?new E(t,e):new L(t,e);case"list-buckets":return new B(t,e);case"list-objects":return new L(t,e);case"list-objects-v2":return new E(t,e);case"rb.rm":return t.searchParams.get("list-type")=="2"?new E(t,e):new L(t,e);case"get-object":return new D(t,e);case"cp":case"mv":case"sync":return c?t.searchParams.get("list-type")=="2"?new E(t,e):new L(t,e):new D(t,e);case"get-bucket-tagging":return new G(t,e);case"get-object-tagging":return new Y(t,e);default:break}}else{if(!s)return t.searchParams.has("tagging")?c?new G(t,e):new Y(t,e):n.endsWith("@s3/")?new B(t,e):t.searchParams.get("list-type")=="2"?new E(t,e):new L(t,e);if(s=="GetObject")return new D(t,e)}return new v(t,e)};var Ze=require("fs"),Ae=A(require("path")),O=require("fs/promises");var K=class extends d{constructor(e,t){var a;super(t);o(this,"bucket");o(this,"key");o(this,"contentType");o(this,"cacheControl");o(this,"contentDisposition");o(this,"contentEncoding");o(this,"contentLanguage");o(this,"websiteRedirectLocation");o(this,"expires");o(this,"storageClass","STANDARD");o(this,"tagging");let[s,...r]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s,this.key=r.join("/"),this.contentType=(a=t["content-type"])!=null?a:"application/octet-stream",this.cacheControl=t["cache-control"],this.contentDisposition=t["content-disposition"],this.contentEncoding=t["content-encoding"],this.contentLanguage=t["content-language"],this.websiteRedirectLocation=t["x-amz-website-redirect-location"],t["x-amz-tagging"]&&(this.tagging=t["x-amz-tagging"]);let c=t["x-amz-storage-class"];c&&(this.storageClass=c);let p=new Date(t.expires);isNaN(p)||(this.expires=p.getTime())}exec(e,t){return g(this,null,function*(){if(this.hasNot(this.bucket,e)||!this.isValidStorageClass(this.storageClass,e))return;let s={};if(this.tagging){let u=()=>{e.statusCode=400,e.setHeader("Content-Type","application/xml"),e.end(new ge({ArgumentName:"x-amz-tagging",ArgumentValue:this.tagging,Message:"The header 'x-amz-tagging' shall be encoded as UTF-8 then URLEncoded URL query parameters without tag name duplicates.",RequestId:this.requestId}).toXml())};if(typeof this.tagging!="string"||!Pt(this.tagging))return u();let l=new URLSearchParams(this.tagging);for(let m of l.keys()){if(m in s){e.statusCode=400,e.setHeader("Content-Type","application/xml"),e.end(new T({TagKey:m,RequestId:this.requestId,Message:"Cannot provide multiple Tags with the same key"}).toXml());return}if(m.length>128||m.length<1){e.statusCode=400,e.setHeader("Content-Type","application/xml"),e.end(new T({TagKey:m,RequestId:this.requestId,Message:"The TagKey you have provided is invalid"}).toXml());return}let h=l.get(m);if(h.length>256){e.statusCode=400,e.setHeader("Content-Type","application/xml"),e.end(new T({TagKey:m,RequestId:this.requestId,Message:"The TagValue you have provided is invalid"}).toXml());return}s[m]=h}}let r=Object.keys(s).length;if(r>10){e.statusCode=400,e.setHeader("Content-Type","application/xml"),e.end(new j({Message:`Object tag count cannot be greater than ${10}`,RequestId:this.requestId}).toXml());return}let c=d.genLocalKey(this.bucket,this.key),p=Ae.default.join(d.localStoragePath,this.bucket,c);try{yield(0,O.mkdir)(Ae.default.dirname(p),{recursive:!0})}catch(u){}let a=(0,Ze.createWriteStream)(p);a.on("close",()=>g(this,null,function*(){var u,l,m;e.end();try{let h=yield(0,O.stat)(p),b=z(yield(0,O.readFile)(p));d.persistence.buckets[this.bucket].objects[this.key]={currentKey:c,type:this.contentType,cacheControl:this.cacheControl,contentDisposition:this.contentDisposition,contentEncoding:this.contentEncoding,contentLanguage:this.contentLanguage,expires:this.expires,websiteRedirectLocation:this.websiteRedirectLocation,ETag:b,size:h.size,LastModified:h.mtimeMs,StorageClass:this.storageClass,metadata:this.metadata,versions:{[c]:{}},tags:r?s:void 0};let k=(m=(l=(u=t.socket.remoteAddress)==null?void 0:u.split(":"))==null?void 0:l[3])!=null?m:"127.0.0.1";yield N(d.callableLambdas,{bucket:this.bucket,key:this.key,requestId:this.requestId,requestCmd:"PutObject",eTag:b,sourceIPAddress:k,size:h.size})}catch(h){console.log(h)}})),e.setHeader("status",100),e.setHeader("Server","AmazonS3"),e.setHeader("x-amzn-requestid",this.requestId),t.pipe(a)})}},Pt=i=>!i.split("&").find(n=>n.split("=").length>2);var Q=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e){return g(this,null,function*(){if(!d.isValidBucketName(this.bucket)){e.writeHead(400,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidBucketName</Code><Message>The specified bucket is not valid.</Message><BucketName>${this.bucket}</BucketName><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`);return}if(d.persistence.buckets[this.bucket]){e.statusCode=409,e.setHeader("Content-Type","application/xml"),e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Server","AmazonS3"),e.end(`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>BucketAlreadyOwnedByYou</Code><Message>Your previous request to create the named bucket succeeded and you already own it.</Message><BucketName>${this.bucket}</BucketName><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`);return}yield d.createBucketDir(this.bucket,{deletionPolicy:"Retain"}),e.statusCode=200,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Location",`/${this.bucket}`),e.setHeader("Server","AmazonS3"),e.end()})}};var Pe=A(require("path")),F=require("fs/promises");var $=class extends d{constructor(e,t){var m,h;super(t);o(this,"bucket");o(this,"key");o(this,"sourceBucket");o(this,"sourceKey");o(this,"contentType");o(this,"cacheControl");o(this,"contentDisposition");o(this,"contentEncoding");o(this,"contentLanguage");o(this,"websiteRedirectLocation");o(this,"expires");o(this,"storageClass","STANDARD");o(this,"metadataDirective");o(this,"ifMatch");o(this,"ifNoneMatch");o(this,"ifModifiedSince");o(this,"ifUnmodifiedSince");let[s,...r]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s,this.key=r.join("/"),this.contentType=(m=t["content-type"])!=null?m:"application/octet-stream",this.cacheControl=t["cache-control"],this.contentDisposition=t["content-disposition"],this.contentEncoding=t["content-encoding"],this.contentLanguage=t["content-language"],this.websiteRedirectLocation=t["x-amz-website-redirect-location"];let c=t["x-amz-storage-class"];c&&(this.storageClass=c);let p=new Date(t.expires);isNaN(p)||(this.expires=p.getTime()),this.metadataDirective=t["x-amz-metadata-directive"];let a=(h=t["x-amz-copy-source"])!=null?h:"",[u,...l]=decodeURIComponent(a.replace("/@s3/","")).split("/").filter(Boolean);this.sourceBucket=u,this.sourceKey=l.join("/"),this.ifMatch=t["x-amz-copy-source-if-match"],this.ifNoneMatch=t["x-amz-copy-source-if-none-match"],t["x-amz-copy-source-if-modified-since"]&&(this.ifModifiedSince=new Date(t["x-amz-copy-source-if-modified-since"]).getTime()),t["x-amz-copy-source-if-unmodified-since"]&&(this.ifUnmodifiedSince=new Date(t["x-amz-copy-source-if-unmodified-since"]).getTime())}exec(e,t){return g(this,null,function*(){var l,m,h;if(this.sourceKey==""){e.statusCode=400,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Content-Type","application/xml"),e.setHeader("Server","AmazonS3"),e.end(`<?xml version="1.0" encoding="UTF-8"?><Error><Code>InvalidArgument</Code><Message>Invalid copy source object key</Message><ArgumentName>x-amz-copy-source</ArgumentName><ArgumentValue>x-amz-copy-source</ArgumentValue><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`);return}if(this.hasNot(this.bucket,e)||this.hasNot(this.sourceBucket,e)||!this.isValidStorageClass(this.storageClass,e))return;if(!d.persistence.buckets[this.sourceBucket].objects[this.sourceKey]){e.writeHead(404,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(R({Key:this.sourceKey,RequestId:this.requestId}));return}let s=d.persistence.buckets[this.sourceBucket].objects[this.sourceKey];if([this.bucket,this.key].join("/")==[this.sourceBucket,this.sourceKey].join("/")&&[this.storageClass==s.StorageClass,this.websiteRedirectLocation==s.websiteRedirectLocation].every(k=>k===!0)){e.statusCode=400,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Content-Type","application/xml"),e.setHeader("Server","AmazonS3"),e.end(`<Error><Code>InvalidRequest</Code><Message>This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes.</Message><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`);return}let r={ifMatch:this.ifMatch,ifNoneMatch:this.ifNoneMatch,ifModifiedSince:this.ifModifiedSince,ifUnmodifiedSince:this.ifUnmodifiedSince},c=J(r,s);if(c!==200){e.writeHead(c.statusCode,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(`<?xml version="1.0" encoding="UTF-8"?><Error><Code>${c.Code}</Code><Message>At least one of the pre-conditions you specified did not hold</Message><Condition>${c.Condition}</Condition><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`);return}let p=Pe.default.join(d.localStoragePath,this.sourceBucket,s.currentKey),a=d.genLocalKey(this.bucket,this.key),u=Pe.default.join(d.localStoragePath,this.bucket,a);try{yield(0,F.copyFile)(p,u);let b=yield(0,F.stat)(u),k=z(yield(0,F.readFile)(u));this.metadataDirective=="COPY"?d.persistence.buckets[this.bucket].objects[this.key]={currentKey:a,type:s.type,cacheControl:s.cacheControl,contentDisposition:s.contentDisposition,contentEncoding:s.contentEncoding,contentLanguage:s.contentLanguage,expires:s.expires,ETag:k,StorageClass:s.StorageClass,LastModified:b.mtimeMs,size:b.size,metadata:s.metadata,versions:{[a]:{}}}:d.persistence.buckets[this.bucket].objects[this.key]={currentKey:a,type:this.contentType,cacheControl:this.cacheControl,contentDisposition:this.contentDisposition,contentEncoding:this.contentEncoding,contentLanguage:this.contentLanguage,expires:this.expires,ETag:k,StorageClass:this.storageClass,LastModified:b.mtimeMs,size:b.size,metadata:this.metadata,websiteRedirectLocation:this.websiteRedirectLocation,versions:{[a]:{}}};let I=new Date(b.mtimeMs).toISOString();e.statusCode=200,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Content-Type","application/xml"),e.setHeader("Server","AmazonS3"),e.end(`<?xml version="1.0" encoding="UTF-8"?>
<CopyObjectResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"><LastModified>${I}</LastModified><ETag>${k}</ETag></CopyObjectResult>`);let C=(h=(m=(l=t.socket.remoteAddress)==null?void 0:l.split(":"))==null?void 0:m[3])!=null?h:"127.0.0.1";yield N(d.callableLambdas,{bucket:this.bucket,key:this.key,requestId:this.requestId,requestCmd:"CopyObject",eTag:k,sourceIPAddress:C,size:b.size})}catch(b){console.error(b),e.statusCode=500,e.end("Internal Server Error")}})}};var Z=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e,t){return g(this,null,function*(){var s;if(!this.hasNot(this.bucket,e))try{e.setHeader("x-amzn-requestid",this.requestId),d.persistence.buckets[this.bucket].tags=yield d.getTagsFromRequest(t,this.requestId,"Bucket"),e.statusCode=204,e.end()}catch(r){if(e.statusCode=400,r instanceof y){e.setHeader("Content-Type","application/xml"),r.statusCode&&(e.statusCode=r.statusCode),e.end(r.toXml());return}if(r instanceof Error){e.setHeader("Content-Type","application/xml"),e.end(y.genericError({Code:"UnknownError",Message:r.message,RequestId:this.requestId}));return}e.end((s=r==null?void 0:r.toString)==null?void 0:s.call(r))}})}};var ee=class extends d{constructor(e,t){super(t);o(this,"bucket");o(this,"key");let[s,...r]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s,this.key=r.join("/")}exec(e,t){return g(this,null,function*(){var s;if(!this.hasNot(this.bucket,e)){if(!d.persistence.buckets[this.bucket].objects[this.key]){e.writeHead(404,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(R({Key:this.key,RequestId:this.requestId}));return}try{e.setHeader("x-amzn-requestid",this.requestId),d.persistence.buckets[this.bucket].objects[this.key].tags=yield d.getTagsFromRequest(t,this.requestId,"Object"),e.statusCode=200,e.end()}catch(r){if(e.statusCode=400,r instanceof y){e.setHeader("Content-Type","application/xml"),r.statusCode&&(e.statusCode=r.statusCode),e.end(r.toXml());return}if(r instanceof Error){e.setHeader("Content-Type","application/xml"),e.end(y.genericError({Code:"UnknownError",Message:r.message,RequestId:this.requestId}));return}e.end((s=r==null?void 0:r.toString)==null?void 0:s.call(r))}}})}};var te=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e,t){return g(this,null,function*(){this.hasNot(this.bucket,e)||(e.statusCode=500,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Content-Type","application/xml"),e.end(new q("PutBucketPolicy",this.requestId).toXml()))})}};var se=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e,t){return g(this,null,function*(){this.hasNot(this.bucket,e)||(e.statusCode=500,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Content-Type","application/xml"),e.end(new q("PutBucketCors",this.requestId).toXml()))})}};var ne=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e,t){return g(this,null,function*(){this.hasNot(this.bucket,e)||(e.statusCode=500,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Content-Type","application/xml"),e.end(new q("PutBucketAcl",this.requestId).toXml()))})}};var re=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e,t){return g(this,null,function*(){this.hasNot(this.bucket,e)||(e.statusCode=500,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Content-Type","application/xml"),e.end(new q("PutObjectAcl",this.requestId).toXml()))})}};var et=i=>{let{url:n,headers:e}=i,t=new URL(n,"http://localhost:3000"),s=t.searchParams.get("x-id"),r=e["user-agent"];if(r&&r.startsWith("aws-cli")){let[,c]=r.split("command/"),[,...p]=c.split("."),a=p.join("."),u=typeof e["x-amz-copy-source"]=="string";switch(a){case"cp":case"sync":case"mv":return u?new $(t,e):new K(t,e);case"mb":case"create-bucket":return new Q(t,e);case"copy-object":return new $(t,e);case"put-object":return new K(t,e);case"put-bucket-tagging":return new Z(t,e);case"put-object-tagging":return new ee(t,e);case"put-bucket-policy":return new te(t,e);case"put-bucket-cors":return new se(t,e);case"put-bucket-acl":return new ne(t,e);case"put-object-acl":return new re(t,e);default:break}}else{if(!s){let c=t.pathname.replace("/%40s3/","").replace("/@s3/","").split("/").filter(Boolean).length==1;return t.searchParams.has("policy")?new te(t,e):t.searchParams.has("cors")?new se(t,e):t.searchParams.has("acl")?c?new ne(t,e):new re(t,e):t.searchParams.has("tagging")?c?new Z(t,e):new ee(t,e):new Q(t,e)}if(s=="PutObject")return new K(t,e);if(s=="CopyObject")return new $(t,e)}return new v(t,e)};var xe=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e){this.hasNot(this.bucket,e)||(e.statusCode=200,e.setHeader("x-amzn-requestid",this.requestId),e.end())}};var Ne=A(require("path"));var Se=class extends d{constructor(e,t){super(t);o(this,"filePath");o(this,"bucketPath");o(this,"bucket");o(this,"key");o(this,"versionId");o(this,"partNumber");o(this,"range");o(this,"ifMatch");o(this,"ifNoneMatch");o(this,"ifModifiedSince");o(this,"ifUnmodifiedSince");let s=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")),[r,...c]=s.split("/").filter(Boolean);if(this.bucket=r,this.key=c.join("/"),this.bucketPath=Ne.default.join(d.localStoragePath,r),this.filePath=Ne.default.join(this.bucketPath,...c),this.versionId=e.searchParams.get("versionId"),this.partNumber=e.searchParams.has("partNumber")?Number(e.searchParams.get("partNumber")):null,t.range){let[p]=t.range.split("bytes=").filter(Boolean),[a,u]=p.split("-");!isNaN(Number(a))&&!isNaN(Number(u))&&(this.range=[Number(a),Number(u)])}this.ifMatch=t["if-match"],this.ifNoneMatch=t["if-none-match"],t["if-modified-since"]&&(this.ifModifiedSince=new Date(t["if-modified-since"]).getTime()),t["if-unmodified-since"]&&(this.ifUnmodifiedSince=new Date(t["if-unmodified-since"]).getTime())}exec(e){return g(this,null,function*(){if(!this.hasNot(this.bucket,e)){if(!d.persistence.buckets[this.bucket].objects[this.key]){e.writeHead(404,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(R({Key:this.key,RequestId:this.requestId}));return}try{let t={ifMatch:this.ifMatch,ifModifiedSince:this.ifModifiedSince,ifNoneMatch:this.ifNoneMatch,ifUnmodifiedSince:this.ifUnmodifiedSince},s=d.persistence.buckets[this.bucket].objects[this.key],r=J(t,s);if(r==200){let c=200,p=s.size,a,u=s.type,l={};if(this.range){c=206,l.start=this.range[0],l.end=this.range[1];let m=1;l.end>s.size&&(l.end=s.size,m--),p=m+l.end-l.start,a=`bytes ${l.start}-${l.end}/${s.size}`,u="application/octet-stream"}e.statusCode=c,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("x-amz-server-side-encryption","AES256"),e.setHeader("Date",new Date().toUTCString()),e.setHeader("Last-Modified",new Date(s.LastModified).toUTCString()),e.setHeader("ETag",s.ETag),e.setHeader("Accept-Ranges","bytes"),a&&e.setHeader("Content-Range",a),e.setHeader("Content-Length",p),u&&e.setHeader("Content-Type",u),e.setHeader("Server","AmazonS3"),s.cacheControl&&e.setHeader("Cache-Control",s.cacheControl),s.contentDisposition&&e.setHeader("Content-Disposition",s.contentDisposition),s.contentEncoding&&e.setHeader("Content-Encoding",s.contentEncoding),s.contentLanguage&&e.setHeader("Content-Language",s.contentLanguage),s.expires&&e.setHeader("Expires",new Date(s.expires).toUTCString()),s.websiteRedirectLocation&&e.setHeader("x-amz-website-redirect-location",s.websiteRedirectLocation),Object.entries(s.metadata).forEach(([m,h])=>{e.setHeader(m,h)}),e.end()}else e.writeHead(r.statusCode,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(`<?xml version="1.0" encoding="UTF-8"?><Error><Code>${r.Code}</Code><Message>At least one of the pre-conditions you specified did not hold</Message><Condition>${r.Condition}</Condition><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`)}catch(t){e.statusCode=500,e.end("Internal Server Error")}}})}};var tt=i=>{let{url:n,headers:e}=i,t=new URL(n,"http://localhost:3000");return t.pathname.replace("/%40s3/","").replace("/@s3/","").split("/").filter(Boolean).length>1?new Se(t,e):new xe(t,e)};var st=require("fs/promises"),nt=A(require("path"));var ie=class extends d{constructor(e,t){super(t);o(this,"bucket");let s=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")),[r]=s.split("/").filter(Boolean);this.bucket=r}exec(e,...t){return g(this,null,function*(){if(!this.hasNot(this.bucket,e))try{let r=!(Object.keys(d.persistence.buckets[this.bucket].objects).length>0&&d.persistence.buckets[this.bucket].deletionPolicy=="Retain");yield(0,st.rm)(nt.default.join(d.localStoragePath,this.bucket),{recursive:r,force:!0}),delete d.persistence.buckets[this.bucket],e.writeHead(204,{"x-amzn-requestid":this.requestId,Server:"AmazonS3"}).end()}catch(s){e.writeHead(404,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(`<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>BucketNotEmpty</Code><Message>The bucket you tried to delete is not empty</Message><BucketName>${this.bucket}</BucketName><RequestId>${this.requestId}</RequestId><HostId>local</HostId></Error>`)}})}};var oe=class extends d{constructor(e,t){super(t);o(this,"bucket");o(this,"key");o(this,"version");let s=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")),[r,...c]=s.split("/").filter(Boolean);this.bucket=r,this.key=c.join("/"),this.version=e.searchParams.get("versionId")}exec(e,t){return g(this,null,function*(){var r,c,p;if(this.hasNot(this.bucket,e))return;e.statusCode=204,e.setHeader("x-amzn-requestid",this.requestId),e.setHeader("Server","AmazonS3"),e.end();let s=(p=(c=(r=t.socket.remoteAddress)==null?void 0:r.split(":"))==null?void 0:c[3])!=null?p:"127.0.0.1";yield d.removeObject(this.bucket,this.key,s,this.requestId)})}};var Ce=class extends d{constructor(e,t){super(t);o(this,"bucket");let[s]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s}exec(e){return g(this,null,function*(){var t;if(!this.hasNot(this.bucket,e))try{d.persistence.buckets[this.bucket].tags=void 0,e.setHeader("x-amzn-requestid",this.requestId),e.statusCode=204,e.end()}catch(s){if(e.statusCode=400,s instanceof y){e.setHeader("Content-Type","application/xml"),s.statusCode&&(e.statusCode=s.statusCode),e.end(s.toXml());return}if(s instanceof Error){e.setHeader("Content-Type","application/xml"),e.end(y.genericError({Code:"UnknownError",Message:s.message,RequestId:this.requestId}));return}e.end((t=s==null?void 0:s.toString)==null?void 0:t.call(s))}})}};var Re=class extends d{constructor(e,t){super(t);o(this,"bucket");o(this,"key");let[s,...r]=decodeURIComponent(e.pathname.replace("/%40s3/","").replace("/@s3/","")).split("/").filter(Boolean);this.bucket=s,this.key=r.join("/")}exec(e){return g(this,null,function*(){var t;if(!this.hasNot(this.bucket,e)){if(!d.persistence.buckets[this.bucket].objects[this.key]){e.writeHead(404,{"x-amzn-requestid":this.requestId,"Content-Type":"application/xml",Server:"AmazonS3"}).end(R({Key:this.key,RequestId:this.requestId}));return}try{d.persistence.buckets[this.bucket].objects[this.key].tags=void 0,e.setHeader("x-amzn-requestid",this.requestId),e.statusCode=204,e.end()}catch(s){if(e.statusCode=400,s instanceof y){e.setHeader("Content-Type","application/xml"),s.statusCode&&(e.statusCode=s.statusCode),e.end(s.toXml());return}if(s instanceof Error){e.setHeader("Content-Type","application/xml"),e.end(y.genericError({Code:"UnknownError",Message:s.message,RequestId:this.requestId}));return}e.end((t=s==null?void 0:s.toString)==null?void 0:t.call(s))}}})}};var Nt=new Set(["rm","rb.rm","mv","delete-object"]),rt=i=>{let{url:n,headers:e}=i,t=new URL(n,"http://localhost:3000"),s=t.pathname.replace("/%40s3/","").replace("/@s3/","").split("/").filter(Boolean).length==1;if(t.searchParams.has("tagging"))return s?new Ce(t,e):new Re(t,e);let r=e["user-agent"];if(r&&r.startsWith("aws-cli")){let[,c]=r.split("command/"),[,...p]=c.split("."),a=p.join(".");if(Nt.has(a))return new oe(t,e);if(a=="rb"||a=="delete-bucket")return new ie(t,e)}else{let c=t.searchParams.get("x-id");if(!c)return new ie(t,e);if(c=="DeleteObject")return new oe(t,e)}return new v(t,e)};var f=class f{static getApiGV1Headers(n,e){let{rawHeaders:t}=n,s,r={"X-Forwarded-For":n.socket.remoteAddress,"X-Forwarded-Proto":"http","X-Forwarded-Port":String(f.port)};for(let u=0;u<t.length;){let l=t[u],m=l.toLowerCase();if(["connection","x-mock-type"].includes(m)){u=u+2;continue}this.knownHeaders.includes(m)&&(l=this.normalizeHeaderKey(m));let h=t[u+1];r[l]=h,m=="x-api-key"&&(s=h),u=u+2}let c={};for(let u of Object.keys(r).sort((l,m)=>l.localeCompare(m)))c[u]=r[u];let p={"X-Forwarded-For":[n.socket.remoteAddress],"X-Forwarded-Proto":["http"],"X-Forwarded-Port":[String(f.port)]};for(let u=0;u<t.length;){let l=t[u],m=l.toLowerCase();if(["connection","x-mock-type"].includes(m)){u=u+2;continue}this.knownHeaders.includes(m)&&(l=this.normalizeHeaderKey(m));let h=t[u+1];p[l]?p[l].push(h):p[l]=[h],u=u+2}let a={};for(let u of Object.keys(p).sort((l,m)=>l.localeCompare(m)))a[u]=p[u];return{headers:c,multiValueHeaders:a,apiKey:s}}static getCustomHeaders(n,e){let{headers:t}=n;return delete t["x-mock-type"],delete t.connection,pe({"X-Forwarded-For":n.socket.remoteAddress,"X-Forwarded-Proto":"http","X-Forwarded-Port":String(f.port)},t)}static getPathParameters(n,e){let t=n.paths[0].split("/"),s=e.pathname.split("/"),r={};return t.forEach((c,p)=>{c.startsWith("{")&&c.endsWith("}")&&!c.endsWith("+}")&&(r[c.slice(1,-1)]=s[p])}),r}};o(f,"apiId",""),o(f,"accountId",""),o(f,"port",3e3),o(f,"serve"),o(f,"contentType",{json:"application/json",text:"text/plain; charset=utf-8",octet:"application/octet-stream"}),o(f,"keepAlive",["Connection","keep-alive"]),o(f,"dummyHost","http://localhost:3003"),o(f,"httpErrMsg",'{"message":"Internal Server Error"}'),o(f,"apigJsonParseErrMsg",'{"message":"[Unknown error parsing request body]"}'),o(f,"apigForbiddenErrMsg",'{"message":"Forbidden"}'),o(f,"amzMsgNull",'{"message":null}'),o(f,"apgTimeoutMsg",'{"message": "Endpoint request timed out"}'),o(f,"unavailable",'{"message":"Service Unavailable"}'),o(f,"timeoutRegex",/after.\d+.*seconds/),o(f,"apgRequestTimeout",30),o(f,"normalizeHeaderKey",n=>