abort-signal.js 1.0 KB

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