import 'source-map-support/register' require('dotenv').config({ path: '.env' }) import axios from 'axios' import cookieParser from 'cookie-parser' import cors from 'cors' // import compression from 'compression' import { cURL } from 'curly-express' import express, { json, NextFunction, raw, Request, Response, static as serveStatic, urlencoded } from 'express' import listEndpoints from 'express-list-endpoints' import morgan from 'morgan' import path from 'path' import { serializeError } from 'serialize-error' import serverless from 'serverless-http' import { API } from './api' import { Redis } from './service/Cache' import { markdownSafe } from './utils/StringParser' (BigInt.prototype as any).toJSON = function () { return this.toString() } Redis.connect() const curl = cURL({ attach: true }) const app = express() app.set('trust proxy', 1) app.use(cors({ credentials: true, origin: [ /.*/ ] })) // app.use(compression()) app.use(json({ limit: '100mb' })) app.use(urlencoded({ extended: true, limit: '100mb' })) app.use(raw({ limit: '100mb' })) app.use(cookieParser()) if (process.env.ENV !== 'production') { app.use(morgan('tiny')) } app.use(curl) app.get('/ping', (_, res) => res.send({ pong: true })) app.get('/security.txt', (_, res) => { res.setHeader('Content-Type', 'text/plain') res.send('Contact: security@teledriveapp.com\nPreferred-Languages: en, id') }) app.use('/api', API) // error handler app.use(async (err: { status?: number, body?: Record }, req: Request, res: Response, __: NextFunction) => { if (process.env.ENV !== 'production') { console.error(err) } if ((err.status || 500) >= 500) { if (process.env.TG_BOT_TOKEN && (process.env.TG_BOT_ERROR_REPORT_ID || process.env.TG_BOT_OWNER_ID)) { try { await axios.post(`https://api.telegram.org/bot${process.env.TG_BOT_TOKEN}/sendMessage`, { chat_id: process.env.TG_BOT_ERROR_REPORT_ID || process.env.TG_BOT_OWNER_ID, parse_mode: 'Markdown', text: `🔥 *${markdownSafe(err.body.error || (err as any).message || 'Unknown error')}*\n\n\`[${err.status || 500}] ${markdownSafe(req.protocol + '://' + req.get('host') + req.originalUrl)}\`\n\n\`\`\`\n${JSON.stringify(serializeError(err), null, 2)}\n\`\`\`\n\n\`\`\`\n${req['_curl']}\n\`\`\`` }) } catch (error) { if (process.env.ENV !== 'production') { console.error(error) } // ignore } } } return res.status(err.status || 500).send(err.body || { error: 'Something error', details: serializeError(err) }) }) // serve web app.use(serveStatic(path.join(__dirname, '..', '..', 'web', 'build'))) app.use((req: Request, res: Response) => { try { if (req.headers['accept'] !== 'application/json') { return res.sendFile(path.join(__dirname, '..', '..','web', 'build', 'index.html')) } return res.status(404).send({ error: 'Not found' }) } catch (error) { return res.send({ empty: true }) } }) app.listen(process.env.PORT || 4000, () => console.log(`Running at :${process.env.PORT || 4000}...`)) console.log(listEndpoints(app)) module.exports = app module.exports.handler = serverless(app)