Edit: /tmp/tsx-0/17887-51a049796fc1cad01abd2a520bcb6fd002d6bacd (11228B)
{"code":"__filename=\"/opt/canhelp/node_modules/better-auth/dist/api/rate-limiter/index.mjs\";(()=>{\nvar __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,\"name\",{value,configurable:true});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:true})};var __copyProps=(to,from,except,desc)=>{if(from&&typeof from===\"object\"||typeof from===\"function\"){for(let key of __getOwnPropNames(from))if(!__hasOwnProp.call(to,key)&&key!==except)__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable})}return to};var __toCommonJS=mod=>__copyProps(__defProp({},\"__esModule\",{value:true}),mod);var rate_limiter_exports={};__export(rate_limiter_exports,{onRequestRateLimit:()=>onRequestRateLimit,onResponseRateLimit:()=>onResponseRateLimit});module.exports=__toCommonJS(rate_limiter_exports);var import_wildcard=require(\"../../utils/wildcard.mjs\");var import_get_request_ip=require(\"../../utils/get-request-ip.mjs\");var import_json=require(\"@better-auth/core/utils/json\");var import_url=require(\"@better-auth/core/utils/url\");var import_ip=require(\"@better-auth/core/utils/ip\");const memory=new Map;function shouldRateLimit(max,window,rateLimitData){const now=Date.now();const windowInMs=window*1e3;return now-rateLimitData.lastRequest
=max}__name(shouldRateLimit,\"shouldRateLimit\");function rateLimitResponse(retryAfter){return new Response(JSON.stringify({message:\"Too many requests. Please try again later.\"}),{status:429,statusText:\"Too Many Requests\",headers:{\"X-Retry-After\":retryAfter.toString()}})}__name(rateLimitResponse,\"rateLimitResponse\");function getRetryAfter(lastRequest,window){const now=Date.now();const windowInMs=window*1e3;return Math.ceil((lastRequest+windowInMs-now)/1e3)}__name(getRetryAfter,\"getRetryAfter\");function createDatabaseStorageWrapper(ctx){const model=\"rateLimit\";const db=ctx.adapter;return{get:__name(async key=>{const data=(await db.findMany({model,where:[{field:\"key\",value:key}]}))[0];if(typeof data?.lastRequest===\"bigint\")data.lastRequest=Number(data.lastRequest);return data},\"get\"),set:__name(async(key,value,_update)=>{try{if(_update)await db.updateMany({model,where:[{field:\"key\",value:key}],update:{count:value.count,lastRequest:value.lastRequest}});else await db.create({model,data:{key,count:value.count,lastRequest:value.lastRequest}})}catch(e){ctx.logger.error(\"Error setting rate limit\",e)}},\"set\")}}__name(createDatabaseStorageWrapper,\"createDatabaseStorageWrapper\");function getRateLimitStorage(ctx,rateLimitSettings){if(ctx.options.rateLimit?.customStorage)return ctx.options.rateLimit.customStorage;const storage=ctx.rateLimit.storage;if(storage===\"secondary-storage\")return{get:__name(async key=>{const data=await ctx.options.secondaryStorage?.get(key);return data?(0,import_json.safeJSONParse)(data):null},\"get\"),set:__name(async(key,value,_update)=>{const ttl=rateLimitSettings?.window??ctx.options.rateLimit?.window??10;await ctx.options.secondaryStorage?.set?.(key,JSON.stringify(value),ttl)},\"set\")};else if(storage===\"memory\")return{async get(key){const entry=memory.get(key);if(!entry)return null;if(Date.now()>=entry.expiresAt){memory.delete(key);return null}return entry.data},async set(key,value,_update){const ttl=rateLimitSettings?.window??ctx.options.rateLimit?.window??10;const expiresAt=Date.now()+ttl*1e3;memory.set(key,{data:value,expiresAt})}};return createDatabaseStorageWrapper(ctx)}__name(getRateLimitStorage,\"getRateLimitStorage\");let ipWarningLogged=false;async function resolveRateLimitConfig(req,ctx){const basePath=new URL(ctx.baseURL).pathname;const path=(0,import_url.normalizePathname)(req.url,basePath);let currentWindow=ctx.rateLimit.window;let currentMax=ctx.rateLimit.max;const ip=(0,import_get_request_ip.getIp)(req,ctx.options);if(!ip){if(!ipWarningLogged){ctx.logger.warn(\"Rate limiting skipped: could not determine client IP address. If you're behind a reverse proxy, make sure to configure `trustedProxies` in your auth config.\");ipWarningLogged=true}return null}const key=(0,import_ip.createRateLimitKey)(ip,path);const specialRule=getDefaultSpecialRules().find(rule=>rule.pathMatcher(path));if(specialRule){currentWindow=specialRule.window;currentMax=specialRule.max}for(const plugin of ctx.options.plugins||[])if(plugin.rateLimit){const matchedRule=plugin.rateLimit.find(rule=>rule.pathMatcher(path));if(matchedRule){currentWindow=matchedRule.window;currentMax=matchedRule.max;break}}if(ctx.rateLimit.customRules){const _path=Object.keys(ctx.rateLimit.customRules).find(p=>{if(p.includes(\"*\"))return(0,import_wildcard.wildcardMatch)(p)(path);return p===path});if(_path){const customRule=ctx.rateLimit.customRules[_path];const resolved=typeof customRule===\"function\"?await customRule(req,{window:currentWindow,max:currentMax}):customRule;if(resolved){currentWindow=resolved.window;currentMax=resolved.max}if(resolved===false)return null}}return{key,currentWindow,currentMax}}__name(resolveRateLimitConfig,\"resolveRateLimitConfig\");async function onRequestRateLimit(req,ctx){if(!ctx.rateLimit.enabled)return;const config=await resolveRateLimitConfig(req,ctx);if(!config)return;const{key,currentWindow,currentMax}=config;const data=await getRateLimitStorage(ctx,{window:currentWindow}).get(key);if(data&&shouldRateLimit(currentMax,currentWindow,data))return rateLimitResponse(getRetryAfter(data.lastRequest,currentWindow))}__name(onRequestRateLimit,\"onRequestRateLimit\");async function onResponseRateLimit(req,ctx){if(!ctx.rateLimit.enabled)return;const config=await resolveRateLimitConfig(req,ctx);if(!config)return;const{key,currentWindow}=config;const storage=getRateLimitStorage(ctx,{window:currentWindow});const data=await storage.get(key);const now=Date.now();if(!data)await storage.set(key,{key,count:1,lastRequest:now});else if(now-data.lastRequest>currentWindow*1e3)await storage.set(key,{...data,count:1,lastRequest:now},true);else await storage.set(key,{...data,count:data.count+1,lastRequest:now},true)}__name(onResponseRateLimit,\"onResponseRateLimit\");function getDefaultSpecialRules(){return[{pathMatcher(path){return path.startsWith(\"/sign-in\")||path.startsWith(\"/sign-up\")||path.startsWith(\"/change-password\")||path.startsWith(\"/change-email\")},window:10,max:3},{pathMatcher(path){return path===\"/request-password-reset\"||path===\"/send-verification-email\"||path.startsWith(\"/forget-password\")||path===\"/email-otp/send-verification-otp\"||path===\"/email-otp/request-password-reset\"},window:60,max:3}]}__name(getDefaultSpecialRules,\"getDefaultSpecialRules\");0&&(module.exports={onRequestRateLimit,onResponseRateLimit});\n})()\n","warnings":[],"map":{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["/opt/canhelp/node_modules/better-auth/dist/api/rate-limiter/index.mjs"],"sourcesContent":[null]}}