Răsfoiți Sursa

Merge pull request #19465 from overleaf/ab-modules-middlewares

[web] Support injecting middlewares from modules

GitOrigin-RevId: efbf68d885f839b92f2e601553c7ce54b9d4b6d3
Alexandre Bourdin 2 ani în urmă
părinte
comite
8e79d72cc2
1 a modificat fișierele cu 26 adăugiri și 5 ștergeri
  1. 26 5
      services/web/app/src/infrastructure/Modules.js

+ 26 - 5
services/web/app/src/infrastructure/Modules.js

@@ -10,6 +10,7 @@ const MODULE_BASE_PATH = Path.join(__dirname, '/../../../modules')
 const _modules = []
 let _modulesLoaded = false
 const _hooks = {}
+const _middleware = {}
 let _viewIncludes = {}
 
 function modules() {
@@ -43,6 +44,7 @@ function loadModules() {
   }
   _modulesLoaded = true
   attachHooks()
+  attachMiddleware()
 }
 
 function applyRouter(webRouter, privateApiRouter, publicApiRouter) {
@@ -111,11 +113,9 @@ function linkedFileAgentsIncludes() {
 
 function attachHooks() {
   for (const module of modules()) {
-    if (module.hooks != null) {
-      for (const hook in module.hooks) {
-        const method = module.hooks[hook]
-        attachHook(hook, method)
-      }
+    for (const hook in module.hooks || {}) {
+      const method = module.hooks[hook]
+      attachHook(hook, method)
     }
   }
 }
@@ -127,6 +127,18 @@ function attachHook(name, method) {
   _hooks[name].push(method)
 }
 
+function attachMiddleware() {
+  for (const module of modules()) {
+    for (const middleware in module.middleware || {}) {
+      const method = module.middleware[middleware]
+      if (_middleware[middleware] == null) {
+        _middleware[middleware] = []
+      }
+      _middleware[middleware].push(method)
+    }
+  }
+}
+
 function fireHook(name, ...rest) {
   // ensure that modules are loaded if we need to fire a hook
   // this can happen if a script calls a method that fires a hook
@@ -146,6 +158,14 @@ function fireHook(name, ...rest) {
   })
 }
 
+function getMiddleware(name) {
+  // ensure that modules are loaded if we need to call a middleware
+  if (!_modulesLoaded) {
+    loadModules()
+  }
+  return _middleware[name] || []
+}
+
 module.exports = {
   applyNonCsrfRouter,
   applyRouter,
@@ -158,6 +178,7 @@ module.exports = {
     attach: attachHook,
     fire: fireHook,
   },
+  middleware: getMiddleware,
   promises: {
     hooks: {
       fire: promisify(fireHook),