You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.5 KiB

11 months ago
10 months ago
11 months ago
10 months ago
11 months ago
  1. process.env.NODE_ENV === "development"
  2. ? require("dotenv").config({ path: `.env.${process.env.NODE_ENV}` })
  3. : require("dotenv").config();
  4. require("./utils/logger")();
  5. const express = require("express");
  6. const bodyParser = require("body-parser");
  7. const cors = require("cors");
  8. const path = require("path");
  9. const { reqBody } = require("./utils/http");
  10. const { systemEndpoints } = require("./endpoints/system");
  11. const { workspaceEndpoints } = require("./endpoints/workspaces");
  12. const { chatEndpoints } = require("./endpoints/chat");
  13. const { embeddedEndpoints } = require("./endpoints/embed");
  14. const { embedManagementEndpoints } = require("./endpoints/embedManagement");
  15. const { getVectorDbClass } = require("./utils/helpers");
  16. const { adminEndpoints } = require("./endpoints/admin");
  17. const { inviteEndpoints } = require("./endpoints/invite");
  18. const { utilEndpoints } = require("./endpoints/utils");
  19. const { developerEndpoints } = require("./endpoints/api");
  20. const { extensionEndpoints } = require("./endpoints/extensions");
  21. const { bootHTTP, bootSSL } = require("./utils/boot");
  22. const { workspaceThreadEndpoints } = require("./endpoints/workspaceThreads");
  23. const { documentEndpoints } = require("./endpoints/document");
  24. const { agentWebsocket } = require("./endpoints/agentWebsocket");
  25. const { experimentalEndpoints } = require("./endpoints/experimental");
  26. const { browserExtensionEndpoints } = require("./endpoints/browserExtension");
  27. const { communityHubEndpoints } = require("./endpoints/communityHub");
  28. const { agentFlowEndpoints } = require("./endpoints/agentFlows");
  29. const { deptEndpoints } = require("./endpoints/dept");
  30. const app = express();
  31. const apiRouter = express.Router();
  32. const FILE_LIMIT = "3GB";
  33. app.use(cors({ origin: true }));
  34. app.use(bodyParser.text({ limit: FILE_LIMIT }));
  35. app.use(bodyParser.json({ limit: FILE_LIMIT }));
  36. app.use(
  37. bodyParser.urlencoded({
  38. limit: FILE_LIMIT,
  39. extended: true,
  40. })
  41. );
  42. if (!!process.env.ENABLE_HTTPS) {
  43. bootSSL(app, process.env.SERVER_PORT || 3001);
  44. } else {
  45. require("@mintplex-labs/express-ws").default(app); // load WebSockets in non-SSL mode.
  46. }
  47. app.use("/api", apiRouter);
  48. systemEndpoints(apiRouter);
  49. extensionEndpoints(apiRouter);
  50. workspaceEndpoints(apiRouter);
  51. deptEndpoints(apiRouter);
  52. workspaceThreadEndpoints(apiRouter);
  53. chatEndpoints(apiRouter);
  54. adminEndpoints(apiRouter);
  55. inviteEndpoints(apiRouter);
  56. embedManagementEndpoints(apiRouter);
  57. utilEndpoints(apiRouter);
  58. documentEndpoints(apiRouter);
  59. agentWebsocket(apiRouter);
  60. experimentalEndpoints(apiRouter);
  61. developerEndpoints(app, apiRouter);
  62. communityHubEndpoints(apiRouter);
  63. agentFlowEndpoints(apiRouter);
  64. // Externally facing embedder endpoints
  65. embeddedEndpoints(apiRouter);
  66. // Externally facing browser extension endpoints
  67. browserExtensionEndpoints(apiRouter);
  68. if (process.env.NODE_ENV !== "development") {
  69. const { MetaGenerator } = require("./utils/boot/MetaGenerator");
  70. const IndexPage = new MetaGenerator();
  71. app.use(
  72. express.static(path.resolve(__dirname, "public"), {
  73. extensions: ["js"],
  74. setHeaders: (res) => {
  75. // Disable I-framing of entire site UI
  76. res.removeHeader("X-Powered-By");
  77. res.setHeader("X-Frame-Options", "DENY");
  78. },
  79. })
  80. );
  81. app.use("/", function (_, response) {
  82. IndexPage.generate(response);
  83. return;
  84. });
  85. app.get("/robots.txt", function (_, response) {
  86. response.type("text/plain");
  87. response.send("User-agent: *\nDisallow: /").end();
  88. });
  89. } else {
  90. // Debug route for development connections to vectorDBs
  91. apiRouter.post("/v/:command", async (request, response) => {
  92. try {
  93. const VectorDb = getVectorDbClass();
  94. const { command } = request.params;
  95. if (!Object.getOwnPropertyNames(VectorDb).includes(command)) {
  96. response.status(500).json({
  97. message: "invalid interface command",
  98. commands: Object.getOwnPropertyNames(VectorDb),
  99. });
  100. return;
  101. }
  102. try {
  103. const body = reqBody(request);
  104. const resBody = await VectorDb[command](body);
  105. response.status(200).json({ ...resBody });
  106. } catch (e) {
  107. // console.error(e)
  108. console.error(JSON.stringify(e));
  109. response.status(500).json({ error: e.message });
  110. }
  111. return;
  112. } catch (e) {
  113. console.error(e.message, e);
  114. response.sendStatus(500).end();
  115. }
  116. });
  117. }
  118. app.all("*", function (_, response) {
  119. response.sendStatus(404);
  120. });
  121. // In non-https mode we need to boot at the end since the server has not yet
  122. // started and is `.listen`ing.
  123. if (!process.env.ENABLE_HTTPS) bootHTTP(app, process.env.SERVER_PORT || 3001);