UNPKG

mongodb-chatbot-server

Version:

A chatbot server for retrieval augmented generation (RAG).

133 lines 5.05 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeApp = exports.DEFAULT_MAX_REQUEST_TIMEOUT_MS = exports.DEFAULT_API_PREFIX = exports.makeHandleTimeoutMiddleware = exports.reqHandler = exports.errorHandler = void 0; const express_1 = __importDefault(require("express")); const cors_1 = __importDefault(require("cors")); require("dotenv/config"); const conversationsRouter_1 = require("./routes/conversations/conversationsRouter"); const mongodb_rag_core_1 = require("mongodb-rag-core"); const mongodb_1 = require("mongodb-rag-core/mongodb"); const utils_1 = require("./utils"); const lodash_clonedeep_1 = __importDefault(require("lodash.clonedeep")); const braintrust_1 = require("mongodb-rag-core/braintrust"); /** General error handler. Called at usage of `next()` in routes. */ const errorHandler = (err, req, res, _next) => { const reqId = (0, utils_1.getRequestId)(req); const httpStatus = err.status || 500; const errorMessage = err.message || "Internal Server Error"; if (!res.headersSent) { return (0, utils_1.sendErrorResponse)({ reqId, res, httpStatus, errorMessage, }); } else { (0, utils_1.logRequest)({ reqId, type: "error", message: JSON.stringify(err), }); } }; exports.errorHandler = errorHandler; const reqHandler = (req, _res, next) => { const reqId = new mongodb_1.ObjectId().toString(); // Custom header specifically for a request ID. This ID will be used to track // logs related to the same request req.headers["req-id"] = reqId; const message = `Request for: ${req.url}`; (0, utils_1.logRequest)({ reqId, message }); next(); }; exports.reqHandler = reqHandler; const makeHandleTimeoutMiddleware = (apiTimeout) => { return (req, res, next) => { // Set the server response timeout for all HTTP responses res.setTimeout(apiTimeout, () => { return (0, utils_1.sendErrorResponse)({ reqId: req.headers["req-id"], res, httpStatus: 504, errorMessage: "Response timeout", }); }); next(); }; }; exports.makeHandleTimeoutMiddleware = makeHandleTimeoutMiddleware; exports.DEFAULT_API_PREFIX = "/api/v1"; exports.DEFAULT_MAX_REQUEST_TIMEOUT_MS = 60000; /** Constructor function to make the Express.js app. */ const makeApp = async (config) => { const { maxRequestTimeoutMs = exports.DEFAULT_MAX_REQUEST_TIMEOUT_MS, conversationsRouterConfig, corsOptions, apiPrefix = exports.DEFAULT_API_PREFIX, expressAppConfig, } = config; mongodb_rag_core_1.logger.info("Server has the following configuration:"); mongodb_rag_core_1.logger.info(stringifyFunctions((0, lodash_clonedeep_1.default)(config))); // Initialize the Braintrust logger if it exists if (process.env.BRAINTRUST_TRACING_API_KEY !== undefined) { const braintrustLoggerId = await braintrust_1.braintrustLogger.id; mongodb_rag_core_1.logger.info(`Using Braintrust logger with ID: ${braintrustLoggerId}`); } else { mongodb_rag_core_1.logger.info("Braintrust logger not initialized"); } const app = (0, express_1.default)(); // Instantiate additional server logic, if it exists. expressAppConfig && (await expressAppConfig(app)); // MongoDB chatbot server logic app.use((0, exports.makeHandleTimeoutMiddleware)(maxRequestTimeoutMs)); app.set("trust proxy", true); app.use((0, cors_1.default)(corsOptions)); app.use(express_1.default.json()); app.use(exports.reqHandler); app.use(`${apiPrefix}/conversations`, (0, conversationsRouter_1.makeConversationsRouter)(conversationsRouterConfig)); app.get("/health", (_req, res) => { const data = { uptime: process.uptime(), message: "Ok", date: new Date(), }; res.status(200).send(data); }); app.all("*", (req, res, _next) => { return (0, utils_1.sendErrorResponse)({ reqId: (0, utils_1.getRequestId)(req), res, httpStatus: 404, errorMessage: "Not Found", }); }); app.use(exports.errorHandler); return app; }; exports.makeApp = makeApp; /** Helper function to stringify functions when logging the config object. */ function stringifyFunctions(obj) { if (typeof obj === "function") { return obj .toString() .split("\n") .map((line) => line.trim()) .join("\n"); } // Accept objects and arrays if (typeof obj === "object" && obj !== null) { const newObj = {}; for (const key in obj) { newObj[key] = stringifyFunctions(obj[key]); } return newObj; } return obj; } //# sourceMappingURL=app.js.map