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.

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