mirror of
https://github.com/vernu/textbee.git
synced 2026-04-17 21:40:12 -04:00
83 lines
2.5 KiB
TypeScript
83 lines
2.5 KiB
TypeScript
import 'dotenv/config'
|
|
import * as crypto from 'crypto'
|
|
import { VersioningType, Logger } from '@nestjs/common'
|
|
import { NestFactory } from '@nestjs/core'
|
|
import { AppModule } from './app.module'
|
|
import * as firebase from 'firebase-admin'
|
|
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'
|
|
import * as express from 'express'
|
|
import { NestExpressApplication } from '@nestjs/platform-express'
|
|
|
|
// Ensure crypto is available globally for @nestjs/schedule
|
|
if (typeof globalThis.crypto === 'undefined') {
|
|
globalThis.crypto = crypto as any
|
|
}
|
|
|
|
// Global error handlers to prevent server crashes
|
|
const logger = new Logger('GlobalErrorHandler')
|
|
|
|
process.on('uncaughtException', (error: Error) => {
|
|
logger.error('Uncaught Exception:', error.stack || error.message)
|
|
// Don't exit the process for uncaught exceptions in production
|
|
// process.exit(1)
|
|
})
|
|
|
|
process.on('unhandledRejection', (reason: any, promise: Promise<any>) => {
|
|
logger.error('Unhandled Rejection at:', promise, 'reason:', reason)
|
|
})
|
|
|
|
async function bootstrap() {
|
|
const app: NestExpressApplication = await NestFactory.create(AppModule)
|
|
const PORT = process.env.PORT || 3001
|
|
|
|
app.setGlobalPrefix('api')
|
|
app.enableVersioning({
|
|
defaultVersion: '1',
|
|
type: VersioningType.URI,
|
|
})
|
|
|
|
const config = new DocumentBuilder()
|
|
.setTitle('TextBee API Docs')
|
|
.setDescription('TextBee - Android SMS Gateway API Docs')
|
|
.setVersion('1.0')
|
|
.addBearerAuth()
|
|
.addApiKey({
|
|
type: 'apiKey',
|
|
name: 'x-api-key',
|
|
in: 'header',
|
|
})
|
|
.build()
|
|
const document = SwaggerModule.createDocument(app, config)
|
|
SwaggerModule.setup('', app, document, {
|
|
swaggerOptions: {
|
|
persistAuthorization: true,
|
|
},
|
|
})
|
|
|
|
const firebaseConfig = {
|
|
type: 'service_account',
|
|
projectId: process.env.FIREBASE_PROJECT_ID,
|
|
privateKeyId: process.env.FIREBASE_PRIVATE_KEY_ID,
|
|
privateKey: process.env.FIREBASE_PRIVATE_KEY?.replace(/\\n/g, '\n'),
|
|
clientEmail: process.env.FIREBASE_CLIENT_EMAIL,
|
|
clientId: process.env.FIREBASE_CLIENT_ID,
|
|
authUri: 'https://accounts.google.com/o/oauth2/auth',
|
|
tokenUri: 'https://oauth2.googleapis.com/token',
|
|
authProviderX509CertUrl: 'https://www.googleapis.com/oauth2/v1/certs',
|
|
clientC509CertUrl: process.env.FIREBASE_CLIENT_C509_CERT_URL,
|
|
}
|
|
|
|
firebase.initializeApp({
|
|
credential: firebase.credential.cert(firebaseConfig),
|
|
})
|
|
|
|
app.use(
|
|
'/api/v1/billing/webhook/polar',
|
|
express.raw({ type: 'application/json' }),
|
|
)
|
|
app.useBodyParser('json', { limit: '2mb' });
|
|
app.enableCors()
|
|
await app.listen(PORT)
|
|
}
|
|
bootstrap()
|