From 69d01b5f2dfb0dee66b342b05ec544be8ded52e5 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 6 Sep 2024 21:40:50 +0700 Subject: [PATCH] feat: build / compile, swagger support & cluster mode --- .gitignore | 5 ++++- bun.lockb | Bin 28943 -> 29744 bytes package.json | 5 ++++- src/config.ts | 10 +++++++++- src/index.ts | 30 +++++++++++++++++------------- src/server.ts | 20 ++++++++++++++++++++ 6 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 src/server.ts diff --git a/.gitignore b/.gitignore index c89c4d8..5faed23 100644 --- a/.gitignore +++ b/.gitignore @@ -42,4 +42,7 @@ package-lock.json **/*.bun # env files -.env \ No newline at end of file +.env + +# ignore build +dist/ \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 98ed7205313f5d1d2b9efd86f93fb91fe9ac1af4..68adb4ab362e3b025e3ee8355db387e67f2b669a 100755 GIT binary patch delta 5149 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 Jqi*>w;$L+D_xu0= delta 4606 zcmcIo4RBM(5x#qtY)K$&fx!}Tz(3d+Y=mSZ`47bY zFv0u;%qCE1LIYD02%QvgLm`9-f0F`n(z=#fU}(#qQ9;nMEX_LhX!OBgUS7B~&G0p~1Ty0Cd3V~5bUpq~%y2TTXX08d0P zW)gObmM(!AOHlPc(=ir@@qv2A`U7VHh5c9R_td#|JDgq0v zSFuIKCZO=RR>g@bI#qlQkqHM@07azVDv(w@_}xVE?E;Au5#Eia*QH^WT&$m1>Qz9o zgiiWMD(P@W)JeRU+VnoYiq7eM(!Us)BE8&0rI9|qncBe5&^ho(GDi9I&mcj(R34Qt zosS@s!E21f?~{q?B(fN?c@DK1e9|Euoi}*-Fftl_(h@zD8NJeBJ*_i(xrNSQ?1@M+ znY_kdAxpe?mWyYlFC%H4$*aGCm93zSrhI+2k+E_`dNw3=g`{D~)1Y=CB)?*J7*eSs z-498V5wsX9(5XVc{$fZ<#xD_kU{OeVGbG)ERH95*giREbHiV=PL(MM$NJl#JyLN{dvfKo=Ui7m`W_X=a;4(nldF30YsFOxGNe4uqsHLXsET zw1~JN!m7q&JXb#&tV`#OBm_a5GsrF@=4Sd=abgO(fK&9 z^j;j9ta+_S4kk!6f%wFT1XkKNp&b^fAPJNP;-FC=(F7u4*%*+}j|B<66C|2IF`kKU zmm-W4qiA181i;Fa(T9onc8K;cUL+!%0>YPo%>jw_0IKhQP!Y6$=;N&qc+|^_#oEnP z#|4VWnm}Uw2O!Y|ioR$fj|7P(@EdZf^?#D>J4&kmBd75DKa8~(k@sm{vHpEBRPFkd zRO0PueOX#1|N3Is*9rS-r{>f!VXq`tuSwN$C;pN|YZCn2NL>jswIrCyo#^NNXmz4Y zX^CdKj-HuZNitnP@5LlPkESc=txYmhQL-OLVSBPnImu?ah29`493k^q+73RLZjO-Y zrz6ZXEyd5{Xjh8Nt#k+6MpdaYA4>bc?ZijQJf7;oAEATbIB?TsKAau{PoSgViDVfi z^CW5pPo|ULBgi&d<|(usJeAIYkEFzOnWxc8@KMwSKAJ{l$UL1^XCRUcM3Uj>W5_i| z#u3&AK9;V4J1N&8a~HLPXHqwK78Q<_`8e7R?xvgIxJEc-o=v;JbLb9uE>*c?o=5w@ z^NDB5ynyP#$J0S@FB!9B?xV-RC(u#wLb8mL`9x|4{~nzLpF}pd%!_EbTPCa9On-Fy zc?l(YWIBu98jqisc652tIR*4OO3T@6_$PKc4vauYSKeQOqi^RKzCOBCqDsBKW5W2m zX48#QW!>3`GJ4hToy6F^`@trLaV#jG5^;Qpru9XJh@(TKP8LX<5S8lYdD2g-%9CjF z6zh2Lg_;Kvr_g9nItWLha$1S65w4!%UdxQ2CXo0>mxHE)D(J;26>c%7c)0^4&Ni_> zTp)3d31`I1g(Kp)a)UgeY_gU6O|SSNqD?3l?&yml_M?5}+g!qT6G%8B91@Q82jQ9` zN(YAP3vSZNC0JaTnT6I&tuf=I7uREkABbhp^{H~Ia7nmU1QNet2?+Nb1(%5^M608Q ziWcgrDC37HyE2QPriGO@eu>&^Y`mL(UfGRxZL7-SQ|Wk>&0Y`R;7VZV;1tX1|xxnF`F!32(XzFBP8 zUOXeL-w#a;G*8uL=uBw<7*)iIPncs&VK?aJ7CU1B;RyRMWcR5__3Z1OB zNw+1sRBg5QiwM>%yT4rG)SVr=IQ)VHimtJ_bD+0kn$l>tr84#4a&;OwSP6|N%htVf zH0I+=SJw!QSVG2{X=aU0IuSwd)-*{gbmXYDdbE5HE-VSRD=;i4)UP*=Zv588ATIsse?tJUR?l}!%)0GD5nQo2O zYF%^Or0$(>JoVeK!5#x8$kuqRI9~MV?)!ggKUx?z=rT~PJSq7o@)#cnlyt%3_44I+ zUf!R1JXbNyb+|H>#fYWf$$Gn1(Ee@flb`SM-98q!sin_kn@1~vJySXl@7nU~ABFY3 zu8}hP`Y7_&Sv^`!y;k?j`Hhymmhhv!u95QSnJC&&XN}kDbnD%_uIlridErNUqUc1O z)vXowAOEDO*tPZI$*@7Mi=@n*M&^2(UHex7<@Y2n*tlbD_(`!yHfgSbzF%*R*Z$K` z?frdv{3Djv!e*Ncw7K5u(f&2DzqonkTGE2D44N0qNA|! Hv)KOvsT@VT diff --git a/package.json b/package.json index 7760842..5660d0a 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,15 @@ "version": "1.0.50", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "bun run --watch src/index.ts", + "dev": "bun run --watch src/server.ts", + "build": "bun build --minify --target bun --outdir dist src/index.ts", + "compile": "bun build --compile --minify --target bun --outfile server src/index.ts", "makemigrations": "npx drizzle-kit generate", "migrate": "npx drizzle-kit migrate" }, "dependencies": { "@elysiajs/static": "^1.1.1", + "@elysiajs/swagger": "^1.1.1", "drizzle-orm": "^0.33.0", "elysia": "latest", "postgres": "^3.4.4" diff --git a/src/config.ts b/src/config.ts index 3510e73..92b9747 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,6 +1,14 @@ +import os from "node:os"; + export const APP_PORT = parseInt(process.env.APP_PORT || "3000") +export const APP_WORKERS = parseInt(process.env.APP_WORKERS || os.availableParallelism().toString()); + +// Database configuration export const DB_HOST = process.env.DB_HOST export const DB_PORT = parseInt(process.env.DB_PORT || "5432") export const DB_USER = process.env.DB_USER export const DB_PASSWORD = process.env.DB_PASSWORD -export const DB_NAME = process.env.DB_NAME \ No newline at end of file +export const DB_NAME = process.env.DB_NAME + +// Swagger configuration +export const SWAGGER_PATH = "/documents" \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 5eaa927..e81e31d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,15 +1,19 @@ -import { Elysia } from "elysia"; -import exampleApp from "./example_app/routers"; -import { APP_PORT } from "./config"; -import staticPlugin from "@elysiajs/static"; +import cluster from "node:cluster"; +import process from "node:process"; +import { APP_WORKERS } from "./config"; -const app = new Elysia() - // static plugin - // more information: https://elysiajs.com/plugins/static - .use(staticPlugin()) - .use(exampleApp) - .listen(APP_PORT); +if (cluster.isPrimary) { + console.log(`Primary ${process.pid} is running`); + + for (let i = 0; i < APP_WORKERS; i++) { + cluster.fork(); + } -console.log( - `🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}` -); + cluster.on("exit", (worker) => { + console.log(`worker ${worker.process.pid} died`); + process.exit(1); + }); +} else { + await import("./server"); + console.log(`Worker ${process.pid} started`); +} \ No newline at end of file diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..6b338b0 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,20 @@ +import { Elysia } from "elysia"; +import staticPlugin from "@elysiajs/static"; +import { swagger } from '@elysiajs/swagger' +import { APP_PORT, SWAGGER_PATH } from "./config"; +import exampleApp from "./example_app/routers"; + +const app = new Elysia() + // static plugin + // more information: https://elysiajs.com/plugins/static + .use(staticPlugin()) + // swagger plugin + .use(swagger({ + path: SWAGGER_PATH + })) + .use(exampleApp) + .listen(APP_PORT); + +console.log( + `🦊 Elysia is running at ${app.server?.hostname}:${app.server?.port}` +);