siputzx commited on
Commit
01f9943
·
verified ·
1 Parent(s): abc92ad

Update app.js

Browse files
Files changed (1) hide show
  1. app.js +50 -104
app.js CHANGED
@@ -4,37 +4,21 @@ import cors from 'cors';
4
  import dotenv from 'dotenv';
5
  import os from 'os';
6
  import sharp from 'sharp';
7
- import cluster from 'cluster';
8
- import { cpus } from 'os';
9
 
10
  dotenv.config();
11
 
12
  const config = {
13
  maxTextLength: 100,
14
  viewport: { width: 1920, height: 1080 },
15
- userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
16
- concurrentBrowsers: cpus().length // Gunakan jumlah core CPU
17
  };
18
 
19
- class BratGeneratorService {
20
- constructor() {
21
- this.browsers = [];
22
- this.pages = [];
23
- this.isInitialized = false;
24
- }
25
 
 
26
  async initialize() {
27
- if (this.isInitialized) return;
28
-
29
- const launchPromises = Array.from({ length: config.concurrentBrowsers }, async () => {
30
- const browser = await chromium.launch({
31
- headless: true,
32
- args: [
33
- '--no-sandbox',
34
- '--disable-setuid-sandbox',
35
- '--disable-dev-shm-usage'
36
- ]
37
- });
38
  const context = await browser.newContext({
39
  viewport: config.viewport,
40
  userAgent: config.userAgent
@@ -48,118 +32,80 @@ class BratGeneratorService {
48
  route.continue();
49
  });
50
 
51
- const page = await context.newPage();
52
- await page.goto('https://www.bratgenerator.com/', {
53
- waitUntil: 'domcontentloaded',
54
- timeout: 5000
55
- });
56
 
57
  try {
58
  await page.click('#onetrust-accept-btn-handler', { timeout: 2000 });
59
  } catch { }
60
 
61
  await page.evaluate(() => setupTheme('white'));
62
-
63
- this.browsers.push(browser);
64
- this.pages.push(page);
65
- });
66
-
67
- await Promise.all(launchPromises);
68
- this.isInitialized = true;
69
- }
70
-
71
- async generateBrat(text, pageIndex = 0) {
72
- if (!this.pages[pageIndex]) {
73
- pageIndex = 0; // Reset jika index tidak valid
74
  }
 
75
 
76
- const page = this.pages[pageIndex];
77
  await page.fill('#textInput', text);
78
  const overlay = page.locator('#textOverlay');
79
-
80
  const pngBuffer = await overlay.screenshot({
81
  timeout: 3000,
82
  type: 'png'
83
  });
84
 
 
85
  return sharp(pngBuffer)
86
  .webp({ quality: 80 })
87
  .toBuffer();
88
- }
89
 
90
  async close() {
91
- const closePromises = this.browsers.map(browser => browser.close());
92
- await Promise.all(closePromises);
93
- this.browsers = [];
94
- this.pages = [];
95
- this.isInitialized = false;
96
  }
97
- }
98
-
99
- const bratService = new BratGeneratorService();
100
 
101
- async function startServer() {
102
- const app = express();
103
- app.use(express.json());
104
- app.use(cors());
105
 
106
- // Middleware untuk membatasi panjang teks
107
- const validateTextLength = (req, res, next) => {
108
  const { q } = req.query;
109
- if (!q || q.length > config.maxTextLength) {
110
- return res.status(400).json({
111
- status: false,
112
- message: `Teks harus diisi dan maksimal ${config.maxTextLength} karakter`
113
- });
114
- }
115
- next();
116
- };
117
-
118
- app.get('*', validateTextLength, async (req, res) => {
119
- try {
120
- const { q } = req.query;
121
- const pageIndex = Math.floor(Math.random() * config.concurrentBrowsers);
122
-
123
- const imageBuffer = await bratService.generateBrat(q, pageIndex);
124
- res.set('Content-Type', 'image/webp');
125
- res.send(imageBuffer);
126
- } catch (error) {
127
- console.error(error);
128
- res.status(500).json({
129
- status: false,
130
- message: 'Error generating image',
131
- error: process.env.NODE_ENV === 'development' ? error.message : undefined
132
  });
133
  }
134
- });
135
-
136
- const PORT = process.env.PORT || 7860;
137
- await bratService.initialize();
138
-
139
- app.listen(PORT, () => {
140
- console.log(`Server running on port ${PORT}`);
141
- console.log(`Worker PID: ${process.pid}`);
142
- });
143
- }
144
-
145
- // Gunakan cluster untuk scaling
146
- if (cluster.isPrimary) {
147
- console.log(`Primary ${process.pid} is running`);
148
-
149
- // Fork workers.
150
- for (let i = 0; i < cpus().length; i++) {
151
- cluster.fork();
152
  }
 
 
 
153
 
154
- cluster.on('exit', (worker, code, signal) => {
155
- console.log(`worker ${worker.process.pid} died`);
156
- cluster.fork(); // Restart worker
157
- });
158
- } else {
159
- startServer().catch(console.error);
160
- }
161
 
162
  process.on('SIGINT', async () => {
163
- await bratService.close();
164
  process.exit(0);
165
  });
 
4
  import dotenv from 'dotenv';
5
  import os from 'os';
6
  import sharp from 'sharp';
 
 
7
 
8
  dotenv.config();
9
 
10
  const config = {
11
  maxTextLength: 100,
12
  viewport: { width: 1920, height: 1080 },
13
+ userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
 
14
  };
15
 
16
+ let browser, page;
 
 
 
 
 
17
 
18
+ const utils = {
19
  async initialize() {
20
+ if (!browser) {
21
+ browser = await chromium.launch({ headless: true });
 
 
 
 
 
 
 
 
 
22
  const context = await browser.newContext({
23
  viewport: config.viewport,
24
  userAgent: config.userAgent
 
32
  route.continue();
33
  });
34
 
35
+ page = await context.newPage();
36
+ await page.goto('https://www.bratgenerator.com/', { waitUntil: 'domcontentloaded', timeout: 10000 });
 
 
 
37
 
38
  try {
39
  await page.click('#onetrust-accept-btn-handler', { timeout: 2000 });
40
  } catch { }
41
 
42
  await page.evaluate(() => setupTheme('white'));
 
 
 
 
 
 
 
 
 
 
 
 
43
  }
44
+ },
45
 
46
+ async generateBrat(text) {
47
  await page.fill('#textInput', text);
48
  const overlay = page.locator('#textOverlay');
49
+ // Ambil screenshot dalam format PNG
50
  const pngBuffer = await overlay.screenshot({
51
  timeout: 3000,
52
  type: 'png'
53
  });
54
 
55
+ // Konversi ke WebP menggunakan sharp
56
  return sharp(pngBuffer)
57
  .webp({ quality: 80 })
58
  .toBuffer();
59
+ },
60
 
61
  async close() {
62
+ if (browser) await browser.close();
 
 
 
 
63
  }
64
+ };
 
 
65
 
66
+ const app = express();
67
+ app.use(express.json());
68
+ app.use(cors());
 
69
 
70
+ app.get('*', async (req, res) => {
71
+ try {
72
  const { q } = req.query;
73
+ if (!q) {
74
+ return res.json({
75
+ name: 'HD Bart Generator API',
76
+ message: 'Parameter q di perlukan',
77
+ version: '2.1.0',
78
+ runtime: {
79
+ os: os.type(),
80
+ platform: os.platform(),
81
+ architecture: os.arch(),
82
+ cpuCount: os.cpus().length,
83
+ uptime: `${os.uptime()} seconds`,
84
+ memoryUsage: `${Math.round((os.totalmem() - os.freemem()) / 1024 / 1024)} MB used of ${Math.round(os.totalmem() / 1024 / 1024)} MB`
85
+ }
 
 
 
 
 
 
 
 
 
 
86
  });
87
  }
88
+ const imageBuffer = await utils.generateBrat(q);
89
+ res.set('Content-Type', 'image/webp');
90
+ res.send(imageBuffer);
91
+ } catch (error) {
92
+ console.error(error);
93
+ res.status(500).json({
94
+ status: false,
95
+ message: 'Error generating image',
96
+ error: process.env.NODE_ENV === 'development' ? error.message : undefined
97
+ });
 
 
 
 
 
 
 
 
98
  }
99
+ });
100
+
101
+ const PORT = process.env.PORT || 7860;
102
 
103
+ app.listen(PORT, async () => {
104
+ console.log(`Server running on port ${PORT}`);
105
+ await utils.initialize();
106
+ });
 
 
 
107
 
108
  process.on('SIGINT', async () => {
109
+ await utils.close();
110
  process.exit(0);
111
  });