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) => { 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()