abort-signal.js 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. const { addAbortListener } = require('../core/util')
  2. const { RequestAbortedError } = require('../core/errors')
  3. const kListener = Symbol('kListener')
  4. const kSignal = Symbol('kSignal')
  5. function abort (self) {
  6. if (self.abort) {
  7. self.abort(self[kSignal]?.reason)
  8. } else {
  9. self.reason = self[kSignal]?.reason ?? new RequestAbortedError()
  10. }
  11. removeSignal(self)
  12. }
  13. function addSignal (self, signal) {
  14. self.reason = null
  15. self[kSignal] = null
  16. self[kListener] = null
  17. if (!signal) {
  18. return
  19. }
  20. if (signal.aborted) {
  21. abort(self)
  22. return
  23. }
  24. self[kSignal] = signal
  25. self[kListener] = () => {
  26. abort(self)
  27. }
  28. addAbortListener(self[kSignal], self[kListener])
  29. }
  30. function removeSignal (self) {
  31. if (!self[kSignal]) {
  32. return
  33. }
  34. if ('removeEventListener' in self[kSignal]) {
  35. self[kSignal].removeEventListener('abort', self[kListener])
  36. } else {
  37. self[kSignal].removeListener('abort', self[kListener])
  38. }
  39. self[kSignal] = null
  40. self[kListener] = null
  41. }
  42. module.exports = {
  43. addSignal,
  44. removeSignal
  45. }