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