const express = require('express'); const session = require('express-session'); const connectDb = require('../lib/db/connectDb'); const indexSync = require('../lib/db/indexSync'); const path = require('path'); const cors = require('cors'); const routes = require('./routes'); const errorController = require('./controllers/ErrorController'); const passport = require('passport'); const port = process.env.PORT || 3080; const host = process.env.HOST || 'localhost'; const projectPath = path.join(__dirname, '..', '..', 'client'); const { jwtLogin, passportLogin, googleLogin, githubLogin, discordLogin, facebookLogin, setupOpenId, } = require('../strategies'); // Init the config and validate it const config = require('../../config/loader'); config.validate(); // Validate the config (async () => { await connectDb(); console.log('Connected to MongoDB'); await indexSync(); const app = express(); app.use(errorController); app.use(express.json({ limit: '3mb' })); app.use(express.urlencoded({ extended: true, limit: '3mb' })); app.use(express.static(path.join(projectPath, 'dist'))); app.use(express.static(path.join(projectPath, 'public'))); app.set('trust proxy', 1); // trust first proxy app.use(cors()); if (!process.env.ALLOW_SOCIAL_LOGIN) { console.warn( 'Social logins are disabled. Set Envrionment Variable "ALLOW_SOCIAL_LOGIN" to true to enable them.', ); } // OAUTH app.use(passport.initialize()); passport.use(await jwtLogin()); passport.use(await passportLogin()); if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) { passport.use(await googleLogin()); } if (process.env.FACEBOOK_CLIENT_ID && process.env.FACEBOOK_CLIENT_SECRET) { passport.use(await facebookLogin()); } if (process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET) { passport.use(await githubLogin()); } if (process.env.DISCORD_CLIENT_ID && process.env.DISCORD_CLIENT_SECRET) { passport.use(await discordLogin()); } if ( process.env.OPENID_CLIENT_ID && process.env.OPENID_CLIENT_SECRET && process.env.OPENID_ISSUER && process.env.OPENID_SCOPE && process.env.OPENID_SESSION_SECRET ) { app.use( session({ secret: process.env.OPENID_SESSION_SECRET, resave: false, saveUninitialized: false, }), ); app.use(passport.session()); await setupOpenId(); } app.use('/oauth', routes.oauth); // api endpoint app.use('/api/auth', routes.auth); app.use('/api/user', routes.user); app.use('/api/search', routes.search); app.use('/api/ask', routes.ask); app.use('/api/messages', routes.messages); app.use('/api/convos', routes.convos); app.use('/api/presets', routes.presets); app.use('/api/prompts', routes.prompts); app.use('/api/tokenizer', routes.tokenizer); app.use('/api/endpoints', routes.endpoints); app.use('/api/plugins', routes.plugins); app.use('/api/config', routes.config); // static files app.get('/*', function (req, res) { res.sendFile(path.join(projectPath, 'dist', 'index.html')); }); app.listen(port, host, () => { if (host == '0.0.0.0') { console.log( `Server listening on all interface at port ${port}. Use http://localhost:${port} to access it`, ); } else { console.log(`Server listening at http://${host == '0.0.0.0' ? 'localhost' : host}:${port}`); } }); })(); let messageCount = 0; process.on('uncaughtException', (err) => { if (!err.message.includes('fetch failed')) { console.error('There was an uncaught error:'); console.error(err); } if (err.message.includes('fetch failed')) { if (messageCount === 0) { console.error('Meilisearch error, search will be disabled'); messageCount++; } } else { process.exit(1); } });