From 8b35de699b2ab4c9870af3a4f859e0a7871e16a9 Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Tue, 23 Apr 2024 14:55:54 +0700 Subject: [PATCH 01/19] - add update all dependencies ( using pnpm ) - update dependencies --- .gitignore | 6 ++++++ bun.lockb | Bin 110548 -> 111441 bytes package.json | 15 ++++++++------- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index da51c6b..1f30be5 100644 --- a/.gitignore +++ b/.gitignore @@ -175,3 +175,9 @@ dist .svelte-kit # End of https://www.toptal.com/developers/gitignore/api/node,macos + +#lock file +package-lock.json +pnpm-lock.yaml +yaml.lock +bun.lockb \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index eb4715dac8d50fbba3f5e1fe7b23e0d4968c3b89..ed0b1e695108ea540cdc6f80439fc627b9ca3fe8 100755 GIT binary patch delta 23779 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 delta 23056 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
uoDP~rw`sHa>$*LL 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⁣`o=U3(o^EyZ`HHpzt`Vzqb(512H!*EEczBwu}kKA`!uw zmO@1!qNcovW%<%C>@$Xy*MLP*E~%PW2{nT-obvvU7x`ynJlx+c6D69{*4W2N2#16+ zf`jtLkXqr3pVS-MttTYq8JKJ(%q3mQyGHtTzSHe-Y~u)dG;BOutb_sK&{bw7+$5dn zt%Ns0ELwflN?6?n{Et>bzm}kHt%T>`nUPS~5^k7V3*POZSbh&oevRutE$X?iMuw=^ zmtI`qVJ+Ng2}hOJqu5S4y|kj|=KFuT5d$5quz4u2df9TN=a$cA?VKtb=i{pyWGy}% z%)ee&@V3lPdGKf73~ON=`Z_3YeQ97_v2xYbi_et4xGh=>J4w6pK9>f0QB7VybEd`P zgAEAjsl54RlvmTI<2>vi$=cCUVJ&>1zREjeHoY1(t>;n~+F@y>1mO?`%WRRj>EYwH z9?c7`CHIBjzgi2?!LUquQO%_%x!3O7ciACJASc~zgnUQ@D6h6DSa-s*(s)kDpAyPT za5R?L<*S!RDN~O-NQ#Z{C27yGkv8j|+xon6N$W~?Ju!WJ{+b-Z+%RS@bPmDxdeKHW zszYDp9X}>33ePo|^l*(lE)omL&^&_KXs{J5w-m}lnD1ZbU+rWqIEO;Xr}Gy|YDOYs z<otI~-t41l`P0ZX?PiVrb2vGt)CODO5b0Fj1@t7bL=&35;fgGY3Ath`ynsZ2^7bI3 zxZIf!7dyO>B@mbxObDG<tS`@QQ?cRf4{{4`hHq>I-9Ni62Sy2yV!6V9$^+OX`zQwa zQ+bSA>;G-G{)l-mYr&J&X4O$X)u>h$@?SdrW&7FYAf(Z<mY4TGtRE>CY!$u2zzC#} zvMc=k-uBP6a&iett*dN~O6ZlYiWhQf2<kQ%RcVxVQinB8Qtt1pQ8{eXlzo>l)$;9K z@$S8oaFbH-Kg|`wBaz?87kPkx2!Jx`UnxvXZwuv0pk-b-)Rx&hC@*_5tMfMD#q2xd z|4dLxjd(*r4_YA(%B!RzN4H*f@K~goDBO~6TQ4lg&_8CLCIJicPyT=2QxtclwJExH zw1HqAg&~yJZ>?ThJ-})I>>p)&u-28xOR8;ztSC&2QYqhq{t|iR9)>RBJwv$(e0qyl zVh71_bh}VqNp<_7XKI~q-f@`Y=iP#i9{Fy<PLfbwV&#+grgq71v*`%p?;Svg+Qn|d zgLb%~{OxTRA6szbZ6x@%hlKJ1tC$IChi;bc-X`i0B^(+H`H)brZ7l3*&!QcaS6Nkm z9Pb#mdiJk!cxVQi2o4=szIs_xp{N5QFP#%?g$o^!kWZTm&#F|aLp=rOj<{*I_Y{T` zUEw7h>WEI`yoEl!aIAdZk#$zT^%it`X6vuKzbf?g(b6x>{Rd-AI_F_GQQl}}+|#%F z`D$BEiFS)ECIWt0XZLr<m;mXVBbgVi_Vf{IMPs8>UZj-Xa@FOr4Ob{<JUB-0UaEz7 zrx~C4=61=U;TQy;7U@{=)<@`rz7EP;n|hXwe)`Jlc{51hV*mx%##fjR3ALNA@OvlF zU|->6G)`v9o3oP6nv@%vjd+h9^6_7JC)P2`;Gg?PFF1=9I7FY59+(K8(BYuGRjbU) zXnpOkPP~GIe7Lpu69&*IDSpD3PAod$Z*}1Sh=)E{(2nrw)wu29M`G1<g22Z&vRJm% zL3t<FVE_IbntA@P2omxMv74{ZyfgXYFLdmT)QI*MCV&r6-rhClhLicZB(KrvL3daj znWXo3sq)_pUp&#e`i2H*!Lf|&cora>BOP^WEbao=l=pYdE#4LPe*9N)q6+aijZAIP z1%dmU!@7^RxC1CJ7QEPV%Y_a<t@=)lPv-cnh!4GHErk{6t8Ug(xPVdAUaf>DU07RP zNGs{pO3GWmmcOvtdgA6%+Ev7ll6cGn2|8_$32%DO&#OC~Ipt}(+)7A`fyLsR!60E0 zmNxT%b44;F<f-o%EUbovT9#BR{N@nhIrUUt6*g(7;VX}pUG~eq;y`pPL~xD8qS&bu z(qmzFl$o%OXoZ<@jp&eYp=MWTP~P>Wy!J`74jVh3c8SZ&MhNc8936g*kevAaYDaZs z_b;bI3>hVhWp{<bldXkKMBld-Zjxf<<zMg2T=&|9uYRFs<J(9&q>rG=$EQ!2AnL|L zgrXjBe|$BeUpE|sbwX}8*2y6zQd&%tqUQGBf3P-v@StguY`)X&k1YYWqDY~AcNldq zQW)2rr8pdkl4fgG^1{+Xm1l0FC*8!b48MvJK6J-Wx1$8xIP}0K5)I1w33+iidEaj* zEQ`Zx_)i7YAN!<AdE3}DlO{!-*6!LU8-;Voi}r#8yl_z7H&$}<;4_yjPkTtnYYw4~ z>47cu(@|C;QQlD~?}05;c@<gBEf+4dGG0O38Rml)pZws(_EQfQgqV01qdcBT36-B& z{9m4PD6cUqENNJMtk0ow;@H?+0zUaLLvZfNhJ4zhH9c8?Vo|^+9^_!J`IJY0JP=_j zA)*&1OTGcr`}7luHo`mz2CVBWebU+He=6+6qJ1C5ITJs@DsNod_1Oal`)7OU!yV;2 zCR&c~e{1K2-bgN4N8YC&fqnWx*WW#5q8r(N@sLS_%~O7sH00A^|McUtPd^I#$EgxS zAkUG*KT6V5F5yFO+{WdI#r!vB{{M&gvJVcCpB9q`AM)u**&Qo>5tDx)-s4gB`&O3n zlEA(a`pE_M>G9+_QD2D_R`;ddD^|GN7rUDLq^<f+`m!8X^FBhqer!Q2`exG{_m9&v zcl~}MCU%24czPmyKYL=Td2)vv_Ta6+uOHfbR!X}FhXH-0{vkWcJo>YN%!r;AKibNo zgo$IAv(P+|RV({_0PCd|W+pLPBP5q#k%xx#B4#2iOJ?(#pU~96mKxy*Q}(%mwPzaf z;bEESAU3{LZL!?UtC>i>{DhcX)<77yjs=uWDQ3T@B{lokF@LM<(dmXPNluX$UaV(s zWk0NAn>5wKrS{<?l7-U#%%N=O7Us`{HTld{s2ISk1&?h^XN0Gvg3k=*B6QxyY6?rX zv0A8VDQw=x_8HTrB*YfM^e)?24Pnl9W+}|eLw8a3{B~BI`IcSV&YChKJdzfw?O<~> zxQ{6Qic<Nzn6dEr4(6;8@8?3q1gH~R>h5Ib%vWeO1MdAP+IuH!3?+EJTxI0lJDIm= qX~7u9Qj1dNj8Wy#iv9bSqO16Hyli$Ub7v-)7w_yrWAFpNCI1g$Ik&q2 diff --git a/package.json b/package.json index 5432c5d..f4ce6e2 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "scripts": { "dev": "DEBUG=* bun run --hot example/basic.ts", "dev:multi": "DEBUG=* bun run --hot example/multiInstance.ts", - "build": "rm -rf dist && tsc --project tsconfig.esm.json" + "build": "rm -rf dist && tsc --project tsconfig.esm.json", + "updateall": "pnpm i && pnpm update -L && bun i" }, "keywords": [ "elysia", @@ -41,14 +42,14 @@ "lru-cache": "10.2.0" }, "devDependencies": { - "@changesets/cli": "2.26.2", - "@elysiajs/swagger": "^1.0.3", + "@changesets/cli": "2.27.1", + "@elysiajs/swagger": "^1.0.4", "@types/debug": "^4.1.12", - "bun-types": "^1.0.14", - "elysia": "1.0.0", + "bun-types": "^1.1.4", + "elysia": "1.0.14", "elysia-ip": "^1.0.3", - "prettier": "^2.8.4", - "typescript": "^5.3.2" + "prettier": "^3.2.5", + "typescript": "^5.4.5" }, "peerDependencies": { "elysia": ">= 1.0.0" From ea417a198e74d5d711096c7d4c41aabaa9da6c1c Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Tue, 23 Apr 2024 15:02:11 +0700 Subject: [PATCH 02/19] - remove cache bun.lockb --- bun.lockb | Bin 111441 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 bun.lockb diff --git a/bun.lockb b/bun.lockb deleted file mode 100755 index ed0b1e695108ea540cdc6f80439fc627b9ca3fe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111441 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 Dy~;FQ From 1a1f420c29e540fe52d28a26255a05b3079fdff8 Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Tue, 23 Apr 2024 17:01:18 +0700 Subject: [PATCH 03/19] - add using server - add getServer type --- src/@types/GetServer.ts | 4 ++++ src/@types/Options.ts | 9 +++++++-- src/services/plugin.ts | 11 ++++++----- 3 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 src/@types/GetServer.ts diff --git a/src/@types/GetServer.ts b/src/@types/GetServer.ts new file mode 100644 index 0000000..0da0b3e --- /dev/null +++ b/src/@types/GetServer.ts @@ -0,0 +1,4 @@ +import { Server } from 'bun' +import { MaybePromise } from 'elysia' + +export type GetServer = () => MaybePromise<Server | null> diff --git a/src/@types/Options.ts b/src/@types/Options.ts index 4ec88f9..d84c349 100644 --- a/src/@types/Options.ts +++ b/src/@types/Options.ts @@ -1,5 +1,7 @@ import type { Context } from './Context' -import { Generator } from './Generator' +import type { Generator } from './Generator' +import type { GetServer } from './GetServer' +import type { LifeCycleType } from 'elysia/dist/types' export interface Options { // The duration for plugin to remember the requests (Default: 60000ms) @@ -15,7 +17,7 @@ export interface Options { responseMessage: any // scoping for rate limiting, set global by default to affect every request, but you can adjust to local to affect only within current instance - scoping: 'global' | 'local' + scoping: LifeCycleType // should the rate limit be counted when a request result is failed (Default: false) countFailedRequest: boolean @@ -30,4 +32,7 @@ export interface Options { // not counting rate limit for some requests // (Default: always return false) skip: (req: Request, key?: string) => boolean | Promise<boolean> + + // get server instance function + getServer: GetServer } diff --git a/src/services/plugin.ts b/src/services/plugin.ts index 4d0808e..45438eb 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -16,11 +16,12 @@ export const plugin = (userOptions?: Partial<Options>) => { options.context.init(options) - return (app: Elysia) => { + return async (app: Elysia) => { + const server = await options.getServer() || app.server // @ts-expect-error somehow qi is being sent from elysia, but there's no type declaration for it app.onBeforeHandle({ as: options.scoping }, async ({ set, request, query, path, store, cookie, error, body, params, headers, qi, ...rest }) => { let clientKey: string | undefined - + /** * if a skip option has two parameters, * then we will generate clientKey ahead of time. @@ -28,7 +29,7 @@ export const plugin = (userOptions?: Partial<Options>) => { * and saving some cpu consumption when actually skipped */ if (options.skip.length >= 2) - clientKey = await options.generator(request, app.server, rest) + clientKey = await options.generator(request, server, rest) // if decided to skip, then do nothing and let the app continue if (await options.skip(request, clientKey) === false) { @@ -38,7 +39,7 @@ export const plugin = (userOptions?: Partial<Options>) => { * then generate one */ if (options.skip.length < 2) - clientKey = await options.generator(request, app.server, rest) + clientKey = await options.generator(request, server, rest) const { count, nextReset } = await options.context.increment(clientKey!) @@ -73,7 +74,7 @@ export const plugin = (userOptions?: Partial<Options>) => { // @ts-expect-error somehow qi is being sent from elysia, but there's no type declaration for it app.onError({ as: options.scoping }, async ({ set, request, query, path, store, cookie, error, body, params, headers, qi, code, ...rest }) => { if (!options.countFailedRequest) { - const clientKey = await options.generator(request, app.server, rest) + const clientKey = await options.generator(request, server, rest) logger('plugin', 'request failed for clientKey: %s, refunding', clientKey) await options.context.decrement(clientKey) From befe0d1a895a0999f5988defb13436b2cf2b73ba Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Wed, 24 Apr 2024 14:08:32 +0700 Subject: [PATCH 04/19] better getServer ? --- src/@types/GetServer.ts | 4 ++-- src/constants/defaultOptions.ts | 1 + src/index.ts | 1 + src/services/plugin.ts | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/@types/GetServer.ts b/src/@types/GetServer.ts index 0da0b3e..c41b7f0 100644 --- a/src/@types/GetServer.ts +++ b/src/@types/GetServer.ts @@ -1,4 +1,4 @@ import { Server } from 'bun' -import { MaybePromise } from 'elysia' +import { Elysia, MaybePromise } from 'elysia' -export type GetServer = () => MaybePromise<Server | null> +export type GetServer = (app: Elysia) => MaybePromise<Server | null> diff --git a/src/constants/defaultOptions.ts b/src/constants/defaultOptions.ts index 8aaf83f..63f5911 100644 --- a/src/constants/defaultOptions.ts +++ b/src/constants/defaultOptions.ts @@ -11,4 +11,5 @@ export const defaultOptions: Omit<Options, 'context'> = { countFailedRequest: false, generator: defaultKeyGenerator, skip: () => false, + getServer: app => app.server, } diff --git a/src/index.ts b/src/index.ts index cc33537..345db6d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,3 +4,4 @@ export { DefaultContext } from './services/defaultContext' export type { Context } from './@types/Context' export type { Options } from './@types/Options' export type { Generator } from './@types/Generator' +export type { GetServer } from './@types/GetServer' diff --git a/src/services/plugin.ts b/src/services/plugin.ts index 45438eb..d79f6e5 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -17,7 +17,7 @@ export const plugin = (userOptions?: Partial<Options>) => { options.context.init(options) return async (app: Elysia) => { - const server = await options.getServer() || app.server + const server = await options.getServer(app) // @ts-expect-error somehow qi is being sent from elysia, but there's no type declaration for it app.onBeforeHandle({ as: options.scoping }, async ({ set, request, query, path, store, cookie, error, body, params, headers, qi, ...rest }) => { let clientKey: string | undefined From 3be619f416dda1b0dbdbc1256eb2376ceb50623e Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Wed, 24 Apr 2024 17:03:38 +0700 Subject: [PATCH 05/19] change get server to using object store server --- src/@types/GetServer.ts | 2 +- src/constants/defaultOptions.ts | 2 +- src/services/plugin.ts | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/@types/GetServer.ts b/src/@types/GetServer.ts index c41b7f0..e3d11dd 100644 --- a/src/@types/GetServer.ts +++ b/src/@types/GetServer.ts @@ -1,4 +1,4 @@ import { Server } from 'bun' import { Elysia, MaybePromise } from 'elysia' -export type GetServer = (app: Elysia) => MaybePromise<Server | null> +export type GetServer = (app: Elysia) => MaybePromise<Elysia> diff --git a/src/constants/defaultOptions.ts b/src/constants/defaultOptions.ts index 63f5911..ae64110 100644 --- a/src/constants/defaultOptions.ts +++ b/src/constants/defaultOptions.ts @@ -11,5 +11,5 @@ export const defaultOptions: Omit<Options, 'context'> = { countFailedRequest: false, generator: defaultKeyGenerator, skip: () => false, - getServer: app => app.server, + getServer: app => app, } diff --git a/src/services/plugin.ts b/src/services/plugin.ts index d79f6e5..11b4859 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -17,7 +17,7 @@ export const plugin = (userOptions?: Partial<Options>) => { options.context.init(options) return async (app: Elysia) => { - const server = await options.getServer(app) + const serverApp = await options.getServer(app) // @ts-expect-error somehow qi is being sent from elysia, but there's no type declaration for it app.onBeforeHandle({ as: options.scoping }, async ({ set, request, query, path, store, cookie, error, body, params, headers, qi, ...rest }) => { let clientKey: string | undefined @@ -29,7 +29,7 @@ export const plugin = (userOptions?: Partial<Options>) => { * and saving some cpu consumption when actually skipped */ if (options.skip.length >= 2) - clientKey = await options.generator(request, server, rest) + clientKey = await options.generator(request, serverApp.server, rest) // if decided to skip, then do nothing and let the app continue if (await options.skip(request, clientKey) === false) { @@ -39,7 +39,7 @@ export const plugin = (userOptions?: Partial<Options>) => { * then generate one */ if (options.skip.length < 2) - clientKey = await options.generator(request, server, rest) + clientKey = await options.generator(request, serverApp.server, rest) const { count, nextReset } = await options.context.increment(clientKey!) @@ -74,7 +74,7 @@ export const plugin = (userOptions?: Partial<Options>) => { // @ts-expect-error somehow qi is being sent from elysia, but there's no type declaration for it app.onError({ as: options.scoping }, async ({ set, request, query, path, store, cookie, error, body, params, headers, qi, code, ...rest }) => { if (!options.countFailedRequest) { - const clientKey = await options.generator(request, server, rest) + const clientKey = await options.generator(request, serverApp.server, rest) logger('plugin', 'request failed for clientKey: %s, refunding', clientKey) await options.context.decrement(clientKey) From 656d0b7d173b65fbd350f2803fc8cd2bf5b1ae47 Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Thu, 25 Apr 2024 11:43:43 +0700 Subject: [PATCH 06/19] - add throw error when rate-limit reached - add type needRequestIP - edit getserver for support only need requestIP function --- src/@types/Generator.ts | 7 ++++++- src/@types/GetServer.ts | 4 ++-- src/@types/NeedRequestIp.ts | 9 +++++++++ src/@types/Options.ts | 3 +++ src/index.ts | 1 + src/services/plugin.ts | 4 ++++ 6 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 src/@types/NeedRequestIp.ts diff --git a/src/@types/Generator.ts b/src/@types/Generator.ts index 907cf3f..ed310ad 100644 --- a/src/@types/Generator.ts +++ b/src/@types/Generator.ts @@ -1,4 +1,9 @@ import type { Server } from 'bun' import type { MaybePromise } from 'elysia' +import { NeedRequestIP } from './NeedRequestIp' -export type Generator<T extends object = {}> = (equest: Request, server: Server | null, derived: T) => MaybePromise<string> +export type Generator<T extends object = {}> = ( + equest: Request, + server: Server | NeedRequestIP['server'] | null, + derived: T +) => MaybePromise<string> diff --git a/src/@types/GetServer.ts b/src/@types/GetServer.ts index e3d11dd..612bfc8 100644 --- a/src/@types/GetServer.ts +++ b/src/@types/GetServer.ts @@ -1,4 +1,4 @@ -import { Server } from 'bun' import { Elysia, MaybePromise } from 'elysia' +import { NeedRequestIP } from './NeedRequestIp' -export type GetServer = (app: Elysia) => MaybePromise<Elysia> +export type GetServer = (app: Elysia) => MaybePromise<Elysia | NeedRequestIP> diff --git a/src/@types/NeedRequestIp.ts b/src/@types/NeedRequestIp.ts new file mode 100644 index 0000000..20faf86 --- /dev/null +++ b/src/@types/NeedRequestIp.ts @@ -0,0 +1,9 @@ +import { Server } from 'bun' + +export interface NeedRequestIP { + [key: string]: any + server: { + [key: string]: any + requestIP: Server['requestIP'] + } | null +} diff --git a/src/@types/Options.ts b/src/@types/Options.ts index d84c349..8291613 100644 --- a/src/@types/Options.ts +++ b/src/@types/Options.ts @@ -35,4 +35,7 @@ export interface Options { // get server instance function getServer: GetServer + + // throw this object when rate-limit reached + throwOnError?: Error } diff --git a/src/index.ts b/src/index.ts index 345db6d..44dc942 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,3 +5,4 @@ export type { Context } from './@types/Context' export type { Options } from './@types/Options' export type { Generator } from './@types/Generator' export type { GetServer } from './@types/GetServer' +export type { NeedRequestIP } from './@types/NeedRequestIp' diff --git a/src/services/plugin.ts b/src/services/plugin.ts index 11b4859..aee8b67 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -64,6 +64,10 @@ export const plugin = (userOptions?: Partial<Options>) => { Math.ceil(options.duration / 1000) ) set.status = options.responseCode + + if (options.throwOnError) { + throw options.throwOnError + } return options.responseMessage } From 10d51026c74bae11a3fe71d723aa779faf6552cc Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Thu, 25 Apr 2024 14:15:34 +0700 Subject: [PATCH 07/19] add getServer Docs --- README.md | 90 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 79 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 51bf69f..a95f46d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ Lightweight rate limiter plugin for [Elysia.js](https://elysiajs.com/)   - ## Install ``` @@ -22,7 +21,7 @@ Using the latest version of `elysia-rate-limit` would works just fine. However, please refer to the following table to determine which version to use. | Plugin version | Requirements | -|----------------|------------------------------| +| -------------- | ---------------------------- | | 3.0.0+ | Bun > 1.0.3, Elysia >= 1.0.0 | | 2.0.0 - 2.2.0 | Bun > 1.0.3, Elysia < 1.0.0 | | 1.0.2 - 1.3.0 | Bun <= 1.0.3, Elysia < 1.0.0 | @@ -78,7 +77,7 @@ Message to be sent when the rate limit was reached ### scoping -`'global' | 'local'` +`LifeCycleType` Default: `'global'` @@ -119,7 +118,7 @@ import type { Generator } from 'elysia-rate-limit' const ipGenerator: Generator<{ ip: SocketAddress }> = (_req, _serv, { ip }) => { return ip -} +} ``` ### countFailedRequest @@ -153,13 +152,12 @@ By default, context implementation, caching will be an LRU cache with a maximum ```ts import { DefaultContext } from 'elysia-rate-limit' -new Elysia() - .use( - rateLimit({ - // define max cache size to 10,000 - context: new DefaultContext(10_000), - }) - ) +new Elysia().use( + rateLimit({ + // define max cache size to 10,000 + context: new DefaultContext(10_000), + }) +) ``` ### skip @@ -173,3 +171,73 @@ to determine that should this request be counted into rate-limit or not based on information given by `Request` object (i.e., Skip counting rate-limit on some route) and the key of the given request, by default, this will always return `false` which means counted everything. + +### getServer + +`(app: Elysia) => MaybePromise<Elysia | NeedRequestIP>` + +Default: `(app) => app` + +```ts +import { Elysia } from 'elysia' +import { rateLimit } from 'elysia-rate-limit' +import bearer from '@elysiajs/bearer' + +class appInstance { + static server: Server | null +} + +const setup = new Elysia({ + name: 'setup', +}).use(bearer()) + +const userList = new Elysia({ + name: 'userListRoute', +}) + .use(setup) + .use( + rateLimit({ + getServer: _ => appInstance, + scoping: 'scoped', + max: 10, + duration: 100, + }) + ) + .get('/user', ({ bearer }) => { + return user.list() + }) + +const userAdd = new Elysia({ + name: 'userAddRoute', +}) + .use(setup) + .use( + rateLimit({ + getServer: _ => appInstance, + scoping: 'scoped', + max: 2, + duration: 1000, + }) + ) + .post('/user', ({ body }) => { + return user.add(body) + }) + +const app = new Elysia({ + name: 'app', +}) + .use(helmet()) + + .use(userAdd) + .use(userList) + + .listen({}, ({ development, hostname, port }) => { + console.log( + `🦊 Elysia is running at ${hostname}:${port} ${ + development ? '🚧 in development mode!🚧' : '' + }` + ) + }) + +appInstance.server = app.server +``` From 561c004d3dadb3e0b938ed51cf82832cf5ef502e Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Thu, 25 Apr 2024 14:52:58 +0700 Subject: [PATCH 08/19] add throwOnError Docs --- README.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a95f46d..f3800dd 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,8 @@ to choose scope `local` apply to only current instance and descendant only. But by default, rate limit plugin will apply to all instances that apply the plugin. +Read more : [Scope - ElysiaJS | ElysiaJS](https://elysiajs.com/essential/scope.html#scope) + ### generator `<T extends object>(equest: Request, server: Server | null, derived: T) => MaybePromise<string>` @@ -231,13 +233,64 @@ const app = new Elysia({ .use(userAdd) .use(userList) - .listen({}, ({ development, hostname, port }) => { - console.log( - `🦊 Elysia is running at ${hostname}:${port} ${ - development ? '🚧 in development mode!🚧' : '' - }` - ) - }) + .listen( + { + port: 8081, + }, + ({ development, hostname, port }) => { + console.log( + `🦊 Elysia is running at ${hostname}:${port} ${ + development ? '🚧 in development mode!🚧' : '' + }` + ) + } + ) appInstance.server = app.server ``` + +### throwOnError + +`Error` + +Throw this object when rate-limit reached + +Read more : + +- [Error Provider - ElysiaJS | ElysiaJS](https://elysiajs.com/validation/error-provider.html#onerror) +- [Error Handling - ElysiaJS | ElysiaJS](https://elysiajs.com/life-cycle/on-error.html) + +```ts +import { Elysia } from 'elysia' +import { rateLimit } from 'elysia-rate-limit' +import { HttpStatusEnum } from 'elysia-http-status-code/status' + +export class rateLimitError extends Error { + constructor( + public message: string = 'TOO_MANY_REQUESTS', + public detail: string = '', + public status: number = HttpStatusEnum.HTTP_429_TOO_MANY_REQUESTS // or just 429 + ) { + super(message) + } +} + +new Elysia() + .use( + rateLimit({ + throwOnError: new rateLimitError(), + }) + ) + // use with error hanlder + .error({ + RateLimit: rateLimitError, + }) + .onError({ as: 'global' }, ({ code }) => { + switch (code) { + case 'RateLimit': + return code + break + } + }) + .listen(3000) +``` From 9583702b36ba9eeace7bee93255aa64cc445d46f Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Thu, 25 Apr 2024 16:42:59 +0700 Subject: [PATCH 09/19] export default option --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 44dc942..b4d9240 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ export { plugin as rateLimit } from './services/plugin' export { DefaultContext } from './services/defaultContext' +export { defaultOptions as rateLimitDefaultOptions } from './constants/defaultOptions' export type { Context } from './@types/Context' export type { Options } from './@types/Options' From 62e17e9e55456eeabd5246ac23783c03808ca7c2 Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Fri, 26 Apr 2024 14:26:31 +0700 Subject: [PATCH 10/19] fix for https://github.com/rayriffy/elysia-rate-limit/pull/40#pullrequestreview-2022007469 --- .gitignore | 1 - README.md | 96 ++++++++++++-------------------- bun.lockb | Bin 0 -> 115630 bytes package.json | 3 +- src/@types/Generator.ts | 2 +- src/@types/GetServer.ts | 4 +- src/@types/NeedRequestIp.ts | 2 +- src/@types/Options.ts | 13 +---- src/constants/defaultOptions.ts | 3 +- src/services/plugin.ts | 11 ++-- 10 files changed, 51 insertions(+), 84 deletions(-) create mode 100755 bun.lockb diff --git a/.gitignore b/.gitignore index 1f30be5..dbdc147 100644 --- a/.gitignore +++ b/.gitignore @@ -180,4 +180,3 @@ dist package-lock.json pnpm-lock.yaml yaml.lock -bun.lockb \ No newline at end of file diff --git a/README.md b/README.md index f3800dd..894b0c4 100644 --- a/README.md +++ b/README.md @@ -56,28 +56,50 @@ Default: `10` Maximum of request to be allowed during 1 `duration` timeframe. -### responseCode +### errorResponse -`number` - -Default: `429` +`string | Response | Error` -HTTP response code to be sent when the rate limit was reached. -By default, -it will return `429 Too Many Requests` -referring to [RFC 6585 specification](https://www.rfc-editor.org/rfc/rfc6585#section-4) +// Object to response when rate-limit reached -### responseMessage - -`any` +```ts +import { Elysia } from 'elysia' +import { rateLimit } from 'elysia-rate-limit' +import { HttpStatusEnum } from 'elysia-http-status-code/status' -Default: `rate-limit reached` +export class rateLimitError extends Error { + constructor( + public message: string = 'TOO_MANY_REQUESTS', + public detail: string = '', + public status: number = HttpStatusEnum.HTTP_429_TOO_MANY_REQUESTS // or just 429 + ) { + super(message) + } +} -Message to be sent when the rate limit was reached +new Elysia() + .use( + rateLimit({ + errorResponse: new rateLimitError(), + }) + ) + // use with error hanlder + .error({ + RateLimit: rateLimitError, + }) + .onError({ as: 'global' }, ({ code }) => { + switch (code) { + case 'RateLimit': + return code + break + } + }) + .listen(3000) +``` ### scoping -`LifeCycleType` +`'global' | 'local' | 'scoped'` Default: `'global'` @@ -248,49 +270,3 @@ const app = new Elysia({ appInstance.server = app.server ``` - -### throwOnError - -`Error` - -Throw this object when rate-limit reached - -Read more : - -- [Error Provider - ElysiaJS | ElysiaJS](https://elysiajs.com/validation/error-provider.html#onerror) -- [Error Handling - ElysiaJS | ElysiaJS](https://elysiajs.com/life-cycle/on-error.html) - -```ts -import { Elysia } from 'elysia' -import { rateLimit } from 'elysia-rate-limit' -import { HttpStatusEnum } from 'elysia-http-status-code/status' - -export class rateLimitError extends Error { - constructor( - public message: string = 'TOO_MANY_REQUESTS', - public detail: string = '', - public status: number = HttpStatusEnum.HTTP_429_TOO_MANY_REQUESTS // or just 429 - ) { - super(message) - } -} - -new Elysia() - .use( - rateLimit({ - throwOnError: new rateLimitError(), - }) - ) - // use with error hanlder - .error({ - RateLimit: rateLimitError, - }) - .onError({ as: 'global' }, ({ code }) => { - switch (code) { - case 'RateLimit': - return code - break - } - }) - .listen(3000) -``` diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..d2ac98d6a8039ea2b703fe7092bb2fff28ef92e3 GIT binary patch literal 115630 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index f4ce6e2..86f0ce8 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,7 @@ "scripts": { "dev": "DEBUG=* bun run --hot example/basic.ts", "dev:multi": "DEBUG=* bun run --hot example/multiInstance.ts", - "build": "rm -rf dist && tsc --project tsconfig.esm.json", - "updateall": "pnpm i && pnpm update -L && bun i" + "build": "rm -rf dist && tsc --project tsconfig.esm.json" }, "keywords": [ "elysia", diff --git a/src/@types/Generator.ts b/src/@types/Generator.ts index ed310ad..7054866 100644 --- a/src/@types/Generator.ts +++ b/src/@types/Generator.ts @@ -1,6 +1,6 @@ import type { Server } from 'bun' import type { MaybePromise } from 'elysia' -import { NeedRequestIP } from './NeedRequestIp' +import type { NeedRequestIP } from './NeedRequestIp' export type Generator<T extends object = {}> = ( equest: Request, diff --git a/src/@types/GetServer.ts b/src/@types/GetServer.ts index 612bfc8..1ac4409 100644 --- a/src/@types/GetServer.ts +++ b/src/@types/GetServer.ts @@ -1,4 +1,4 @@ -import { Elysia, MaybePromise } from 'elysia' -import { NeedRequestIP } from './NeedRequestIp' +import type { Elysia, MaybePromise } from 'elysia' +import type { NeedRequestIP } from './NeedRequestIp' export type GetServer = (app: Elysia) => MaybePromise<Elysia | NeedRequestIP> diff --git a/src/@types/NeedRequestIp.ts b/src/@types/NeedRequestIp.ts index 20faf86..03cb38a 100644 --- a/src/@types/NeedRequestIp.ts +++ b/src/@types/NeedRequestIp.ts @@ -1,4 +1,4 @@ -import { Server } from 'bun' +import type { Server } from 'bun' export interface NeedRequestIP { [key: string]: any diff --git a/src/@types/Options.ts b/src/@types/Options.ts index 8291613..745e8fa 100644 --- a/src/@types/Options.ts +++ b/src/@types/Options.ts @@ -1,7 +1,6 @@ import type { Context } from './Context' import type { Generator } from './Generator' import type { GetServer } from './GetServer' -import type { LifeCycleType } from 'elysia/dist/types' export interface Options { // The duration for plugin to remember the requests (Default: 60000ms) @@ -10,14 +9,11 @@ export interface Options { // Maximum of requests per specified duration (Default: 10) max: number - // status code to be sent when rate-limit reached (Default: 429 per RFC 6585 specification) - responseCode: number - - // message response when rate-limit reached (Default: rate-limit reached) - responseMessage: any + // Object to response when rate-limit reached + errorResponse: string | Response | Error // scoping for rate limiting, set global by default to affect every request, but you can adjust to local to affect only within current instance - scoping: LifeCycleType + scoping: 'global' | 'local' | 'scoped' // should the rate limit be counted when a request result is failed (Default: false) countFailedRequest: boolean @@ -35,7 +31,4 @@ export interface Options { // get server instance function getServer: GetServer - - // throw this object when rate-limit reached - throwOnError?: Error } diff --git a/src/constants/defaultOptions.ts b/src/constants/defaultOptions.ts index ae64110..3e66d0c 100644 --- a/src/constants/defaultOptions.ts +++ b/src/constants/defaultOptions.ts @@ -5,8 +5,7 @@ import type { Options } from '../@types/Options' export const defaultOptions: Omit<Options, 'context'> = { duration: 60000, max: 10, - responseCode: 429, - responseMessage: 'rate-limit reached', + errorResponse: 'rate-limit reached', scoping: 'global', countFailedRequest: false, generator: defaultKeyGenerator, diff --git a/src/services/plugin.ts b/src/services/plugin.ts index aee8b67..9a1e74e 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -63,12 +63,13 @@ export const plugin = (userOptions?: Partial<Options>) => { set.headers['Retry-After'] = String( Math.ceil(options.duration / 1000) ) - set.status = options.responseCode - if (options.throwOnError) { - throw options.throwOnError - } - return options.responseMessage + if (options.errorResponse instanceof Error) + throw options.errorResponse + + if (typeof options.errorResponse === "string") + set.status = 429 + return options.errorResponse } logger('plugin', 'clientKey %s passed through with %d/%d request used (resetting in %d seconds)', clientKey, options.max - payload.remaining, options.max, reset) From 33276c2ddaaa71ff3b0701e74b784d4ad8499ae6 Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Fri, 26 Apr 2024 14:26:44 +0700 Subject: [PATCH 11/19] update dependencies --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 86f0ce8..32d11ea 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "license": "MIT", "dependencies": { "debug": "4.3.4", - "lru-cache": "10.2.0" + "lru-cache": "10.2.1" }, "devDependencies": { "@changesets/cli": "2.27.1", From 2827721c745b764af02082dea4d4b0a26536d6d1 Mon Sep 17 00:00:00 2001 From: armada45-pixel <armada1@hotmail.co.th> Date: Fri, 26 Apr 2024 15:04:29 +0700 Subject: [PATCH 12/19] add default options use as global option in example --- README.md | 45 ++++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 894b0c4..19febae 100644 --- a/README.md +++ b/README.md @@ -202,63 +202,50 @@ by default, this will always return `false` which means counted everything. Default: `(app) => app` +A custom function +to get access server instance + +Use with `rateLimitDefaultOptions` as a global configuration. + ```ts import { Elysia } from 'elysia' -import { rateLimit } from 'elysia-rate-limit' +import { rateLimit, rateLimitDefaultOptions } from 'elysia-rate-limit' import bearer from '@elysiajs/bearer' class appInstance { static server: Server | null } -const setup = new Elysia({ - name: 'setup', -}).use(bearer()) +rateLimitDefaultOptions.getServer = _ => appInstance -const userList = new Elysia({ - name: 'userListRoute', -}) - .use(setup) +const setup = new Elysia({name: 'setup'}).use(bearer()) + +const userList = new Elysia({name: 'userListRoute'}).use(setup) .use( rateLimit({ - getServer: _ => appInstance, scoping: 'scoped', max: 10, duration: 100, }) ) - .get('/user', ({ bearer }) => { - return user.list() - }) + .get('/user', ({ bearer }) => user.info(bearer)) -const userAdd = new Elysia({ - name: 'userAddRoute', -}) - .use(setup) +const userAdd = new Elysia({name: 'userAddRoute'}).use(setup) .use( rateLimit({ - getServer: _ => appInstance, scoping: 'scoped', max: 2, duration: 1000, }) ) - .post('/user', ({ body }) => { - return user.add(body) - }) + .post('/user', ({ body }) => user.add(body)) -const app = new Elysia({ - name: 'app', -}) +const app = new Elysia({name: 'app'}) .use(helmet()) - .use(userAdd) - .use(userList) + .use(userAdd).use(userList) - .listen( - { - port: 8081, - }, + .listen({port: 8081} ({ development, hostname, port }) => { console.log( `🦊 Elysia is running at ${hostname}:${port} ${ From d542a314cd35f3d4e4d56b847dca55879fc0fb8d Mon Sep 17 00:00:00 2001 From: Phumrapee Limpianchop <git@rayriffy.com> Date: Sat, 27 Apr 2024 00:48:11 +0900 Subject: [PATCH 13/19] fix: export variable name as-is --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index b4d9240..ed380fc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ export { plugin as rateLimit } from './services/plugin' export { DefaultContext } from './services/defaultContext' -export { defaultOptions as rateLimitDefaultOptions } from './constants/defaultOptions' +export { defaultOptions } from './constants/defaultOptions' export type { Context } from './@types/Context' export type { Options } from './@types/Options' From cb0c0819914d7a293d5fd0d9ed1a2dce36848b40 Mon Sep 17 00:00:00 2001 From: Phumrapee Limpianchop <git@rayriffy.com> Date: Sat, 27 Apr 2024 00:50:33 +0900 Subject: [PATCH 14/19] refactor: grouping if condition --- src/services/plugin.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/services/plugin.ts b/src/services/plugin.ts index 9a1e74e..1ae9792 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -21,7 +21,7 @@ export const plugin = (userOptions?: Partial<Options>) => { // @ts-expect-error somehow qi is being sent from elysia, but there's no type declaration for it app.onBeforeHandle({ as: options.scoping }, async ({ set, request, query, path, store, cookie, error, body, params, headers, qi, ...rest }) => { let clientKey: string | undefined - + /** * if a skip option has two parameters, * then we will generate clientKey ahead of time. @@ -63,12 +63,12 @@ export const plugin = (userOptions?: Partial<Options>) => { set.headers['Retry-After'] = String( Math.ceil(options.duration / 1000) ) - - if (options.errorResponse instanceof Error) + + if (options.errorResponse instanceof Error) throw options.errorResponse - - if (typeof options.errorResponse === "string") + else if (typeof options.errorResponse === "string") set.status = 429 + return options.errorResponse } From 99281150bec053a15ad251b5bd50485f415f9eca Mon Sep 17 00:00:00 2001 From: Phumrapee Limpianchop <git@rayriffy.com> Date: Sat, 27 Apr 2024 01:10:12 +0900 Subject: [PATCH 15/19] refactor: errorResponse --- README.md | 46 +++++++++++++++++++++++++++++++++--------- src/services/plugin.ts | 35 ++++++++++++++++++++++++-------- 2 files changed, 64 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 19febae..4863a28 100644 --- a/README.md +++ b/README.md @@ -60,16 +60,43 @@ Maximum of request to be allowed during 1 `duration` timeframe. `string | Response | Error` -// Object to response when rate-limit reached +Default: `rate-limit reached` + +Response to be sent when the rate limit is reached. + +If you define a value as a string, +then it will be sent as a plain text response with status code 429. If you define a value as a `Response` object, +then it will be sent as is. +And if you define a value as an `Error` object, then it will be thrown as an error. + +<details> +<summary>Example for <code>Response</code> object response</summary> + +```ts +new Elysia() + .use( + rateLimit({ + errorResponse: new Response("rate-limited", { + status: 429, + headers: new Headers({ + 'Content-Type': 'text/plain', + 'Custom-Header': 'custom', + }), + }), + }) + ) +``` +</details> + +<details> +<summary>Example for <code>Error</code> object response</summary> ```ts -import { Elysia } from 'elysia' -import { rateLimit } from 'elysia-rate-limit' import { HttpStatusEnum } from 'elysia-http-status-code/status' -export class rateLimitError extends Error { +export class RateLimitError extends Error { constructor( - public message: string = 'TOO_MANY_REQUESTS', + public message: string = 'rate-limited', public detail: string = '', public status: number = HttpStatusEnum.HTTP_429_TOO_MANY_REQUESTS // or just 429 ) { @@ -80,23 +107,24 @@ export class rateLimitError extends Error { new Elysia() .use( rateLimit({ - errorResponse: new rateLimitError(), + errorResponse: new RateLimitError(), }) ) // use with error hanlder .error({ - RateLimit: rateLimitError, + rateLimited: RateLimitError, }) .onError({ as: 'global' }, ({ code }) => { switch (code) { - case 'RateLimit': + case 'rateLimited': return code break } }) - .listen(3000) ``` +</details> + ### scoping `'global' | 'local' | 'scoped'` diff --git a/src/services/plugin.ts b/src/services/plugin.ts index 1ae9792..364b842 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -52,24 +52,43 @@ export const plugin = (userOptions?: Partial<Options>) => { // set standard headers const reset = Math.max(0, Math.ceil((nextReset.getTime() - Date.now()) / 1000)) - set.headers['RateLimit-Limit'] = String(options.max) - set.headers['RateLimit-Remaining'] = String(payload.remaining) - set.headers['RateLimit-Reset'] = String(reset) + + let builtHeaders: Record<string, string> = { + 'RateLimit-Limit': String(options.max), + 'RateLimit-Remaining': String(payload.remaining), + 'RateLimit-Reset': String(reset), + } // reject if limit were reached if (payload.current >= payload.limit + 1) { logger('plugin', 'rate limit exceeded for clientKey: %s (resetting in %d seconds)', clientKey, reset) - set.headers['Retry-After'] = String( - Math.ceil(options.duration / 1000) - ) + builtHeaders['Retry-After'] = String(Math.ceil(options.duration / 1000)) + + console.log(options.errorResponse instanceof Response) if (options.errorResponse instanceof Error) throw options.errorResponse - else if (typeof options.errorResponse === "string") + else if (options.errorResponse instanceof Response) { + // duplicate the response to avoid mutation + const clonedResponse = options.errorResponse.clone() + + // append headers + for (const [key, value] of Object.entries(builtHeaders)) + clonedResponse.headers.set(key, value) + + return clonedResponse + } + else if (typeof options.errorResponse === "string") { + // append headers + for (const [key, value] of Object.entries(builtHeaders)) + set.headers[key] = value + + // set default status code set.status = 429 - return options.errorResponse + return options.errorResponse + } } logger('plugin', 'clientKey %s passed through with %d/%d request used (resetting in %d seconds)', clientKey, options.max - payload.remaining, options.max, reset) From 9add8a1baa6496636a92ab360094f61fffc63eff Mon Sep 17 00:00:00 2001 From: Phumrapee Limpianchop <git@rayriffy.com> Date: Sat, 27 Apr 2024 01:10:20 +0900 Subject: [PATCH 16/19] chore: regenerate lockfile --- bun.lockb | Bin 115630 -> 115630 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bun.lockb b/bun.lockb index d2ac98d6a8039ea2b703fe7092bb2fff28ef92e3..ddd647afc49ed57c9853db2b377308bfe3bd708e 100755 GIT binary patch delta 143 zcmV;A0C4}VhX<~Q2aqlxYs9oEa`O$KmGc2kV{pZpj~0((6wz&;v3?^ekC>OEu}<m| zlXxpIvuG2=TR^ofxU!Jm|25%RvriJRhqLeoJ2uJ~bpFY-fvRUqo5h*e70X)j{6c>9 xK=380SY6Vk6IwjJDql&MgrE)4Be1h=Z^p#|F}E}|0lYVt1g8NYw-9Xso>pF3Lv#QD delta 143 zcmV;A0C4}VhX<~Q2aqlx*g^<(zgyBL5*D;l-Ei>+H4JAkI$`P{sA$^iMh&pcu}<m| zlXxC5vuG2=TR_>e4D%nA0se_khROn1($=LGfXgan6UHSjg-NJLF!gV8*A0gyY3u@S x?yIpmZ)3tr@&y-)WsYrQl32fK|LwDFZ^p#|Ft;={0lYVtvUUL=w-9Xso>tmIKiB{O From e10050f55c58c05e18efd7645e916655764efa87 Mon Sep 17 00:00:00 2001 From: Phumrapee Limpianchop <git@rayriffy.com> Date: Sat, 27 Apr 2024 02:24:31 +0900 Subject: [PATCH 17/19] refactor: getServer -> injectServer --- README.md | 69 ++++++--------------------------- example/muliInstanceInjected.ts | 38 ++++++++++++++++++ example/multiInstance.ts | 1 + src/@types/Generator.ts | 5 +-- src/@types/GetServer.ts | 4 -- src/@types/NeedRequestIp.ts | 9 ----- src/@types/Options.ts | 13 +++++-- src/constants/defaultOptions.ts | 1 - src/index.ts | 2 - src/services/plugin.ts | 18 +++++---- 10 files changed, 72 insertions(+), 88 deletions(-) create mode 100644 example/muliInstanceInjected.ts delete mode 100644 src/@types/GetServer.ts delete mode 100644 src/@types/NeedRequestIp.ts diff --git a/README.md b/README.md index 4863a28..ccea946 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ Using the latest version of `elysia-rate-limit` would works just fine. However, please refer to the following table to determine which version to use. | Plugin version | Requirements | -| -------------- | ---------------------------- | +|----------------|------------------------------| | 3.0.0+ | Bun > 1.0.3, Elysia >= 1.0.0 | | 2.0.0 - 2.2.0 | Bun > 1.0.3, Elysia < 1.0.0 | | 1.0.2 - 1.3.0 | Bun <= 1.0.3, Elysia < 1.0.0 | @@ -224,64 +224,17 @@ or not based on information given by `Request` object (i.e., Skip counting rate-limit on some route) and the key of the given request, by default, this will always return `false` which means counted everything. -### getServer +### injectServer -`(app: Elysia) => MaybePromise<Elysia | NeedRequestIP>` +`() => Server` -Default: `(app) => app` +Default: `undefined` -A custom function -to get access server instance - -Use with `rateLimitDefaultOptions` as a global configuration. - -```ts -import { Elysia } from 'elysia' -import { rateLimit, rateLimitDefaultOptions } from 'elysia-rate-limit' -import bearer from '@elysiajs/bearer' - -class appInstance { - static server: Server | null -} +A function to inject server instance to the plugin, +this is useful +when you want to use default key generator in detached Elysia instances. +You can check out the example [here](./example/muliInstanceInjected.ts). -rateLimitDefaultOptions.getServer = _ => appInstance - -const setup = new Elysia({name: 'setup'}).use(bearer()) - -const userList = new Elysia({name: 'userListRoute'}).use(setup) - .use( - rateLimit({ - scoping: 'scoped', - max: 10, - duration: 100, - }) - ) - .get('/user', ({ bearer }) => user.info(bearer)) - -const userAdd = new Elysia({name: 'userAddRoute'}).use(setup) - .use( - rateLimit({ - scoping: 'scoped', - max: 2, - duration: 1000, - }) - ) - .post('/user', ({ body }) => user.add(body)) - -const app = new Elysia({name: 'app'}) - .use(helmet()) - - .use(userAdd).use(userList) - - .listen({port: 8081} - ({ development, hostname, port }) => { - console.log( - `🦊 Elysia is running at ${hostname}:${port} ${ - development ? '🚧 in development mode!🚧' : '' - }` - ) - } - ) - -appInstance.server = app.server -``` +Please use this function as a last resort, +as defining this option will make plugin to make an extra function call, +which may affect performance. diff --git a/example/muliInstanceInjected.ts b/example/muliInstanceInjected.ts new file mode 100644 index 0000000..025fca0 --- /dev/null +++ b/example/muliInstanceInjected.ts @@ -0,0 +1,38 @@ +import { Elysia } from 'elysia' +import { swagger } from '@elysiajs/swagger' + +import { rateLimit } from '../src' + +import type { Options } from '../src' +import type { Server } from 'bun' + +let server: Server | null + +const options: Partial<Options> = { + scoping: 'local', + duration: 200 * 1000, + injectServer: () => { + return server! + }, +} + +// const keyGenerator: Generator<{ ip: string }> = async (req, server, { ip }) => Bun.hash(JSON.stringify(ip)).toString() + +const aInstance = new Elysia() + .use(rateLimit(options)) + .get('/a', () => 'a') + +const bInstance = new Elysia() + .use(rateLimit(options)) + .get('/b', () => 'b') + +const app = new Elysia() + .use(swagger()) + .use(aInstance) + .use(bInstance) + .get('/', () => 'hello') + .listen(3000, () => { + console.log('🦊 Swagger is active at: http://localhost:3000/swagger') + }) + +server = app.server diff --git a/example/multiInstance.ts b/example/multiInstance.ts index 8b7921d..359a1a2 100644 --- a/example/multiInstance.ts +++ b/example/multiInstance.ts @@ -3,6 +3,7 @@ import { swagger } from '@elysiajs/swagger' import { ip } from 'elysia-ip' // just a glitch pls ignore this import { rateLimit } from '../src' + import type { Generator } from '../src' const keyGenerator: Generator<{ ip: string }> = async (req, server, { ip }) => Bun.hash(JSON.stringify(ip)).toString() diff --git a/src/@types/Generator.ts b/src/@types/Generator.ts index 7054866..d673d52 100644 --- a/src/@types/Generator.ts +++ b/src/@types/Generator.ts @@ -1,9 +1,8 @@ import type { Server } from 'bun' import type { MaybePromise } from 'elysia' -import type { NeedRequestIP } from './NeedRequestIp' export type Generator<T extends object = {}> = ( - equest: Request, - server: Server | NeedRequestIP['server'] | null, + request: Request, + server: Server | null, derived: T ) => MaybePromise<string> diff --git a/src/@types/GetServer.ts b/src/@types/GetServer.ts deleted file mode 100644 index 1ac4409..0000000 --- a/src/@types/GetServer.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { Elysia, MaybePromise } from 'elysia' -import type { NeedRequestIP } from './NeedRequestIp' - -export type GetServer = (app: Elysia) => MaybePromise<Elysia | NeedRequestIP> diff --git a/src/@types/NeedRequestIp.ts b/src/@types/NeedRequestIp.ts deleted file mode 100644 index 03cb38a..0000000 --- a/src/@types/NeedRequestIp.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { Server } from 'bun' - -export interface NeedRequestIP { - [key: string]: any - server: { - [key: string]: any - requestIP: Server['requestIP'] - } | null -} diff --git a/src/@types/Options.ts b/src/@types/Options.ts index 745e8fa..d343138 100644 --- a/src/@types/Options.ts +++ b/src/@types/Options.ts @@ -1,6 +1,7 @@ +import type { Server } from 'bun' + import type { Context } from './Context' import type { Generator } from './Generator' -import type { GetServer } from './GetServer' export interface Options { // The duration for plugin to remember the requests (Default: 60000ms) @@ -12,7 +13,8 @@ export interface Options { // Object to response when rate-limit reached errorResponse: string | Response | Error - // scoping for rate limiting, set global by default to affect every request, but you can adjust to local to affect only within current instance + // scoping for rate limiting, set global by default to affect every request, + // but you can adjust to local to affect only within current instance scoping: 'global' | 'local' | 'scoped' // should the rate limit be counted when a request result is failed (Default: false) @@ -29,6 +31,9 @@ export interface Options { // (Default: always return false) skip: (req: Request, key?: string) => boolean | Promise<boolean> - // get server instance function - getServer: GetServer + // an explicit way to inject server instance to generator function + // uses this as last resort only + // since this function will slightly reduce server performance + // (Default: not defined) + injectServer?: () => Server } diff --git a/src/constants/defaultOptions.ts b/src/constants/defaultOptions.ts index 3e66d0c..064bdf9 100644 --- a/src/constants/defaultOptions.ts +++ b/src/constants/defaultOptions.ts @@ -10,5 +10,4 @@ export const defaultOptions: Omit<Options, 'context'> = { countFailedRequest: false, generator: defaultKeyGenerator, skip: () => false, - getServer: app => app, } diff --git a/src/index.ts b/src/index.ts index ed380fc..ff115f5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,5 +5,3 @@ export { defaultOptions } from './constants/defaultOptions' export type { Context } from './@types/Context' export type { Options } from './@types/Options' export type { Generator } from './@types/Generator' -export type { GetServer } from './@types/GetServer' -export type { NeedRequestIP } from './@types/NeedRequestIp' diff --git a/src/services/plugin.ts b/src/services/plugin.ts index 364b842..1bbe768 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -16,8 +16,10 @@ export const plugin = (userOptions?: Partial<Options>) => { options.context.init(options) - return async (app: Elysia) => { - const serverApp = await options.getServer(app) + // NOTE: + // do not make plugin to return async + // otherwise request will be triggered twice + return (app: Elysia) => { // @ts-expect-error somehow qi is being sent from elysia, but there's no type declaration for it app.onBeforeHandle({ as: options.scoping }, async ({ set, request, query, path, store, cookie, error, body, params, headers, qi, ...rest }) => { let clientKey: string | undefined @@ -29,7 +31,7 @@ export const plugin = (userOptions?: Partial<Options>) => { * and saving some cpu consumption when actually skipped */ if (options.skip.length >= 2) - clientKey = await options.generator(request, serverApp.server, rest) + clientKey = await options.generator(request, options.injectServer?.() ?? app.server, rest) // if decided to skip, then do nothing and let the app continue if (await options.skip(request, clientKey) === false) { @@ -39,7 +41,7 @@ export const plugin = (userOptions?: Partial<Options>) => { * then generate one */ if (options.skip.length < 2) - clientKey = await options.generator(request, serverApp.server, rest) + clientKey = await options.generator(request, options.injectServer?.() ?? app.server, rest) const { count, nextReset } = await options.context.increment(clientKey!) @@ -65,8 +67,6 @@ export const plugin = (userOptions?: Partial<Options>) => { builtHeaders['Retry-After'] = String(Math.ceil(options.duration / 1000)) - console.log(options.errorResponse instanceof Response) - if (options.errorResponse instanceof Error) throw options.errorResponse else if (options.errorResponse instanceof Response) { @@ -91,6 +91,10 @@ export const plugin = (userOptions?: Partial<Options>) => { } } + // append headers + for (const [key, value] of Object.entries(builtHeaders)) + set.headers[key] = value + logger('plugin', 'clientKey %s passed through with %d/%d request used (resetting in %d seconds)', clientKey, options.max - payload.remaining, options.max, reset) } }) @@ -98,7 +102,7 @@ export const plugin = (userOptions?: Partial<Options>) => { // @ts-expect-error somehow qi is being sent from elysia, but there's no type declaration for it app.onError({ as: options.scoping }, async ({ set, request, query, path, store, cookie, error, body, params, headers, qi, code, ...rest }) => { if (!options.countFailedRequest) { - const clientKey = await options.generator(request, serverApp.server, rest) + const clientKey = await options.generator(request, options.injectServer?.() ?? app.server, rest) logger('plugin', 'request failed for clientKey: %s, refunding', clientKey) await options.context.decrement(clientKey) From b81b7edc7899efd9192878d35166a5b44860fa63 Mon Sep 17 00:00:00 2001 From: Phumrapee Limpianchop <git@rayriffy.com> Date: Sat, 27 Apr 2024 02:26:41 +0900 Subject: [PATCH 18/19] docs: changeset --- .changeset/brown-needles-yawn.md | 5 +++++ .changeset/large-walls-serve.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/brown-needles-yawn.md create mode 100644 .changeset/large-walls-serve.md diff --git a/.changeset/brown-needles-yawn.md b/.changeset/brown-needles-yawn.md new file mode 100644 index 0000000..849131b --- /dev/null +++ b/.changeset/brown-needles-yawn.md @@ -0,0 +1,5 @@ +--- +"elysia-rate-limit": major +--- + +**BREAKING CHANGES** remove `responseCode`, and `responseMessage` in favor of new `errorResponse` option. please consult with documentation for more details diff --git a/.changeset/large-walls-serve.md b/.changeset/large-walls-serve.md new file mode 100644 index 0000000..76a6845 --- /dev/null +++ b/.changeset/large-walls-serve.md @@ -0,0 +1,5 @@ +--- +"elysia-rate-limit": minor +--- + +added `injectServer` option From 34479d90aff0156d12b660874e4363aa44c9d9d3 Mon Sep 17 00:00:00 2001 From: Phumrapee Limpianchop <git@rayriffy.com> Date: Sat, 27 Apr 2024 02:27:18 +0900 Subject: [PATCH 19/19] fix: redundant typeof check --- src/services/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/plugin.ts b/src/services/plugin.ts index 1bbe768..29bf410 100644 --- a/src/services/plugin.ts +++ b/src/services/plugin.ts @@ -79,7 +79,7 @@ export const plugin = (userOptions?: Partial<Options>) => { return clonedResponse } - else if (typeof options.errorResponse === "string") { + else { // append headers for (const [key, value] of Object.entries(builtHeaders)) set.headers[key] = value