async.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { NextFunction, Request, RequestHandler, Response } from 'express'
  2. import { ValidationChain } from 'express-validator'
  3. import { ExpressPromiseHandler } from '@server/types/express-handler.js'
  4. import { retryTransactionWrapper } from '../helpers/database-utils.js'
  5. // Syntactic sugar to avoid try/catch in express controllers/middlewares
  6. export type RequestPromiseHandler = ValidationChain | ExpressPromiseHandler
  7. function asyncMiddleware (fun: RequestPromiseHandler | RequestPromiseHandler[]) {
  8. return async (req: Request, res: Response, next: NextFunction) => {
  9. if (Array.isArray(fun) !== true) {
  10. return Promise.resolve((fun as RequestHandler)(req, res, next))
  11. .catch(err => next(err))
  12. }
  13. try {
  14. for (const f of (fun as RequestPromiseHandler[])) {
  15. await new Promise<void>((resolve, reject) => {
  16. return asyncMiddleware(f)(req, res, err => {
  17. if (err) return reject(err)
  18. return resolve()
  19. })
  20. })
  21. }
  22. next()
  23. } catch (err) {
  24. next(err)
  25. }
  26. }
  27. }
  28. function asyncRetryTransactionMiddleware (fun: (req: Request, res: Response, next: NextFunction) => Promise<any>) {
  29. return (req: Request, res: Response, next: NextFunction) => {
  30. return Promise.resolve(
  31. retryTransactionWrapper(fun, req, res, next)
  32. ).catch(err => next(err))
  33. }
  34. }
  35. // ---------------------------------------------------------------------------
  36. export {
  37. asyncMiddleware,
  38. asyncRetryTransactionMiddleware
  39. }