interceptor.ts 846 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { isPromise } from './util'
  2. function noop() {}
  3. export type Interceptor = (...args: any[]) => Promise<boolean> | boolean | undefined | void
  4. export function callInterceptor(
  5. interceptor: Interceptor | undefined,
  6. {
  7. args = [],
  8. done,
  9. canceled,
  10. error
  11. }: {
  12. args?: unknown[]
  13. done: () => void
  14. canceled?: () => void
  15. error?: () => void
  16. }
  17. ) {
  18. if (interceptor) {
  19. // eslint-disable-next-line prefer-spread
  20. const returnVal = interceptor.apply(null, args)
  21. if (isPromise(returnVal)) {
  22. returnVal
  23. .then((value) => {
  24. if (value) {
  25. done()
  26. } else if (canceled) {
  27. canceled()
  28. }
  29. })
  30. .catch(error || noop)
  31. } else if (returnVal) {
  32. done()
  33. } else if (canceled) {
  34. canceled()
  35. }
  36. } else {
  37. done()
  38. }
  39. }