@mateosuarezdev/brpc 1.0.64 → 1.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/storage/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var S=($)=>$.startsWith("image/"),j=($)=>$.startsWith("video/"),q=($)=>$.startsWith("audio/"),F=($)=>$.startsWith("text/")||$.includes("pdf")||$.includes("word")||$.includes("sheet")||$.includes("presentation")||$.includes("opendocument")||$==="application/rtf",N=($)=>$.includes("zip")||$.includes("rar")||$.includes("tar")||$.includes("7z")||$.includes("gzip"),T=($)=>$==="application/javascript"||$==="application/json"||$==="text/html"||$==="text/css"||$==="application/xml"||$.includes("javascript"),z=($)=>$.startsWith("font/")||$.includes("font"),O=($)=>{if(!$)return"other";let W=$.toLowerCase();if(S(W))return"image";if(j(W))return"video";if(q(W))return"audio";if(F(W))return"document";if(N(W))return"archive";if(T(W))return"code";if(z(W))return"font";return"other"},_={isImage:S,isVideo:j,isAudio:q,isDocument:F,isArchive:N,isCode:T,isFont:z};function o(){let W=Buffer.from("Hello, this is a test file for S3 upload!","utf-8");return new File([W],"test.txt",{type:"text/plain"})}function r($,W){if($.url)return $.url;if($.key)if($.isPrivate)return`/storage/${$.key}`;else return`https://${W?.bucket??process.env.AWS_BUCKET}.s3.amazonaws.com/${$.key}`;throw Error("Invalid storage object")}function V($,W){if(!$||$<1||!W||W<1)return"1:1";let H=(L,Q)=>Q===0?L:H(Q,L%Q),J=H($,W);return`${$/J}:${W/J}`}function t($,W){if(!$||!W||$<1||W<1)return"1:1";let H=$/W,J=[{ratio:1,label:"1:1"},{ratio:0.8,label:"4:5"},{ratio:0.75,label:"3:4"},{ratio:0.6666666666666666,label:"2:3"},{ratio:0.5625,label:"9:16"},{ratio:1.5,label:"3:2"},{ratio:1.3333333333333333,label:"4:3"},{ratio:1.7777777777777777,label:"16:9"},{ratio:2.3333333333333335,label:"21:9"}],L=0.03;for(let{ratio:X,label:Z}of J)if(Math.abs(H-X)/X<L)return Z;let Q=(X,Z)=>Z===0?X:Q(Z,X%Z),Y=Q($,W);return`${$/Y}:${W/Y}`}class M extends Error{code;clientCode;httpStatus;data;cause;static STATUS_MAP={BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_SUPPORTED:405,TIMEOUT:408,CONFLICT:409,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,UNPROCESSABLE_CONTENT:422,TOO_MANY_REQUESTS:429,CLIENT_CLOSED_REQUEST:499,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504};constructor($){super($.message);if(this.name="BRPCError",this.code=$.code,this.clientCode=$.clientCode,this.httpStatus=M.STATUS_MAP[$.code],this.data=$.data,this.cause=$.cause,Error.captureStackTrace)Error.captureStackTrace(this,M)}toJSON(){return{name:this.name,code:this.code,clientCode:this.clientCode,message:this.message,data:this.data,httpStatus:this.httpStatus}}static badRequest($,W,H){return new M({code:"BAD_REQUEST",message:$,clientCode:W,data:H})}static unauthorized($="Unauthorized",W,H){return new M({code:"UNAUTHORIZED",message:$,clientCode:W,data:H})}static forbidden($="Forbidden",W,H){return new M({code:"FORBIDDEN",message:$,clientCode:W,data:H})}static notFound($="Not Found",W,H){return new M({code:"NOT_FOUND",message:$,clientCode:W,data:H})}static preconditionFailed($="Precondition failed",W,H){return new M({code:"NOT_FOUND",message:$,clientCode:W,data:H})}static conflict($,W,H){return new M({code:"CONFLICT",message:$,clientCode:W,data:H})}static unprocessableContent($,W,H){return new M({code:"UNPROCESSABLE_CONTENT",message:$,clientCode:W,data:H})}static tooManyRequests($="Too many requests",W,H){return new M({code:"TOO_MANY_REQUESTS",message:$,clientCode:W,data:H})}static internalServerError($="Internal Server Error",W,H){return new M({code:"INTERNAL_SERVER_ERROR",message:$,clientCode:W,data:H})}static timeout($="Request timeout",W,H){return new M({code:"TIMEOUT",message:$,clientCode:W,data:H})}}import P from"sharp";var w={xs:200,sm:400,md:800,lg:1200},D=1920;async function U($,W,H,J,L){try{let{data:Q,info:Y}=await P($,{limitInputPixels:1e8}).rotate().resize({width:W,height:W,fit:"inside",withoutEnlargement:!0}).webp({quality:H}).toBuffer({resolveWithObject:!0});return{buffer:Q,object:{name:J.replace(/\.[^/.]+$/,".webp"),resolvedType:"image",metadata:{type:"image/webp",size:Q.length,extension:".webp",width:Y.width,height:Y.height,aspectRatio:Y.width&&Y.height?Y.width/Y.height:1,aspectRatioStr:Y.width&&Y.height?V(Y.width,Y.height):"1:1",acl:L}}}}catch(Q){throw M.conflict(`Failed to optimize image: ${Q instanceof Error?Q.message:"Unknown error"}`)}}async function I($){if(!$)throw M.conflict("A file must be provided");let W,H="unknown.webp";if(typeof $==="string"){if(console.log("I'm going to fail here for file",$),!$.startsWith("data:"))throw console.log("I never got here"),M.conflict("Invalid base64 format");let[,J]=$.split(",");if(!J)throw M.conflict("Invalid base64 data");W=Buffer.from(J,"base64")}else{if(!_.isImage($.type))throw M.conflict("File must be an image");let J=await $.arrayBuffer();W=Buffer.from(J),H=$.name??H}return{buffer:W,name:H}}async function L0($,{size:W,quality:H,acl:J}={}){let L=await I($);return U(L.buffer,W??D,H??80,L.name,J??"public-read")}async function M0($,{name:W="unknown.webp",size:H,quality:J,acl:L}={}){if(!$?.length)throw M.conflict("A buffer must be provided");return U($,H??D,J??80,W,L??"public-read")}async function k($,{quality:W=80,acl:H="public-read"}={}){let J=await I($),L=await U(J.buffer,D,W,J.name,H),Q=await Promise.all(Object.entries(w).map(async([Y,X])=>{let Z=await U(J.buffer,X,W,J.name,H);return[Y,Z]}));return{original:L,variants:Object.fromEntries(Q)}}import h from"sharp";import{randomUUID as b}from"crypto";import{extname as C}from"path";async function v($,W,H){if(!W)return{data:null,error:Error("File not found")};let J=$.replace(/^\/+|\/+$/g,""),L=C(W.name),Q=`${b()}${L}`,Y=`${J}/${Q}`,X=`./buckets/${J}/${Q}`;try{let Z=await Bun.write(X,W);return{data:{key:Y,file:W,bytesWritten:Z},error:null}}catch(Z){return{data:null,error:Error(`Failed to upload ${W.name} to local filesystem`)}}}async function g($,W,H){if(!W||W.length===0)return[];let J=W.map((Q)=>{let Y=H?.(Q)??Q.name;return v($,Q,Y)});return await Promise.all(J)}async function m($){let W=Bun.file(`./buckets/${$}`);if(!await W.exists())return null;return W}async function u($){let W=Bun.file(`./buckets/${$}`);if(!await W.exists())return!1;return await W.delete(),!0}var A={uploadOne:v,uploadMany:g,getOne:m,deleteOne:u};async function U0($){let W=`./cache/images/${$.key}_${$.width}_${$.quality}.webp`,H=await A.getOne(W);if(H){if(!_.isImage(H.type))return null;return H}let J=$.key,L=await A.getOne(J);if(!L)return null;if(!_.isImage(L.type))return null;let Q=await L.arrayBuffer(),Y=await h(Q).resize($.width,null,{withoutEnlargement:!0}).webp({quality:$.quality??75}).toBuffer();await Bun.write(W,Y);let X=Bun.file(W);if(!await X.exists())return null;return X}import c from"sharp";async function j0($){if(!$?.length)return null;try{let W=await c($).metadata(),H=W.width??0,J=W.height??0,L=W.height>0?H/J:1;return{type:`image/${W.format}`,size:W.size??0,extension:`.${W.format}`,width:H,height:J,aspectRatio:L,aspectRatioStr:V(H,J)}}catch(W){return console.warn("Failed to read image metadata:",W),null}}var R=process.env.AWS_FOLDER,B=R?`${R}/`:"";var{s3:y}=globalThis.Bun;import{extname as d}from"path";async function x($,W,H){let J="buffer"in W?W:{buffer:W,object:{name:W.name,resolvedType:O(W.type),metadata:{type:W.type,extension:d(W.name),size:W.size,acl:H?.acl??"public-read"}}};if("buffer"in W){if(!W.object?.name||!W.object?.metadata)throw M.badRequest("Complete metadata required when uploading buffer")}let L=$.length>1?`${$.replace(/^\/+|\/+$/g,"")}/`:"";console.log("I'm going to fail for",J.object.name);let Q=J.object.metadata.extension.startsWith(".")?J.object.metadata.extension:`.${J.object.metadata.extension}`;console.log("I never got here",J.object.name);let Y=J.object.name?J.object.name:`${crypto.randomUUID()}${Q}`,X=`${B}${L}${Y}`,Z=y.file(X),K=J?.object?.metadata?.acl??"public-read",G=K!=="public-read"&&K!=="public-read-write",E=await Z.write(J.buffer,{acl:K,type:J.object.metadata.type});return{uploadedBy:H?.uploadedBy??null,key:X,url:null,name:J.object.name,thumbnail:null,resolvedType:J.object.resolvedType,provider:"s3",isPrivate:G,metadata:{...J.object.metadata,size:E,acl:K},isActive:!0}}async function k0($,W,H={throwIf:"any"}){let J=await Promise.allSettled(W.map((Y)=>x($,Y,{acl:H?.acl,uploadedBy:H?.uploadedBy}))),L=[],Q=[];if(J.forEach((Y)=>{if(Y.status==="fulfilled"){if(L.push(Y.value),H?.externalKeys)H.externalKeys.push(Y.value.key)}else Q.push(Y.reason)}),H?.throwIf==="any"&&Q.length>0||H?.throwIf==="all"&&Q.length===W.length)throw M.internalServerError(`Upload failed: ${Q.length} of ${W.length}`);return{data:L,errors:Q.length?Q:void 0}}async function f($,W,H){let J=H?.baseId??crypto.randomUUID(),L=W.original.object.metadata.extension,Q=await x($,{...W.original,object:{...W.original.object,name:`${J}${L}`}},H),Y=await Promise.all(Object.entries(W.variants).map(async([X,Z])=>{if(!Z)return[X,null];let K=Z.object.metadata.extension,G=await x($,{...Z,object:{...Z.object,name:`${J}_${X}${K}`}},H);return[X,G]}));return{original:Q,variants:Object.fromEntries(Y.filter(([,X])=>X!==null))}}async function v0($,W,H){let J=await k(W,{quality:H?.quality,acl:H?.acl});return f($,J,{acl:H?.acl,uploadedBy:H?.uploadedBy})}var{s3:p}=globalThis.Bun;async function n($,W){if(!$||typeof $!=="string")throw M.badRequest("Key is required");let H=$.trim();if(!H||H.length===0)throw M.badRequest("Key must be a non-empty string");try{return await p.delete($),{key:$,deleted:!0,error:null}}catch(J){return{key:$,deleted:!1,error:J}}}async function P0($,W){return(await Promise.allSettled($.map((J)=>n(J,W)))).map((J,L)=>{if(J.status==="fulfilled")return J.value;return{key:$[L],deleted:!1,error:J.reason}})}var{s3:s}=globalThis.Bun;function g0($){return $.startsWith(".")?$:`.${$}`}async function m0($,W={debug:!0}){try{return{exists:await s.exists($),error:null}}catch(H){if(W?.debug)console.error("There was an error checking for file existance",H);return{exists:null,error:H}}}export{x as uploadOne,k0 as uploadMany,f as uploadGeneratedVariants,M0 as optimizeImageBuffer,L0 as optimizeImage,g0 as normalizeExtension,O as mimeTypeToResolvedType,U0 as getOptimizedImage,r as getObjectUrl,j0 as getImageMetadata,t as getAspectRatioStringRound,V as getAspectRatioString,k as generateVariants,o as generateTestFile,v0 as generateAndUploadImage,_ as fileTypePredicates,n as deleteOne,P0 as deleteMany,m0 as checkFileExistance};
|
|
2
|
+
var S=($)=>$.startsWith("image/"),j=($)=>$.startsWith("video/"),q=($)=>$.startsWith("audio/"),F=($)=>$.startsWith("text/")||$.includes("pdf")||$.includes("word")||$.includes("sheet")||$.includes("presentation")||$.includes("opendocument")||$==="application/rtf",N=($)=>$.includes("zip")||$.includes("rar")||$.includes("tar")||$.includes("7z")||$.includes("gzip"),T=($)=>$==="application/javascript"||$==="application/json"||$==="text/html"||$==="text/css"||$==="application/xml"||$.includes("javascript"),z=($)=>$.startsWith("font/")||$.includes("font"),O=($)=>{if(!$)return"other";let W=$.toLowerCase();if(S(W))return"image";if(j(W))return"video";if(q(W))return"audio";if(F(W))return"document";if(N(W))return"archive";if(T(W))return"code";if(z(W))return"font";return"other"},_={isImage:S,isVideo:j,isAudio:q,isDocument:F,isArchive:N,isCode:T,isFont:z};function o(){let W=Buffer.from("Hello, this is a test file for S3 upload!","utf-8");return new File([W],"test.txt",{type:"text/plain"})}function r($,W){if($.url)return $.url;if($.key)if($.isPrivate)return`/storage/${$.key}`;else return`https://${W?.bucket??process.env.AWS_BUCKET}.s3.amazonaws.com/${$.key}`;throw Error("Invalid storage object")}function V($,W){if(!$||$<1||!W||W<1)return"1:1";let H=(L,Q)=>Q===0?L:H(Q,L%Q),J=H($,W);return`${$/J}:${W/J}`}function t($,W){if(!$||!W||$<1||W<1)return"1:1";let H=$/W,J=[{ratio:1,label:"1:1"},{ratio:0.8,label:"4:5"},{ratio:0.75,label:"3:4"},{ratio:0.6666666666666666,label:"2:3"},{ratio:0.5625,label:"9:16"},{ratio:1.5,label:"3:2"},{ratio:1.3333333333333333,label:"4:3"},{ratio:1.7777777777777777,label:"16:9"},{ratio:2.3333333333333335,label:"21:9"}],L=0.03;for(let{ratio:X,label:Z}of J)if(Math.abs(H-X)/X<L)return Z;let Q=(X,Z)=>Z===0?X:Q(Z,X%Z),Y=Q($,W);return`${$/Y}:${W/Y}`}class M extends Error{code;clientCode;httpStatus;data;cause;static STATUS_MAP={BAD_REQUEST:400,UNAUTHORIZED:401,FORBIDDEN:403,NOT_FOUND:404,METHOD_NOT_SUPPORTED:405,TIMEOUT:408,CONFLICT:409,PRECONDITION_FAILED:412,PAYLOAD_TOO_LARGE:413,UNPROCESSABLE_CONTENT:422,TOO_MANY_REQUESTS:429,CLIENT_CLOSED_REQUEST:499,INTERNAL_SERVER_ERROR:500,NOT_IMPLEMENTED:501,BAD_GATEWAY:502,SERVICE_UNAVAILABLE:503,GATEWAY_TIMEOUT:504};constructor($){super($.message);if(this.name="BRPCError",this.code=$.code,this.clientCode=$.clientCode,this.httpStatus=M.STATUS_MAP[$.code],this.data=$.data,this.cause=$.cause,Error.captureStackTrace)Error.captureStackTrace(this,M)}toJSON(){return{name:this.name,code:this.code,clientCode:this.clientCode,message:this.message,data:this.data,httpStatus:this.httpStatus}}static badRequest($,W,H){return new M({code:"BAD_REQUEST",message:$,clientCode:W,data:H})}static unauthorized($="Unauthorized",W,H){return new M({code:"UNAUTHORIZED",message:$,clientCode:W,data:H})}static forbidden($="Forbidden",W,H){return new M({code:"FORBIDDEN",message:$,clientCode:W,data:H})}static notFound($="Not Found",W,H){return new M({code:"NOT_FOUND",message:$,clientCode:W,data:H})}static preconditionFailed($="Precondition failed",W,H){return new M({code:"NOT_FOUND",message:$,clientCode:W,data:H})}static conflict($,W,H){return new M({code:"CONFLICT",message:$,clientCode:W,data:H})}static unprocessableContent($,W,H){return new M({code:"UNPROCESSABLE_CONTENT",message:$,clientCode:W,data:H})}static tooManyRequests($="Too many requests",W,H){return new M({code:"TOO_MANY_REQUESTS",message:$,clientCode:W,data:H})}static internalServerError($="Internal Server Error",W,H){return new M({code:"INTERNAL_SERVER_ERROR",message:$,clientCode:W,data:H})}static timeout($="Request timeout",W,H){return new M({code:"TIMEOUT",message:$,clientCode:W,data:H})}}import P from"sharp";var w={xs:200,sm:400,md:800,lg:1200},D=1920;async function U($,W,H,J,L){try{let{data:Q,info:Y}=await P($,{limitInputPixels:1e8}).rotate().resize({width:W,height:W,fit:"inside",withoutEnlargement:!0}).webp({quality:H}).toBuffer({resolveWithObject:!0});return{buffer:Q,object:{name:J.replace(/\.[^/.]+$/,".webp"),resolvedType:"image",metadata:{type:"image/webp",size:Q.length,extension:".webp",width:Y.width,height:Y.height,aspectRatio:Y.width&&Y.height?Y.width/Y.height:1,aspectRatioStr:Y.width&&Y.height?V(Y.width,Y.height):"1:1",acl:L}}}}catch(Q){throw M.conflict(`Failed to optimize image: ${Q instanceof Error?Q.message:"Unknown error"}`)}}async function I($){if(!$)throw M.conflict("A file must be provided");let W,H="unknown.webp";if(typeof $==="string"){if(console.log("I'm going to fail here for file",$),!$.startsWith("data:"))throw console.log("I never got here"),M.conflict("Invalid base64 format");let[,J]=$.split(",");if(!J)throw M.conflict("Invalid base64 data");W=Buffer.from(J,"base64")}else{if(!_.isImage($.type))throw M.conflict("File must be an image");let J=await $.arrayBuffer();W=Buffer.from(J),H=$.name??H}return{buffer:W,name:H}}async function L0($,{size:W,quality:H,acl:J}={}){let L=await I($);return U(L.buffer,W??D,H??80,L.name,J??"public-read")}async function M0($,{name:W="unknown.webp",size:H,quality:J,acl:L}={}){if(!$?.length)throw M.conflict("A buffer must be provided");return U($,H??D,J??80,W,L??"public-read")}async function k($,{quality:W=80,acl:H="public-read"}={}){console.log("Going to normalizeImageInput");let J=await I($);console.log("Going to processSharpImage for original");let L=await U(J.buffer,D,W,J.name,H);console.log("Going to processSharpImage for variantsEntries");let Q=await Promise.all(Object.entries(w).map(async([Y,X])=>{let Z=await U(J.buffer,X,W,J.name,H);return[Y,Z]}));return{original:L,variants:Object.fromEntries(Q)}}import h from"sharp";import{randomUUID as b}from"crypto";import{extname as C}from"path";async function v($,W,H){if(!W)return{data:null,error:Error("File not found")};let J=$.replace(/^\/+|\/+$/g,""),L=C(W.name),Q=`${b()}${L}`,Y=`${J}/${Q}`,X=`./buckets/${J}/${Q}`;try{let Z=await Bun.write(X,W);return{data:{key:Y,file:W,bytesWritten:Z},error:null}}catch(Z){return{data:null,error:Error(`Failed to upload ${W.name} to local filesystem`)}}}async function g($,W,H){if(!W||W.length===0)return[];let J=W.map((Q)=>{let Y=H?.(Q)??Q.name;return v($,Q,Y)});return await Promise.all(J)}async function m($){let W=Bun.file(`./buckets/${$}`);if(!await W.exists())return null;return W}async function u($){let W=Bun.file(`./buckets/${$}`);if(!await W.exists())return!1;return await W.delete(),!0}var A={uploadOne:v,uploadMany:g,getOne:m,deleteOne:u};async function U0($){let W=`./cache/images/${$.key}_${$.width}_${$.quality}.webp`,H=await A.getOne(W);if(H){if(!_.isImage(H.type))return null;return H}let J=$.key,L=await A.getOne(J);if(!L)return null;if(!_.isImage(L.type))return null;let Q=await L.arrayBuffer(),Y=await h(Q).resize($.width,null,{withoutEnlargement:!0}).webp({quality:$.quality??75}).toBuffer();await Bun.write(W,Y);let X=Bun.file(W);if(!await X.exists())return null;return X}import c from"sharp";async function j0($){if(!$?.length)return null;try{let W=await c($).metadata(),H=W.width??0,J=W.height??0,L=W.height>0?H/J:1;return{type:`image/${W.format}`,size:W.size??0,extension:`.${W.format}`,width:H,height:J,aspectRatio:L,aspectRatioStr:V(H,J)}}catch(W){return console.warn("Failed to read image metadata:",W),null}}var R=process.env.AWS_FOLDER,B=R?`${R}/`:"";var{s3:y}=globalThis.Bun;import{extname as d}from"path";async function x($,W,H){let J="buffer"in W?W:{buffer:W,object:{name:W.name,resolvedType:O(W.type),metadata:{type:W.type,extension:d(W.name),size:W.size,acl:H?.acl??"public-read"}}};if("buffer"in W){if(!W.object?.name||!W.object?.metadata)throw M.badRequest("Complete metadata required when uploading buffer")}let L=$.length>1?`${$.replace(/^\/+|\/+$/g,"")}/`:"";console.log("I'm going to fail for",J.object.name);let Q=J.object.metadata.extension.startsWith(".")?J.object.metadata.extension:`.${J.object.metadata.extension}`;console.log("I never got here",J.object.name);let Y=J.object.name?J.object.name:`${crypto.randomUUID()}${Q}`,X=`${B}${L}${Y}`,Z=y.file(X),K=J?.object?.metadata?.acl??"public-read",G=K!=="public-read"&&K!=="public-read-write",E=await Z.write(J.buffer,{acl:K,type:J.object.metadata.type});return{uploadedBy:H?.uploadedBy??null,key:X,url:null,name:J.object.name,thumbnail:null,resolvedType:J.object.resolvedType,provider:"s3",isPrivate:G,metadata:{...J.object.metadata,size:E,acl:K},isActive:!0}}async function k0($,W,H={throwIf:"any"}){let J=await Promise.allSettled(W.map((Y)=>x($,Y,{acl:H?.acl,uploadedBy:H?.uploadedBy}))),L=[],Q=[];if(J.forEach((Y)=>{if(Y.status==="fulfilled"){if(L.push(Y.value),H?.externalKeys)H.externalKeys.push(Y.value.key)}else Q.push(Y.reason)}),H?.throwIf==="any"&&Q.length>0||H?.throwIf==="all"&&Q.length===W.length)throw M.internalServerError(`Upload failed: ${Q.length} of ${W.length}`);return{data:L,errors:Q.length?Q:void 0}}async function f($,W,H){let J=H?.baseId??crypto.randomUUID(),L=W.original.object.metadata.extension,Q=await x($,{...W.original,object:{...W.original.object,name:`${J}${L}`}},H),Y=await Promise.all(Object.entries(W.variants).map(async([X,Z])=>{if(!Z)return[X,null];let K=Z.object.metadata.extension,G=await x($,{...Z,object:{...Z.object,name:`${J}_${X}${K}`}},H);return[X,G]}));return{original:Q,variants:Object.fromEntries(Y.filter(([,X])=>X!==null))}}async function v0($,W,H){let J=await k(W,{quality:H?.quality,acl:H?.acl});return f($,J,{acl:H?.acl,uploadedBy:H?.uploadedBy})}var{s3:p}=globalThis.Bun;async function n($,W){if(!$||typeof $!=="string")throw M.badRequest("Key is required");let H=$.trim();if(!H||H.length===0)throw M.badRequest("Key must be a non-empty string");try{return await p.delete($),{key:$,deleted:!0,error:null}}catch(J){return{key:$,deleted:!1,error:J}}}async function P0($,W){return(await Promise.allSettled($.map((J)=>n(J,W)))).map((J,L)=>{if(J.status==="fulfilled")return J.value;return{key:$[L],deleted:!1,error:J.reason}})}var{s3:s}=globalThis.Bun;function g0($){return $.startsWith(".")?$:`.${$}`}async function m0($,W={debug:!0}){try{return{exists:await s.exists($),error:null}}catch(H){if(W?.debug)console.error("There was an error checking for file existance",H);return{exists:null,error:H}}}export{x as uploadOne,k0 as uploadMany,f as uploadGeneratedVariants,M0 as optimizeImageBuffer,L0 as optimizeImage,g0 as normalizeExtension,O as mimeTypeToResolvedType,U0 as getOptimizedImage,r as getObjectUrl,j0 as getImageMetadata,t as getAspectRatioStringRound,V as getAspectRatioString,k as generateVariants,o as generateTestFile,v0 as generateAndUploadImage,_ as fileTypePredicates,n as deleteOne,P0 as deleteMany,m0 as checkFileExistance};
|
|
3
3
|
|
|
4
|
-
//# debugId=
|
|
4
|
+
//# debugId=7B6C1AE746293B6364756E2164756E21
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"import type { ResolvedFileType, StorageObject } from \"../types\";\r\n\r\nconst isImage = (type: string): boolean => type.startsWith(\"image/\");\r\n\r\nconst isVideo = (type: string): boolean => type.startsWith(\"video/\");\r\n\r\nconst isAudio = (type: string): boolean => type.startsWith(\"audio/\");\r\n\r\nconst isDocument = (type: string): boolean =>\r\n type.startsWith(\"text/\") ||\r\n type.includes(\"pdf\") ||\r\n type.includes(\"word\") ||\r\n type.includes(\"sheet\") ||\r\n type.includes(\"presentation\") ||\r\n type.includes(\"opendocument\") ||\r\n type === \"application/rtf\";\r\n\r\nconst isArchive = (type: string): boolean =>\r\n type.includes(\"zip\") ||\r\n type.includes(\"rar\") ||\r\n type.includes(\"tar\") ||\r\n type.includes(\"7z\") ||\r\n type.includes(\"gzip\");\r\n\r\nconst isCode = (type: string): boolean =>\r\n type === \"application/javascript\" ||\r\n type === \"application/json\" ||\r\n type === \"text/html\" ||\r\n type === \"text/css\" ||\r\n type === \"application/xml\" ||\r\n type.includes(\"javascript\");\r\n\r\nconst isFont = (type: string): boolean =>\r\n type.startsWith(\"font/\") || type.includes(\"font\");\r\n\r\n/**\r\n * Maps MIME types to file categories\r\n * @param mimeType - The MIME type string\r\n * @returns FileType category\r\n */\r\nconst mimeTypeToResolvedType = (mimeType: string): ResolvedFileType => {\r\n if (!mimeType) return \"other\";\r\n\r\n const type = mimeType.toLowerCase();\r\n\r\n if (isImage(type)) return \"image\";\r\n if (isVideo(type)) return \"video\";\r\n if (isAudio(type)) return \"audio\";\r\n if (isDocument(type)) return \"document\";\r\n if (isArchive(type)) return \"archive\";\r\n if (isCode(type)) return \"code\";\r\n if (isFont(type)) return \"font\";\r\n\r\n return \"other\";\r\n};\r\n\r\n// Optional: Export the predicate functions if you need them elsewhere\r\nconst fileTypePredicates = {\r\n isImage,\r\n isVideo,\r\n isAudio,\r\n isDocument,\r\n isArchive,\r\n isCode,\r\n isFont,\r\n};\r\n\r\n/**\r\n * Generates a text.txt file so you can test file uploading is working\r\n */\r\nfunction generateTestFile() {\r\n // Create test content\r\n const textContent = \"Hello, this is a test file for S3 upload!\";\r\n const buffer = Buffer.from(textContent, \"utf-8\");\r\n\r\n // Create a File object (assuming you have File constructor available in Bun)\r\n const testFile = new File([buffer], \"test.txt\", { type: \"text/plain\" });\r\n\r\n return testFile;\r\n}\r\n\r\n/**\r\n * @returns url of the file\r\n */\r\nfunction getObjectUrl(\r\n storageObject: StorageObject,\r\n options?: { bucket?: string }\r\n): string {\r\n // External file\r\n if (storageObject.url) {\r\n return storageObject.url;\r\n }\r\n\r\n // Internal file\r\n if (storageObject.key) {\r\n if (storageObject.isPrivate) {\r\n return `/storage/${storageObject.key}`; // Proxy through server\r\n } else {\r\n return `https://${\r\n options?.bucket ?? process.env.AWS_BUCKET\r\n }.s3.amazonaws.com/${storageObject.key}`; // Direct S3\r\n }\r\n }\r\n\r\n throw new Error(\"Invalid storage object\");\r\n}\r\n\r\nexport {\r\n mimeTypeToResolvedType,\r\n fileTypePredicates,\r\n getObjectUrl,\r\n generateTestFile,\r\n};\r\n",
|
|
6
6
|
"import type { AspectRatioStr } from \"../types\";\r\n\r\n/**\r\n * @description\r\n * Returns standard 16:9, 1:1\r\n * from width and height\r\n */\r\nexport function getAspectRatioString(\r\n width: number,\r\n height: number,\r\n): AspectRatioStr {\r\n if (!width || width < 1 || !height || height < 1) return \"1:1\";\r\n const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\r\n const divisor = gcd(width, height);\r\n return `${width / divisor}:${height / divisor}`;\r\n}\r\n\r\n/**\r\n * @description\r\n * Returns standard 16:9, 1:1\r\n * from width and height but rounding to\r\n * the nearest common ratios with some tolerance\r\n */\r\nexport function getAspectRatioStringRound(\r\n width: number,\r\n height: number,\r\n): AspectRatioStr {\r\n if (!width || !height || width < 1 || height < 1) {\r\n return \"1:1\";\r\n }\r\n\r\n const ratio = width / height;\r\n\r\n // Common aspect ratios for AI image generation\r\n const commonRatios: { ratio: number; label: AspectRatioStr }[] = [\r\n { ratio: 1 / 1, label: \"1:1\" }, // 1.0 - Square\r\n { ratio: 4 / 5, label: \"4:5\" }, // 0.8 - Portrait\r\n { ratio: 3 / 4, label: \"3:4\" }, // 0.75 - Portrait\r\n { ratio: 2 / 3, label: \"2:3\" }, // 0.667 - Portrait\r\n { ratio: 9 / 16, label: \"9:16\" }, // 0.5625 - Vertical video\r\n { ratio: 3 / 2, label: \"3:2\" }, // 1.5 - Classic photo\r\n { ratio: 4 / 3, label: \"4:3\" }, // 1.333 - Standard\r\n { ratio: 16 / 9, label: \"16:9\" }, // 1.778 - Widescreen\r\n { ratio: 21 / 9, label: \"21:9\" }, // 2.333 - Ultrawide\r\n ];\r\n\r\n const TOLERANCE = 0.03; // 3% tolerance for AI variations\r\n\r\n // Find closest common ratio\r\n for (const { ratio: commonRatio, label } of commonRatios) {\r\n const difference = Math.abs(ratio - commonRatio);\r\n const percentDiff = difference / commonRatio;\r\n\r\n if (percentDiff < TOLERANCE) {\r\n return label;\r\n }\r\n }\r\n\r\n // Fallback to exact calculation for unusual ratios\r\n const gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\r\n const divisor = gcd(width, height);\r\n return `${width / divisor}:${height / divisor}`;\r\n}\r\n",
|
|
7
7
|
"export type BRPCErrorCode =\r\n | \"BAD_REQUEST\"\r\n | \"UNAUTHORIZED\"\r\n | \"FORBIDDEN\"\r\n | \"NOT_FOUND\"\r\n | \"METHOD_NOT_SUPPORTED\"\r\n | \"TIMEOUT\"\r\n | \"CONFLICT\"\r\n | \"PRECONDITION_FAILED\"\r\n | \"PAYLOAD_TOO_LARGE\"\r\n | \"UNPROCESSABLE_CONTENT\"\r\n | \"TOO_MANY_REQUESTS\"\r\n | \"CLIENT_CLOSED_REQUEST\"\r\n | \"INTERNAL_SERVER_ERROR\"\r\n | \"NOT_IMPLEMENTED\"\r\n | \"BAD_GATEWAY\"\r\n | \"SERVICE_UNAVAILABLE\"\r\n | \"GATEWAY_TIMEOUT\";\r\n\r\nexport interface BRPCErrorOptions {\r\n code: BRPCErrorCode;\r\n message: string;\r\n clientCode?: string; // Custom code for client-side detection\r\n cause?: Error;\r\n data?: Record<string, any>;\r\n}\r\n\r\nexport class BRPCError extends Error {\r\n public readonly code: BRPCErrorCode;\r\n public readonly clientCode?: string;\r\n public readonly httpStatus: number;\r\n public readonly data?: Record<string, any>;\r\n public readonly cause?: Error;\r\n\r\n private static readonly STATUS_MAP: Record<BRPCErrorCode, number> = {\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_SUPPORTED: 405,\r\n TIMEOUT: 408,\r\n CONFLICT: 409,\r\n PRECONDITION_FAILED: 412,\r\n PAYLOAD_TOO_LARGE: 413,\r\n UNPROCESSABLE_CONTENT: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n CLIENT_CLOSED_REQUEST: 499,\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n };\r\n\r\n constructor(options: BRPCErrorOptions) {\r\n super(options.message);\r\n\r\n this.name = \"BRPCError\";\r\n this.code = options.code;\r\n this.clientCode = options.clientCode;\r\n this.httpStatus = BRPCError.STATUS_MAP[options.code];\r\n this.data = options.data;\r\n this.cause = options.cause;\r\n\r\n // Maintains proper stack trace for where our error was thrown (only available on V8)\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, BRPCError);\r\n }\r\n }\r\n\r\n /**\r\n * Create a serializable object for sending to frontend\r\n */\r\n toJSON() {\r\n return {\r\n name: this.name,\r\n code: this.code,\r\n clientCode: this.clientCode,\r\n message: this.message,\r\n data: this.data,\r\n httpStatus: this.httpStatus,\r\n };\r\n }\r\n\r\n /**\r\n * Static factory methods for common errors\r\n */\r\n static badRequest(\r\n message: string,\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({ code: \"BAD_REQUEST\", message, clientCode, data });\r\n }\r\n\r\n static unauthorized(\r\n message: string = \"Unauthorized\",\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({ code: \"UNAUTHORIZED\", message, clientCode, data });\r\n }\r\n\r\n static forbidden(\r\n message: string = \"Forbidden\",\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({ code: \"FORBIDDEN\", message, clientCode, data });\r\n }\r\n\r\n static notFound(\r\n message: string = \"Not Found\",\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({ code: \"NOT_FOUND\", message, clientCode, data });\r\n }\r\n\r\n static preconditionFailed(\r\n message: string = \"Precondition failed\",\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({ code: \"NOT_FOUND\", message, clientCode, data });\r\n }\r\n\r\n static conflict(\r\n message: string,\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({ code: \"CONFLICT\", message, clientCode, data });\r\n }\r\n\r\n static unprocessableContent(\r\n message: string,\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({\r\n code: \"UNPROCESSABLE_CONTENT\",\r\n message,\r\n clientCode,\r\n data,\r\n });\r\n }\r\n\r\n static tooManyRequests(\r\n message: string = \"Too many requests\",\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({\r\n code: \"TOO_MANY_REQUESTS\",\r\n message,\r\n clientCode,\r\n data,\r\n });\r\n }\r\n\r\n static internalServerError(\r\n message: string = \"Internal Server Error\",\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({\r\n code: \"INTERNAL_SERVER_ERROR\",\r\n message,\r\n clientCode,\r\n data,\r\n });\r\n }\r\n\r\n static timeout(\r\n message: string = \"Request timeout\",\r\n clientCode?: string,\r\n data?: Record<string, any>\r\n ) {\r\n return new BRPCError({ code: \"TIMEOUT\", message, clientCode, data });\r\n }\r\n}\r\n",
|
|
8
|
-
"import type { BunFile } from \"bun\";\r\nimport type { GeneratedImageVariants, UploadableImageBuffer } from \"./types\";\r\nimport { BRPCError } from \"../../errors\";\r\nimport { fileTypePredicates } from \"../utils\";\r\nimport sharp from \"sharp\";\r\nimport type { Acl } from \"../types\";\r\nimport { getAspectRatioString } from \"../utils/aspect-ratio\";\r\nimport { DEFAULT_IMAGE_MAX_SIZE, IMAGE_VARIANTS } from \"./constants\";\r\n\r\nasync function processSharpImage(\r\n buffer: Buffer,\r\n maxSize: number,\r\n quality: number,\r\n name: string,\r\n acl: Acl,\r\n): Promise<UploadableImageBuffer> {\r\n try {\r\n const { data: optimizedBuffer, info } = await sharp(buffer, {\r\n // Prevent decompression bombs / absurd images\r\n limitInputPixels: 10000 * 10000,\r\n })\r\n // Auto-apply EXIF orientation from phones/cameras\r\n .rotate()\r\n .resize({\r\n width: maxSize,\r\n height: maxSize,\r\n fit: \"inside\",\r\n withoutEnlargement: true,\r\n })\r\n .webp({\r\n quality,\r\n })\r\n .toBuffer({ resolveWithObject: true });\r\n\r\n return {\r\n buffer: optimizedBuffer,\r\n object: {\r\n name: name.replace(/\\.[^/.]+$/, \".webp\"),\r\n resolvedType: \"image\",\r\n metadata: {\r\n type: \"image/webp\",\r\n size: optimizedBuffer.length,\r\n extension: \".webp\",\r\n width: info.width,\r\n height: info.height,\r\n aspectRatio: info.width && info.height ? info.width / info.height : 1,\r\n aspectRatioStr:\r\n info.width && info.height\r\n ? getAspectRatioString(info.width, info.height)\r\n : \"1:1\",\r\n acl,\r\n },\r\n },\r\n };\r\n } catch (error) {\r\n throw BRPCError.conflict(\r\n `Failed to optimize image: ${\r\n error instanceof Error ? error.message : \"Unknown error\"\r\n }`,\r\n );\r\n }\r\n}\r\n\r\nasync function normalizeImageInput(\r\n file: File | BunFile | string,\r\n): Promise<{ buffer: Buffer; name: string }> {\r\n if (!file) {\r\n throw BRPCError.conflict(\"A file must be provided\");\r\n }\r\n\r\n let inputBuffer: Buffer;\r\n let originalName = \"unknown.webp\";\r\n\r\n if (typeof file === \"string\") {\r\n console.log(\"I'm going to fail here for file\", file);\r\n if (!file.startsWith(\"data:\")) {\r\n console.log(\"I never got here\");\r\n throw BRPCError.conflict(\"Invalid base64 format\");\r\n }\r\n\r\n const [, data] = file.split(\",\");\r\n\r\n if (!data) {\r\n throw BRPCError.conflict(\"Invalid base64 data\");\r\n }\r\n\r\n inputBuffer = Buffer.from(data, \"base64\");\r\n } else {\r\n if (!fileTypePredicates.isImage(file.type)) {\r\n throw BRPCError.conflict(\"File must be an image\");\r\n }\r\n\r\n const arrayBuffer = await file.arrayBuffer();\r\n\r\n inputBuffer = Buffer.from(arrayBuffer);\r\n originalName = file.name ?? originalName;\r\n }\r\n\r\n return {\r\n buffer: inputBuffer,\r\n name: originalName,\r\n };\r\n}\r\n\r\nexport async function optimizeImage(\r\n file: File | BunFile | string,\r\n {\r\n size,\r\n quality,\r\n acl,\r\n }: {\r\n size?: number;\r\n quality?: number;\r\n acl?: Acl;\r\n } = {},\r\n): Promise<UploadableImageBuffer> {\r\n const normalized = await normalizeImageInput(file);\r\n\r\n return processSharpImage(\r\n normalized.buffer,\r\n size ?? DEFAULT_IMAGE_MAX_SIZE,\r\n quality ?? 80,\r\n normalized.name,\r\n acl ?? \"public-read\",\r\n );\r\n}\r\n\r\nexport async function optimizeImageBuffer(\r\n buffer: Buffer,\r\n {\r\n name = \"unknown.webp\",\r\n size,\r\n quality,\r\n acl,\r\n }: {\r\n name?: string;\r\n size?: number;\r\n quality?: number;\r\n acl?: Acl;\r\n } = {},\r\n): Promise<UploadableImageBuffer> {\r\n if (!buffer?.length) {\r\n throw BRPCError.conflict(\"A buffer must be provided\");\r\n }\r\n\r\n return processSharpImage(\r\n buffer,\r\n size ?? DEFAULT_IMAGE_MAX_SIZE,\r\n quality ?? 80,\r\n name,\r\n acl ?? \"public-read\",\r\n );\r\n}\r\n\r\nexport async function generateVariants(\r\n file: File | BunFile | string,\r\n {\r\n quality = 80,\r\n acl = \"public-read\",\r\n }: {\r\n quality?: number;\r\n acl?: Acl;\r\n } = {},\r\n): Promise<GeneratedImageVariants> {\r\n const normalized = await normalizeImageInput(file);\r\n\r\n const original = await processSharpImage(\r\n normalized.buffer,\r\n DEFAULT_IMAGE_MAX_SIZE,\r\n quality,\r\n normalized.name,\r\n acl,\r\n );\r\n\r\n const variantsEntries = await Promise.all(\r\n Object.entries(IMAGE_VARIANTS).map(async ([variantName, size]) => {\r\n const variant = await processSharpImage(\r\n normalized.buffer,\r\n size,\r\n quality,\r\n normalized.name,\r\n acl,\r\n );\r\n\r\n return [variantName, variant] as const;\r\n }),\r\n );\r\n\r\n return {\r\n original,\r\n variants: Object.fromEntries(variantsEntries),\r\n };\r\n}\r\n\r\n// async function processSharpImage(\r\n// buffer: Buffer,\r\n// maxWidth: number,\r\n// quality: number,\r\n// name: string,\r\n// acl: Acl,\r\n// ): Promise<UploadableImageBuffer> {\r\n// try {\r\n// const { data: optimizedBuffer, info } = await sharp(buffer)\r\n// .resize(maxWidth, null, { withoutEnlargement: true })\r\n// .webp({ quality })\r\n// .toBuffer({ resolveWithObject: true });\r\n\r\n// return {\r\n// buffer: optimizedBuffer,\r\n// object: {\r\n// name: name.replace(/\\.[^/.]+$/, \".webp\"),\r\n// resolvedType: \"image\",\r\n// metadata: {\r\n// type: \"image/webp\",\r\n// size: optimizedBuffer.length,\r\n// extension: \".webp\",\r\n// width: info.width,\r\n// height: info.height,\r\n// aspectRatio: info.height > 0 ? info.width / info.height : 1,\r\n// aspectRatioStr: getAspectRatioString(info.width, info.height),\r\n// acl,\r\n// },\r\n// },\r\n// };\r\n// } catch (error) {\r\n// throw BRPCError.conflict(\r\n// `Failed to optimize image: ${error instanceof Error ? error.message : \"Unknown error\"}`,\r\n// );\r\n// }\r\n// }\r\n\r\n// export async function optimizeImage(\r\n// file: File | BunFile | string,\r\n// { width, quality, acl }: { width?: number; quality?: number; acl?: Acl } = {},\r\n// ): Promise<UploadableImageBuffer> {\r\n// const maxWidth = width ?? 1200;\r\n// const q = quality ?? 75;\r\n\r\n// if (!file) {\r\n// throw BRPCError.conflict(\"A file must be provided\");\r\n// }\r\n\r\n// let inputBuffer: Buffer;\r\n// let originalName = \"unknown.webp\";\r\n\r\n// if (typeof file === \"string\") {\r\n// if (!file.startsWith(\"data:\")) {\r\n// throw BRPCError.conflict(\"Invalid base64 format\");\r\n// }\r\n// const [, data] = file.split(\",\");\r\n// if (!data) {\r\n// throw BRPCError.conflict(\"Invalid base64 data\");\r\n// }\r\n// inputBuffer = Buffer.from(data, \"base64\");\r\n// } else {\r\n// if (!fileTypePredicates.isImage(file.type)) {\r\n// throw BRPCError.conflict(\"File must be an image\");\r\n// }\r\n// const arrayBuffer = await file.arrayBuffer();\r\n// inputBuffer = Buffer.from(arrayBuffer);\r\n// originalName = file.name ?? originalName;\r\n// }\r\n\r\n// return processSharpImage(\r\n// inputBuffer,\r\n// maxWidth,\r\n// q,\r\n// originalName,\r\n// acl ?? \"public-read\",\r\n// );\r\n// }\r\n\r\n// export async function optimizeImageBuffer(\r\n// buffer: Buffer,\r\n// {\r\n// name = \"unknown.webp\",\r\n// width,\r\n// quality,\r\n// acl,\r\n// }: { name?: string; width?: number; quality?: number; acl?: Acl } = {},\r\n// ): Promise<UploadableImageBuffer> {\r\n// if (!buffer?.length) {\r\n// throw BRPCError.conflict(\"A buffer must be provided\");\r\n// }\r\n\r\n// return processSharpImage(\r\n// buffer,\r\n// width ?? 1200,\r\n// quality ?? 75,\r\n// name,\r\n// acl ?? \"public-read\",\r\n// );\r\n// }\r\n",
|
|
8
|
+
"import type { BunFile } from \"bun\";\r\nimport type { GeneratedImageVariants, UploadableImageBuffer } from \"./types\";\r\nimport { BRPCError } from \"../../errors\";\r\nimport { fileTypePredicates } from \"../utils\";\r\nimport sharp from \"sharp\";\r\nimport type { Acl } from \"../types\";\r\nimport { getAspectRatioString } from \"../utils/aspect-ratio\";\r\nimport { DEFAULT_IMAGE_MAX_SIZE, IMAGE_VARIANTS } from \"./constants\";\r\n\r\nasync function processSharpImage(\r\n buffer: Buffer,\r\n maxSize: number,\r\n quality: number,\r\n name: string,\r\n acl: Acl,\r\n): Promise<UploadableImageBuffer> {\r\n try {\r\n const { data: optimizedBuffer, info } = await sharp(buffer, {\r\n // Prevent decompression bombs / absurd images\r\n limitInputPixels: 10000 * 10000,\r\n })\r\n // Auto-apply EXIF orientation from phones/cameras\r\n .rotate()\r\n .resize({\r\n width: maxSize,\r\n height: maxSize,\r\n fit: \"inside\",\r\n withoutEnlargement: true,\r\n })\r\n .webp({\r\n quality,\r\n })\r\n .toBuffer({ resolveWithObject: true });\r\n\r\n return {\r\n buffer: optimizedBuffer,\r\n object: {\r\n name: name.replace(/\\.[^/.]+$/, \".webp\"),\r\n resolvedType: \"image\",\r\n metadata: {\r\n type: \"image/webp\",\r\n size: optimizedBuffer.length,\r\n extension: \".webp\",\r\n width: info.width,\r\n height: info.height,\r\n aspectRatio: info.width && info.height ? info.width / info.height : 1,\r\n aspectRatioStr:\r\n info.width && info.height\r\n ? getAspectRatioString(info.width, info.height)\r\n : \"1:1\",\r\n acl,\r\n },\r\n },\r\n };\r\n } catch (error) {\r\n throw BRPCError.conflict(\r\n `Failed to optimize image: ${\r\n error instanceof Error ? error.message : \"Unknown error\"\r\n }`,\r\n );\r\n }\r\n}\r\n\r\nasync function normalizeImageInput(\r\n file: File | BunFile | string,\r\n): Promise<{ buffer: Buffer; name: string }> {\r\n if (!file) {\r\n throw BRPCError.conflict(\"A file must be provided\");\r\n }\r\n\r\n let inputBuffer: Buffer;\r\n let originalName = \"unknown.webp\";\r\n\r\n if (typeof file === \"string\") {\r\n console.log(\"I'm going to fail here for file\", file);\r\n if (!file.startsWith(\"data:\")) {\r\n console.log(\"I never got here\");\r\n throw BRPCError.conflict(\"Invalid base64 format\");\r\n }\r\n\r\n const [, data] = file.split(\",\");\r\n\r\n if (!data) {\r\n throw BRPCError.conflict(\"Invalid base64 data\");\r\n }\r\n\r\n inputBuffer = Buffer.from(data, \"base64\");\r\n } else {\r\n if (!fileTypePredicates.isImage(file.type)) {\r\n throw BRPCError.conflict(\"File must be an image\");\r\n }\r\n\r\n const arrayBuffer = await file.arrayBuffer();\r\n\r\n inputBuffer = Buffer.from(arrayBuffer);\r\n originalName = file.name ?? originalName;\r\n }\r\n\r\n return {\r\n buffer: inputBuffer,\r\n name: originalName,\r\n };\r\n}\r\n\r\nexport async function optimizeImage(\r\n file: File | BunFile | string,\r\n {\r\n size,\r\n quality,\r\n acl,\r\n }: {\r\n size?: number;\r\n quality?: number;\r\n acl?: Acl;\r\n } = {},\r\n): Promise<UploadableImageBuffer> {\r\n const normalized = await normalizeImageInput(file);\r\n\r\n return processSharpImage(\r\n normalized.buffer,\r\n size ?? DEFAULT_IMAGE_MAX_SIZE,\r\n quality ?? 80,\r\n normalized.name,\r\n acl ?? \"public-read\",\r\n );\r\n}\r\n\r\nexport async function optimizeImageBuffer(\r\n buffer: Buffer,\r\n {\r\n name = \"unknown.webp\",\r\n size,\r\n quality,\r\n acl,\r\n }: {\r\n name?: string;\r\n size?: number;\r\n quality?: number;\r\n acl?: Acl;\r\n } = {},\r\n): Promise<UploadableImageBuffer> {\r\n if (!buffer?.length) {\r\n throw BRPCError.conflict(\"A buffer must be provided\");\r\n }\r\n\r\n return processSharpImage(\r\n buffer,\r\n size ?? DEFAULT_IMAGE_MAX_SIZE,\r\n quality ?? 80,\r\n name,\r\n acl ?? \"public-read\",\r\n );\r\n}\r\n\r\nexport async function generateVariants(\r\n file: File | BunFile | string,\r\n {\r\n quality = 80,\r\n acl = \"public-read\",\r\n }: {\r\n quality?: number;\r\n acl?: Acl;\r\n } = {},\r\n): Promise<GeneratedImageVariants> {\r\n console.log(\"Going to normalizeImageInput\");\r\n const normalized = await normalizeImageInput(file);\r\n\r\n console.log(\"Going to processSharpImage for original\");\r\n const original = await processSharpImage(\r\n normalized.buffer,\r\n DEFAULT_IMAGE_MAX_SIZE,\r\n quality,\r\n normalized.name,\r\n acl,\r\n );\r\n\r\n console.log(\"Going to processSharpImage for variantsEntries\");\r\n const variantsEntries = await Promise.all(\r\n Object.entries(IMAGE_VARIANTS).map(async ([variantName, size]) => {\r\n const variant = await processSharpImage(\r\n normalized.buffer,\r\n size,\r\n quality,\r\n normalized.name,\r\n acl,\r\n );\r\n\r\n return [variantName, variant] as const;\r\n }),\r\n );\r\n\r\n return {\r\n original,\r\n variants: Object.fromEntries(variantsEntries),\r\n };\r\n}\r\n\r\n// async function processSharpImage(\r\n// buffer: Buffer,\r\n// maxWidth: number,\r\n// quality: number,\r\n// name: string,\r\n// acl: Acl,\r\n// ): Promise<UploadableImageBuffer> {\r\n// try {\r\n// const { data: optimizedBuffer, info } = await sharp(buffer)\r\n// .resize(maxWidth, null, { withoutEnlargement: true })\r\n// .webp({ quality })\r\n// .toBuffer({ resolveWithObject: true });\r\n\r\n// return {\r\n// buffer: optimizedBuffer,\r\n// object: {\r\n// name: name.replace(/\\.[^/.]+$/, \".webp\"),\r\n// resolvedType: \"image\",\r\n// metadata: {\r\n// type: \"image/webp\",\r\n// size: optimizedBuffer.length,\r\n// extension: \".webp\",\r\n// width: info.width,\r\n// height: info.height,\r\n// aspectRatio: info.height > 0 ? info.width / info.height : 1,\r\n// aspectRatioStr: getAspectRatioString(info.width, info.height),\r\n// acl,\r\n// },\r\n// },\r\n// };\r\n// } catch (error) {\r\n// throw BRPCError.conflict(\r\n// `Failed to optimize image: ${error instanceof Error ? error.message : \"Unknown error\"}`,\r\n// );\r\n// }\r\n// }\r\n\r\n// export async function optimizeImage(\r\n// file: File | BunFile | string,\r\n// { width, quality, acl }: { width?: number; quality?: number; acl?: Acl } = {},\r\n// ): Promise<UploadableImageBuffer> {\r\n// const maxWidth = width ?? 1200;\r\n// const q = quality ?? 75;\r\n\r\n// if (!file) {\r\n// throw BRPCError.conflict(\"A file must be provided\");\r\n// }\r\n\r\n// let inputBuffer: Buffer;\r\n// let originalName = \"unknown.webp\";\r\n\r\n// if (typeof file === \"string\") {\r\n// if (!file.startsWith(\"data:\")) {\r\n// throw BRPCError.conflict(\"Invalid base64 format\");\r\n// }\r\n// const [, data] = file.split(\",\");\r\n// if (!data) {\r\n// throw BRPCError.conflict(\"Invalid base64 data\");\r\n// }\r\n// inputBuffer = Buffer.from(data, \"base64\");\r\n// } else {\r\n// if (!fileTypePredicates.isImage(file.type)) {\r\n// throw BRPCError.conflict(\"File must be an image\");\r\n// }\r\n// const arrayBuffer = await file.arrayBuffer();\r\n// inputBuffer = Buffer.from(arrayBuffer);\r\n// originalName = file.name ?? originalName;\r\n// }\r\n\r\n// return processSharpImage(\r\n// inputBuffer,\r\n// maxWidth,\r\n// q,\r\n// originalName,\r\n// acl ?? \"public-read\",\r\n// );\r\n// }\r\n\r\n// export async function optimizeImageBuffer(\r\n// buffer: Buffer,\r\n// {\r\n// name = \"unknown.webp\",\r\n// width,\r\n// quality,\r\n// acl,\r\n// }: { name?: string; width?: number; quality?: number; acl?: Acl } = {},\r\n// ): Promise<UploadableImageBuffer> {\r\n// if (!buffer?.length) {\r\n// throw BRPCError.conflict(\"A buffer must be provided\");\r\n// }\r\n\r\n// return processSharpImage(\r\n// buffer,\r\n// width ?? 1200,\r\n// quality ?? 75,\r\n// name,\r\n// acl ?? \"public-read\",\r\n// );\r\n// }\r\n",
|
|
9
9
|
"export const IMAGE_VARIANTS = {\r\n xs: 200,\r\n sm: 400,\r\n md: 800,\r\n lg: 1200,\r\n} as const;\r\n\r\nexport const DEFAULT_IMAGE_MAX_SIZE = 1920;\r\n",
|
|
10
10
|
"import sharp from \"sharp\";\r\nimport { local } from \"../local\";\r\nimport { fileTypePredicates } from \"../utils\";\r\nimport type { GetOptimizedImageOptions } from \"./types\";\r\n\r\n/**\r\n * Returns an existing optimized image from cache or\r\n * creates one on the fly\r\n * @example\r\n * ```ts\r\n * const optimizedImage = await getImage({\r\n * key: \"originalFileKey\",\r\n * width: 800\r\n * })\r\n * if (!optimizedImage) throw BRPCError.notFound()\r\n * return optimizedImage\r\n * ```\r\n */\r\nexport async function getOptimizedImage(options: GetOptimizedImageOptions) {\r\n // const url = new URL(req.url);\r\n // const imagePath = url.searchParams.get(\"src\");\r\n // const width = parseInt(url.searchParams.get(\"w\") || \"800\");\r\n // const quality = parseInt(url.searchParams.get(\"q\") || \"75\");\r\n\r\n const localCache = `./cache/images/${options.key}_${options.width}_${options.quality}.webp`;\r\n\r\n // 1. Check local cache\r\n const localFile = await local.getOne(localCache);\r\n\r\n if (localFile) {\r\n if (!fileTypePredicates.isImage(localFile.type)) {\r\n return null;\r\n }\r\n return localFile;\r\n }\r\n\r\n // 2. Check Spaces cache - using Bun's global s3 instance\r\n // const cachedFile = s3.file(`appS3Folder/cache/${cacheKey}`);\r\n // if (await cachedFile.exists()) {\r\n // const cached = await cachedFile.arrayBuffer();\r\n // await Bun.write(localCache, cached);\r\n // return new Response(cached, {\r\n // headers: { 'Content-Type': 'image/webp' }\r\n // });\r\n // }\r\n\r\n // 3. Fetch from Spaces, optimize, cache\r\n // const originalFile = s3.file(`originals/${imagePath}`);\r\n // const originalBuffer = await originalFile.arrayBuffer();\r\n\r\n // 3.2 Fetch from local\r\n // const originalPath = `./buckets/cache/images/originals/${options.path}`;\r\n const originalKey = options.key;\r\n const originalFile = await local.getOne(originalKey);\r\n\r\n if (!originalFile) return null;\r\n\r\n if (!fileTypePredicates.isImage(originalFile.type)) {\r\n return null;\r\n }\r\n\r\n const buffer = await originalFile.arrayBuffer();\r\n\r\n const optimizedBuffer = await sharp(buffer)\r\n .resize(options.width, null, { withoutEnlargement: true })\r\n .webp({ quality: options.quality ?? 75 })\r\n .toBuffer();\r\n\r\n // Cache everywhere\r\n // await Promise.all([\r\n // Bun.write(localCache, optimizedBuffer),\r\n // cachedFile.write(optimizedBuffer, { type: 'image/webp' })\r\n // ]);\r\n\r\n // Cache to local\r\n await Bun.write(localCache, optimizedBuffer);\r\n\r\n const cachedFile = Bun.file(localCache);\r\n\r\n const exists = await cachedFile.exists();\r\n\r\n if (!exists) return null;\r\n\r\n return cachedFile;\r\n}\r\n",
|
|
11
11
|
"import { randomUUID } from \"crypto\";\r\nimport { extname } from \"path\";\r\nimport type { SafeResult } from \"../../types\";\r\n\r\ntype UploadSuccess = {\r\n key: string;\r\n file: File;\r\n bytesWritten: number;\r\n};\r\n\r\n/**\r\n * Uploads a file to local filesystem\r\n * @param path - The folder path (e.g. \"public/images\")\r\n * @param file - The file to upload\r\n * @param filename - Optional custom filename to use instead of original file.name\r\n * @returns Promise<SafeResult<number>> - Success: {data: bytesWritten, error: null}\r\n * Failure: {data: null, error: Error}\r\n *\r\n * Example:\r\n * ```ts\r\n * const {data, error} = await uploadToLocal(\"public/avatars\", userPhoto);\r\n * if (error) {\r\n * console.error(\"Upload failed:\", error);\r\n * return;\r\n * }\r\n * console.log(`Uploaded ${data} bytes`);\r\n * ```\r\n */\r\nasync function uploadOne(\r\n path: string,\r\n file: File,\r\n _filename?: string\r\n): Promise<SafeResult<UploadSuccess>> {\r\n if (!file)\r\n return {\r\n data: null,\r\n error: new Error(`File not found`),\r\n };\r\n\r\n const cleanPath = path.replace(/^\\/+|\\/+$/g, \"\");\r\n const ext = extname(file.name);\r\n const uniqueName = `${randomUUID()}${ext}`;\r\n const filePath = `${cleanPath}/${uniqueName}`;\r\n const fullPath = `./buckets/${cleanPath}/${uniqueName}`;\r\n\r\n try {\r\n const writtenBytes = await Bun.write(fullPath, file);\r\n return {\r\n data: {\r\n key: filePath,\r\n file: file,\r\n bytesWritten: writtenBytes,\r\n },\r\n error: null,\r\n };\r\n } catch (err) {\r\n return {\r\n data: null,\r\n error: new Error(`Failed to upload ${file.name} to local filesystem`),\r\n };\r\n }\r\n}\r\n\r\nasync function uploadMany(\r\n path: string,\r\n files: File[],\r\n nameGetter?: (file: File) => string\r\n): Promise<SafeResult<UploadSuccess>[]> {\r\n if (!files || files.length === 0) {\r\n return [];\r\n }\r\n\r\n const uploadPromises = files.map((file) => {\r\n const filename = nameGetter?.(file) ?? file.name;\r\n return uploadOne(path, file, filename);\r\n });\r\n\r\n const results = await Promise.all(uploadPromises);\r\n\r\n return results;\r\n}\r\n\r\nasync function getOne(key: string) {\r\n const file = Bun.file(`./buckets/${key}`);\r\n const exists = await file.exists();\r\n\r\n if (!exists) return null;\r\n\r\n return file;\r\n}\r\n\r\nasync function deleteOne(key: string) {\r\n const file = Bun.file(`./buckets/${key}`);\r\n const exists = await file.exists();\r\n\r\n if (!exists) return false;\r\n\r\n await file.delete();\r\n\r\n return true;\r\n}\r\n\r\nexport const local = {\r\n uploadOne,\r\n uploadMany,\r\n getOne,\r\n deleteOne,\r\n};\r\n",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"import { BRPCError } from \"../../errors\";\r\nimport { s3 as s3Bun } from \"bun\";\r\nimport type { DeleteOneResult } from \"./types\";\r\n\r\nexport async function deleteOne(\r\n key: string,\r\n opts?: { debug?: boolean }\r\n): Promise<DeleteOneResult> {\r\n if (!key || typeof key !== \"string\") {\r\n throw BRPCError.badRequest(\"Key is required\");\r\n }\r\n\r\n const sanitizedKey = key.trim();\r\n if (!sanitizedKey || sanitizedKey.length === 0) {\r\n throw BRPCError.badRequest(\"Key must be a non-empty string\");\r\n }\r\n\r\n try {\r\n await s3Bun.delete(key);\r\n return {\r\n key: key,\r\n deleted: true,\r\n error: null,\r\n };\r\n } catch (e) {\r\n return {\r\n key: key,\r\n deleted: false,\r\n error: e as Error,\r\n };\r\n // if (opts?.debug) {\r\n // console.error(`Error deleting file with key \"${key}\"`, e);\r\n // }\r\n //? Handle this at app level\r\n // throw BRPCError.conflict(\r\n // \"There was an error when trying to delete the file\",\r\n // \"FILE_NOT_DELETED\"\r\n // );\r\n }\r\n}\r\n\r\n/**\r\n * Deletes multiple S3 keys in parallel.\r\n * Returns per-key result so caller can handle failures/rollback.\r\n */\r\nexport async function deleteMany(\r\n keys: string[],\r\n opts?: { debug?: boolean }\r\n): Promise<DeleteOneResult[]> {\r\n const results = await Promise.allSettled(\r\n keys.map((key) => deleteOne(key, opts))\r\n );\r\n\r\n return results.map((res, i) => {\r\n if (res.status === \"fulfilled\") return res.value;\r\n return { key: keys[i], deleted: false, error: res.reason as Error };\r\n });\r\n}\r\n",
|
|
16
16
|
"import { s3 as s3Bun } from \"bun\";\r\n\r\nexport function normalizeExtension(ext: string) {\r\n return ext.startsWith(\".\") ? ext : `.${ext}`;\r\n}\r\n\r\n/**\r\n * Checks a file existance in S3\r\n */\r\nexport async function checkFileExistance(\r\n key: string,\r\n opts: { debug?: boolean } = { debug: process.env.NODE_ENV !== \"production\" },\r\n): Promise<{ exists: boolean; error: null } | { exists: null; error: Error }> {\r\n try {\r\n const exists = await s3Bun.exists(key);\r\n return { exists, error: null };\r\n } catch (e) {\r\n if (opts?.debug) {\r\n console.error(\"There was an error checking for file existance\", e);\r\n }\r\n return { exists: null, error: e as Error };\r\n }\r\n}\r\n"
|
|
17
17
|
],
|
|
18
|
-
"mappings": "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",
|
|
19
|
-
"debugId": "
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "7B6C1AE746293B6364756E2164756E21",
|
|
20
20
|
"names": []
|
|
21
21
|
}
|