@@ -659,27 +659,23 @@ <h4>API Gateway for Microservices</h4>
659659 load balancing, JWT auth, and per-route rate limiting — all from
660660 a single config file.
661661 </ p >
662- < div class ="use-code ">
663- < span class ="kw "> const</ span > gateway =
664- < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
665- server: { port: < span class ="num "> 8080</ span > }, cluster: {
666- enabled: < span class ="kw "> true</ span > , workers:
667- < span class ="num "> 4</ span > }, auth: { secret: process.env.< span
668- class ="fn "
669- > JWT_SECRET</ span
670- >
671- }, cors: { origin: [< span class ="str "> 'https://myapp.com'</ span
672- > ] }, }) gateway.< span class ="fn "> addRoute</ span > ({ pattern:
673- < span class ="str "> '/users/*'</ span > , target:
674- < span class ="str "> 'http://user-svc:3001'</ span > , rateLimit: {
675- max: < span class ="num "> 100</ span > , windowMs:
676- < span class ="num "> 60000</ span > }, }) gateway.< span class ="fn "
677- > addRoute</ span
678- > ({ pattern: < span class ="str "> '/payments/*'</ span > , target:
679- < span class ="str "> 'http://pay-svc:3002'</ span > , circuitBreaker:
680- { enabled: < span class ="kw "> true</ span > , failureThreshold:
681- < span class ="num "> 3</ span > }, })
682- </ div >
662+ <!-- prettier-ignore -->
663+ < div class ="use-code "> < span class ="kw "> const</ span > gateway = < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
664+ server: { port: < span class ="num "> 8080</ span > },
665+ cluster: { enabled: < span class ="kw "> true</ span > , workers: < span class ="num "> 4</ span > },
666+ auth: { secret: process.env.< span class ="fn "> JWT_SECRET</ span > },
667+ cors: { origin: [< span class ="str "> 'https://myapp.com'</ span > ] },
668+ })
669+ gateway.< span class ="fn "> addRoute</ span > ({
670+ pattern: < span class ="str "> '/users/*'</ span > ,
671+ target: < span class ="str "> 'http://user-svc:3001'</ span > ,
672+ rateLimit: { max: < span class ="num "> 100</ span > , windowMs: < span class ="num "> 60000</ span > },
673+ })
674+ gateway.< span class ="fn "> addRoute</ span > ({
675+ pattern: < span class ="str "> '/payments/*'</ span > ,
676+ target: < span class ="str "> 'http://pay-svc:3002'</ span > ,
677+ circuitBreaker: { enabled: < span class ="kw "> true</ span > , failureThreshold: < span class ="num "> 3</ span > },
678+ })</ div >
683679 </ div >
684680 </ div >
685681 < div class ="use-slide ">
@@ -694,21 +690,20 @@ <h4>Intelligent Load Balancer with Health Checks</h4>
694690 Automatic health checks detect unhealthy targets and reroute
695691 traffic without dropping requests.
696692 </ p >
697- < div class ="use-code ">
698- gateway.< span class ="fn "> addRoute</ span > ({ pattern:
699- < span class ="str "> '/api/*'</ span > , loadBalancer: { strategy:
700- < span class ="str "> 'least-connections'</ span > , targets: [ { url:
701- < span class ="str "> 'http://api1:3000'</ span > , weight:
702- < span class ="num "> 3</ span > }, { url:
703- < span class ="str "> 'http://api2:3000'</ span > , weight:
704- < span class ="num "> 2</ span > }, { url:
705- < span class ="str "> 'http://api3:3000'</ span > , weight:
706- < span class ="num "> 1</ span > }, ], healthCheck: { enabled:
707- < span class ="kw "> true</ span > , interval:
708- < span class ="num "> 15000</ span > , path:
709- < span class ="str "> '/health'</ span > }, stickySession: { enabled:
710- < span class ="kw "> true</ span > }, }, })
711- </ div >
693+ <!-- prettier-ignore -->
694+ < div class ="use-code "> gateway.< span class ="fn "> addRoute</ span > ({
695+ pattern: < span class ="str "> '/api/*'</ span > ,
696+ loadBalancer: {
697+ strategy: < span class ="str "> 'least-connections'</ span > ,
698+ targets: [
699+ { url: < span class ="str "> 'http://api1:3000'</ span > , weight: < span class ="num "> 3</ span > },
700+ { url: < span class ="str "> 'http://api2:3000'</ span > , weight: < span class ="num "> 2</ span > },
701+ { url: < span class ="str "> 'http://api3:3000'</ span > , weight: < span class ="num "> 1</ span > },
702+ ],
703+ healthCheck: { enabled: < span class ="kw "> true</ span > , interval: < span class ="num "> 15000</ span > , path: < span class ="str "> '/health'</ span > },
704+ stickySession: { enabled: < span class ="kw "> true</ span > },
705+ },
706+ })</ div >
712707 </ div >
713708 </ div >
714709 < div class ="use-slide ">
@@ -723,17 +718,20 @@ <h4>TLS Termination with Auto HTTP→HTTPS Redirect</h4>
723718 loading, strong cipher suites, and seamless HTTP-to-HTTPS
724719 redirection. Zero config beyond pointing at your cert files.
725720 </ p >
726- < div class ="use-code ">
727- < span class ="kw "> const</ span > gateway =
728- < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
729- server: { port: < span class ="num "> 443</ span > }, security: { tls:
730- { enabled: < span class ="kw "> true</ span > , cert:
731- < span class ="str "> './cert.pem'</ span > , key:
732- < span class ="str "> './key.pem'</ span > , minVersion:
733- < span class ="str "> 'TLSv1.3'</ span > , redirectHTTP:
734- < span class ="kw "> true</ span > , redirectPort:
735- < span class ="num "> 80</ span > , }, }, })
736- </ div >
721+ <!-- prettier-ignore -->
722+ < div class ="use-code "> < span class ="kw "> const</ span > gateway = < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
723+ server: { port: < span class ="num "> 443</ span > },
724+ security: {
725+ tls: {
726+ enabled: < span class ="kw "> true</ span > ,
727+ cert: < span class ="str "> './cert.pem'</ span > ,
728+ key: < span class ="str "> './key.pem'</ span > ,
729+ minVersion: < span class ="str "> 'TLSv1.3'</ span > ,
730+ redirectHTTP: < span class ="kw "> true</ span > ,
731+ redirectPort: < span class ="num "> 80</ span > ,
732+ },
733+ },
734+ })</ div >
737735 </ div >
738736 </ div >
739737 < div class ="use-slide ">
@@ -748,23 +746,19 @@ <h4>Multi-Process Cluster with Zero-Downtime Restarts</h4>
748746 replacements before stopping old workers — zero dropped
749747 connections during deployments.
750748 </ p >
751- < div class ="use-code ">
752- < span class ="kw "> const</ span > gateway =
753- < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
754- server: { port: < span class ="num "> 3000</ span > }, cluster: {
755- enabled: < span class ="kw "> true</ span > , workers:
756- < span class ="num "> 8</ span > , restartWorkers:
757- < span class ="kw "> true</ span > , shutdownTimeout:
758- < span class ="num "> 30000</ span > , maxRestarts:
759- < span class ="num "> 10</ span > , }, })
760- < span class ="cmt "
761- > // Scale at runtime: kill -s SIGUSR2 <pid> → rolling
762- restart</ span
763- >
764- < span class ="cmt "
765- > // Increase workers: gateway.cluster.scaleTo(12)</ span
766- >
767- </ div >
749+ <!-- prettier-ignore -->
750+ < div class ="use-code "> < span class ="kw "> const</ span > gateway = < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
751+ server: { port: < span class ="num "> 3000</ span > },
752+ cluster: {
753+ enabled: < span class ="kw "> true</ span > ,
754+ workers: < span class ="num "> 8</ span > ,
755+ restartWorkers: < span class ="kw "> true</ span > ,
756+ shutdownTimeout: < span class ="num "> 30000</ span > ,
757+ maxRestarts: < span class ="num "> 10</ span > ,
758+ },
759+ })
760+ < span class ="cmt "> // Scale at runtime: kill -s SIGUSR2 <pid> → rolling restart</ span >
761+ < span class ="cmt "> // Increase workers: gateway.cluster.scaleTo(12)</ span > </ div >
768762 </ div >
769763 </ div >
770764 < div class ="use-slide ">
@@ -779,23 +773,20 @@ <h4>Secure Edge Proxy with Defense-in-Depth</h4>
779773 JWT verification, and security headers — before reaching your
780774 backend. OWASP Top 10 covered by default.
781775 </ p >
782- < div class ="use-code ">
783- < span class ="kw "> const</ span > gateway =
784- < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
785- security: { tls: { enabled: < span class ="kw "> true</ span > , cert:
786- < span class ="str "> './cert.pem'</ span > , key:
787- < span class ="str "> './key.pem'</ span > }, jwtKeyRotation: {
788- secrets: [{ key: process.env.< span class ="fn "> JWT_NEW</ span > ,
789- kid: < span class ="str "> '2025-05'</ span > , primary:
790- < span class ="kw "> true</ span > }], jwksUri:
791- < span class ="str "
792- > 'https://auth.example.com/.well-known/jwks.json'</ span
793- > , }, inputValidation: { blockedPatterns: [< span class ="str "
794- > /\.\./</ span
795- > , < span class ="str "> /%00/</ span > ,
796- < span class ="str "> /<script>/i</ span > ], }, securityHeaders:
797- { enabled: < span class ="kw "> true</ span > }, }, })
798- </ div >
776+ <!-- prettier-ignore -->
777+ < div class ="use-code "> < span class ="kw "> const</ span > gateway = < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
778+ security: {
779+ tls: { enabled: < span class ="kw "> true</ span > , cert: < span class ="str "> './cert.pem'</ span > , key: < span class ="str "> './key.pem'</ span > },
780+ jwtKeyRotation: {
781+ secrets: [{ key: process.env.< span class ="fn "> JWT_NEW</ span > , kid: < span class ="str "> '2025-05'</ span > , primary: < span class ="kw "> true</ span > }],
782+ jwksUri: < span class ="str "> 'https://auth.example.com/.well-known/jwks.json'</ span > ,
783+ },
784+ inputValidation: {
785+ blockedPatterns: [< span class ="str "> /\.\./</ span > , < span class ="str "> /%00/</ span > , < span class ="str "> /<script>/i</ span > ],
786+ },
787+ securityHeaders: { enabled: < span class ="kw "> true</ span > },
788+ },
789+ })</ div >
799790 </ div >
800791 </ div >
801792 </ div >
@@ -1159,6 +1150,7 @@ <h2 class="section-title">Production-ready in seconds</h2>
11591150 </ div >
11601151
11611152 < div class ="install-box " style ="margin-top: 24px ">
1153+ <!-- prettier-ignore -->
11621154 < div
11631155 class ="prompt "
11641156 style ="
@@ -1168,36 +1160,30 @@ <h2 class="section-title">Production-ready in seconds</h2>
11681160 white-space: pre;
11691161 line-height: 1.7;
11701162 "
1171- >
1172- < span class ="cmt "
1173- > // gateway.ts — production-ready in one file</ span
1174- >
1175- < span class ="kw "> import</ span > { BunGateway }
1176- < span class ="kw "> from</ span > < span class ="str "> 'bungate'</ span >
1163+ > < span class ="cmt "> // gateway.ts — production-ready in one file</ span >
1164+ < span class ="kw "> import</ span > { BunGateway } < span class ="kw "> from</ span > < span class ="str "> 'bungate'</ span >
11771165
1178- < span class ="kw "> const</ span > gateway = < span class ="kw "> new</ span >
1179- < span class ="fn "> BunGateway</ span > ({ server: { port:
1180- < span class ="num "> 3000</ span > }, cluster: { enabled:
1181- < span class ="kw "> true</ span > , workers: < span class ="num "> 4</ span > },
1182- auth: { secret: process.env.< span class ="fn "> JWT_SECRET</ span > },
1183- metrics: { enabled: < span class ="kw "> true</ span > }, }) gateway.< span
1184- class ="fn "
1185- > addRoute</ span
1186- > ({ pattern: < span class ="str "> '/api/*'</ span > , loadBalancer: {
1187- strategy: < span class ="str "> 'least-connections'</ span > , targets: [ {
1188- url: < span class ="str "> 'http://api1.example.com'</ span > }, { url:
1189- < span class ="str "> 'http://api2.example.com'</ span > }, ],
1190- healthCheck: { enabled: < span class ="kw "> true</ span > , interval:
1191- < span class ="num "> 15000</ span > , path:
1192- < span class ="str "> '/health'</ span > }, }, circuitBreaker: { enabled:
1193- < span class ="kw "> true</ span > , failureThreshold:
1194- < span class ="num "> 5</ span > }, })
1166+ < span class ="kw "> const</ span > gateway = < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
1167+ server: { port: < span class ="num "> 3000</ span > },
1168+ cluster: { enabled: < span class ="kw "> true</ span > , workers: < span class ="num "> 4</ span > },
1169+ auth: { secret: process.env.< span class ="fn "> JWT_SECRET</ span > },
1170+ metrics: { enabled: < span class ="kw "> true</ span > },
1171+ })
1172+ gateway.< span class ="fn "> addRoute</ span > ({
1173+ pattern: < span class ="str "> '/api/*'</ span > ,
1174+ loadBalancer: {
1175+ strategy: < span class ="str "> 'least-connections'</ span > ,
1176+ targets: [
1177+ { url: < span class ="str "> 'http://api1.example.com'</ span > },
1178+ { url: < span class ="str "> 'http://api2.example.com'</ span > },
1179+ ],
1180+ healthCheck: { enabled: < span class ="kw "> true</ span > , interval: < span class ="num "> 15000</ span > , path: < span class ="str "> '/health'</ span > },
1181+ },
1182+ circuitBreaker: { enabled: < span class ="kw "> true</ span > , failureThreshold: < span class ="num "> 5</ span > },
1183+ })
11951184
1196- < span class ="kw "> await</ span > gateway.< span class ="fn "> listen</ span
1197- > () console.< span class ="fn "> log</ span > (< span class ="str "
1198- > '🚀 Bungate cluster running on :3000'</ span
1199- > )
1200- </ div >
1185+ < span class ="kw "> await</ span > gateway.< span class ="fn "> listen</ span > ()
1186+ console.< span class ="fn "> log</ span > (< span class ="str "> '🚀 Bungate cluster running on :3000'</ span > )</ div >
12011187 </ div >
12021188 </ div >
12031189 </ section >
@@ -1226,6 +1212,7 @@ <h2 class="section-title">Battle-tested security defaults</h2>
12261212 </ div >
12271213
12281214 < div class ="install-box " style ="margin-top: 32px ">
1215+ <!-- prettier-ignore -->
12291216 < div
12301217 class ="prompt "
12311218 style ="
@@ -1235,33 +1222,32 @@ <h2 class="section-title">Battle-tested security defaults</h2>
12351222 white-space: pre;
12361223 line-height: 1.7;
12371224 "
1238- >
1239- < span class ="cmt "
1240- > // TLS 1.3 + JWT key rotation — zero-downtime</ span
1241- >
1242- < span class ="kw "> const</ span > gateway = < span class ="kw "> new</ span >
1243- < span class ="fn "> BunGateway</ span > ({ security: { tls: { enabled:
1244- < span class ="kw "> true</ span > , cert:
1245- < span class ="str "> './cert.pem'</ span > , key:
1246- < span class ="str "> './key.pem'</ span > , minVersion:
1247- < span class ="str "> 'TLSv1.3'</ span > , cipherSuites: [< span class ="str "
1248- > 'TLS_AES_256_GCM_SHA384'</ span
1249- > , < span class ="str "> 'TLS_CHACHA20_POLY1305_SHA256'</ span > ],
1250- redirectHTTP: < span class ="kw "> true</ span > , }, jwtKeyRotation: {
1251- secrets: [ { key: process.env.< span class ="fn "> JWT_NEW</ span > , kid:
1252- < span class ="str "> '2025-05'</ span > , primary:
1253- < span class ="kw "> true</ span > }, { key: process.env.< span class ="fn "
1254- > JWT_OLD</ span
1255- > , kid: < span class ="str "> '2025-04'</ span > , deprecated:
1256- < span class ="kw "> true</ span > }, ], jwksUri:
1257- < span class ="str "
1258- > 'https://auth.example.com/.well-known/jwks.json'</ span
1259- > , jwksRefreshInterval: < span class ="num "> 3600000</ span > , },
1260- inputValidation: { maxPathLength: < span class ="num "> 2048</ span > ,
1261- maxHeaderSize: < span class ="num "> 16384</ span > , blockedPatterns:
1262- [< span class ="str "> /\\.\\./</ span > , < span class ="str "> /%00/</ span > ,
1263- < span class ="str "> /<script>/i</ span > ], }, }, })
1264- </ div >
1225+ > < span class ="cmt "> // TLS 1.3 + JWT key rotation — zero-downtime</ span >
1226+ < span class ="kw "> const</ span > gateway = < span class ="kw "> new</ span > < span class ="fn "> BunGateway</ span > ({
1227+ security: {
1228+ tls: {
1229+ enabled: < span class ="kw "> true</ span > ,
1230+ cert: < span class ="str "> './cert.pem'</ span > ,
1231+ key: < span class ="str "> './key.pem'</ span > ,
1232+ minVersion: < span class ="str "> 'TLSv1.3'</ span > ,
1233+ cipherSuites: [< span class ="str "> 'TLS_AES_256_GCM_SHA384'</ span > , < span class ="str "> 'TLS_CHACHA20_POLY1305_SHA256'</ span > ],
1234+ redirectHTTP: < span class ="kw "> true</ span > ,
1235+ },
1236+ jwtKeyRotation: {
1237+ secrets: [
1238+ { key: process.env.< span class ="fn "> JWT_NEW</ span > , kid: < span class ="str "> '2025-05'</ span > , primary: < span class ="kw "> true</ span > },
1239+ { key: process.env.< span class ="fn "> JWT_OLD</ span > , kid: < span class ="str "> '2025-04'</ span > , deprecated: < span class ="kw "> true</ span > },
1240+ ],
1241+ jwksUri: < span class ="str "> 'https://auth.example.com/.well-known/jwks.json'</ span > ,
1242+ jwksRefreshInterval: < span class ="num "> 3600000</ span > ,
1243+ },
1244+ inputValidation: {
1245+ maxPathLength: < span class ="num "> 2048</ span > ,
1246+ maxHeaderSize: < span class ="num "> 16384</ span > ,
1247+ blockedPatterns: [< span class ="str "> /\.\./</ span > , < span class ="str "> /%00/</ span > , < span class ="str "> /<script>/i</ span > ],
1248+ },
1249+ },
1250+ })</ div >
12651251 </ div >
12661252 </ div >
12671253 </ section >
0 commit comments