async.ts 1.5 KB

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