Skip to content

Commit f95fe3d

Browse files
chore: updating & cleaning dependencies
1 parent 6a2022b commit f95fe3d

File tree

8 files changed

+35
-149
lines changed

8 files changed

+35
-149
lines changed

package.json

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,24 +50,23 @@
5050
"/src/types/"
5151
],
5252
"dependencies": {
53-
"@sindresorhus/is": "^4.0.0",
5453
"abort-controller": "^3.0.0",
55-
"event-target-shim": "^5.0.0"
54+
"event-target-shim": "^6.0.2"
5655
},
5756
"devDependencies": {
5857
"@leichtgewicht/pack-ts": "^1.0.1",
59-
"@types/jest": "^26.0.16",
60-
"@types/libsodium-wrappers-sumo": "^0.7.4",
61-
"@typescript-eslint/eslint-plugin": "^4.9.0",
62-
"eslint": "^7.15.0",
63-
"eslint-config-standard-with-typescript": "^19.0.1",
58+
"@types/jest": "^26.0.22",
59+
"@types/libsodium-wrappers-sumo": "^0.7.5",
60+
"@typescript-eslint/eslint-plugin": "^4.20.0",
61+
"eslint": "^7.23.0",
62+
"eslint-config-standard-with-typescript": "^20.0.0",
6463
"eslint-plugin-import": "^2.22.1",
6564
"eslint-plugin-node": "^11.1.0",
66-
"eslint-plugin-promise": "^4.2.1",
65+
"eslint-plugin-promise": "^4.3.1",
6766
"eslint-plugin-standard": "^5.0.0",
6867
"jest": "^26.6.3",
69-
"ts-jest": "^26.4.4",
70-
"typescript": "^4.1.2"
68+
"ts-jest": "^26.5.4",
69+
"typescript": "^4.2.3"
7170
},
7271
"repository": {
7372
"type": "git",

src/__tests__/composeAbort.test.ts

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -55,45 +55,4 @@ describe('composeAbort(signal?)', () => {
5555
composeAbort(parent.signal)
5656
}).toThrowError(AbortError)
5757
})
58-
it('composing will not add an unnecessary event listener', async () => {
59-
const parent = new AbortController()
60-
const listeners: { [key in string]: Set<any>} = {}
61-
parent.signal.addEventListener = function (...[type, listener]: Parameters<typeof AbortSignal.prototype.addEventListener>) {
62-
AbortSignal.prototype.addEventListener.call(this, type, listener)
63-
if (listener === null) return
64-
let forEvent = listeners[type]
65-
if (forEvent === undefined) {
66-
forEvent = new Set()
67-
listeners[type] = forEvent
68-
}
69-
forEvent.add(listener)
70-
}
71-
parent.signal.removeEventListener = function (...[type, listener]: Parameters<typeof AbortSignal.prototype.removeEventListener>) {
72-
AbortSignal.prototype.removeEventListener.call(this, type, listener)
73-
if (listener === null) return
74-
const forEvent = listeners[type]
75-
if (forEvent === undefined) return
76-
forEvent.delete(listener)
77-
if (forEvent.size === 0) {
78-
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete
79-
delete listeners[type]
80-
}
81-
}
82-
const child = composeAbort(parent.signal)
83-
expect(child.signal.aborted).toBe(false)
84-
expect(listeners).toEqual({})
85-
const listener = (): void => {}
86-
child.signal.addEventListener('otherEvent', listener)
87-
expect(listeners).toEqual({})
88-
child.signal.addEventListener('abort', listener)
89-
expect(listeners.abort?.size).toEqual(1)
90-
child.signal.removeEventListener('abort', listener)
91-
expect(listeners).toEqual({})
92-
child.signal.addEventListener('abort', listener)
93-
expect(listeners.abort?.size).toEqual(1)
94-
child.abort()
95-
expect(listeners).toEqual({})
96-
child.signal.addEventListener('abort', listener)
97-
expect(listeners).toEqual({})
98-
})
9958
})

src/bubbleAbort.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { AbortError } from './AbortError'
2+
import { AbortSignal } from 'abort-controller'
23

34
/**
45
* Simple function that throws an AbortError if an AbortSignal
@@ -22,7 +23,7 @@ import { AbortError } from './AbortError'
2223
* @see checkpoint for an alternative syntax that requires less typing.
2324
* @see AbortError
2425
*/
25-
export function bubbleAbort (signal?: AbortSignal | null): void {
26+
export function bubbleAbort (signal?: AbortSignal | null | undefined): void {
2627
if (signal === undefined || signal === null) {
2728
return
2829
}

src/checkpoint.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { AbortError } from './AbortError'
2+
import { AbortSignal } from 'abort-controller'
23

34
const cache = new WeakMap<AbortSignal, CheckPoint>()
45
const passthrough: CheckPoint = <T> (input?: () => T): T | undefined => {

src/cleanupPromise.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import is from '@sindresorhus/is'
1+
import { AbortSignal } from 'abort-controller'
22
import { TimeoutOptions } from './options'
33
import { AbortError } from './AbortError'
44
import { wrapTimeout } from './wrapTimeout'
@@ -81,7 +81,7 @@ export async function cleanupPromise <T = unknown> (
8181
return
8282
}
8383
const withCleanup = (cleanup: any): void => {
84-
const hasSignal = !is.nullOrUndefined(signal)
84+
const hasSignal = signal !== null && signal !== undefined
8585
// @ts-expect-error 2532 - signal is certainly not undefined with hasSignal
8686
if (hasSignal && signal.aborted) {
8787
earlyFinish = earlyFinish ?? { error: new AbortError() }
@@ -92,7 +92,7 @@ export async function cleanupPromise <T = unknown> (
9292
if ('error' in finish) {
9393
return reject(finish.error)
9494
}
95-
if (!is.nullOrUndefined(cleanupError)) {
95+
if (cleanupError !== null && cleanupError !== undefined) {
9696
return reject(cleanupError)
9797
}
9898
return resolve(finish.result)
@@ -130,7 +130,7 @@ export async function cleanupPromise <T = unknown> (
130130
if ('error' in finish) {
131131
return reject(finish.error)
132132
}
133-
if (!is.nullOrUndefined(cleanupError)) {
133+
if (cleanupError !== null && cleanupError !== undefined) {
134134
return reject(cleanupError)
135135
}
136136
return resolve(finish.result)

src/composeAbort.ts

Lines changed: 17 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,26 @@
1-
import is from '@sindresorhus/is'
21
import { AbortController, AbortSignal } from 'abort-controller'
3-
import ShimEventTarget from 'event-target-shim'
42
import { AbortError } from './AbortError'
53

6-
const EventTarget = global.EventTarget ?? ShimEventTarget
7-
const Event: new (type: string) => any = global.Event ?? class {
8-
type: string
9-
constructor (type: string) {
10-
this.type = type
11-
}
12-
}
13-
14-
export interface AbortControllerLike {
15-
readonly signal: AbortSignal
16-
abort: () => void
17-
}
18-
19-
const { addEventListener, removeEventListener } = AbortSignal.prototype
20-
21-
interface IComposedAbortSignal extends AbortSignal {
22-
_parent: AbortSignal
23-
_signal: AbortSignal
24-
_handlers: Map<any, true> | undefined
25-
_onAbort: () => void
26-
_clear: () => void
27-
}
28-
29-
function onAbort (this: IComposedAbortSignal): void {
30-
this._clear()
31-
this.dispatchEvent(new Event('abort'))
32-
}
33-
34-
/**
35-
* AbortSignal's constructor throws an error
36-
*/
37-
function ComposedAbortSignal (this: IComposedAbortSignal, signal: AbortSignal, parent: AbortSignal): void {
38-
EventTarget.apply(this)
39-
this._signal = signal
40-
this._parent = parent
41-
}
42-
ComposedAbortSignal.prototype = Object.defineProperties(Object.create(AbortSignal.prototype), {
43-
aborted: {
44-
get (this: IComposedAbortSignal) {
45-
return this._parent.aborted || this._signal.aborted
4+
class ComposedAbortController extends AbortController {
5+
constructor (signal?: AbortSignal) {
6+
super()
7+
if (signal === null || signal === undefined) {
8+
return
469
}
47-
},
48-
_clear: {
49-
value (this: IComposedAbortSignal): void {
50-
this._handlers = undefined
51-
if (this._onAbort !== undefined) {
52-
this._signal.removeEventListener('abort', this._onAbort)
53-
this._parent.removeEventListener('abort', this._onAbort)
54-
}
10+
if (signal.aborted) {
11+
throw new AbortError()
5512
}
56-
},
57-
addEventListener: {
58-
value (this: IComposedAbortSignal, ...[type, listener]: Parameters<typeof addEventListener>): void {
59-
addEventListener.call(this, type, listener)
60-
if (this.aborted || type !== 'abort' || is.nullOrUndefined(listener)) {
61-
return
62-
}
63-
if (this._handlers === undefined) {
64-
this._handlers = new Map()
65-
this._onAbort = onAbort.bind(this)
66-
this._signal.addEventListener('abort', this._onAbort)
67-
this._parent.addEventListener('abort', this._onAbort)
68-
}
69-
this._handlers.set(listener, true)
13+
const parentAborted = (): void => {
14+
this.abort()
7015
}
71-
},
72-
removeEventListener: {
73-
value (this: IComposedAbortSignal, ...[type, listener]: Parameters<typeof removeEventListener>): void {
74-
removeEventListener.call(this, type, listener)
75-
if (this._handlers === undefined || type !== 'abort' || is.nullOrUndefined(listener)) {
76-
return
77-
}
78-
this._handlers.delete(listener)
79-
if (this._handlers.size === 0) {
80-
this._clear()
81-
}
16+
const clear = (): void => {
17+
signal.removeEventListener('abort', parentAborted)
18+
this.signal.removeEventListener('abort', clear)
8219
}
20+
signal.addEventListener('abort', parentAborted)
21+
this.signal.addEventListener('abort', clear)
8322
}
84-
})
23+
}
8524

8625
/**
8726
* Creates a new AbortController-compatible instance
@@ -104,17 +43,6 @@ ComposedAbortSignal.prototype = Object.defineProperties(Object.create(AbortSigna
10443
*
10544
* @param signal Optional Signal that can abort the controller
10645
*/
107-
export function composeAbort (signal?: AbortSignal): AbortControllerLike {
108-
const controller = new AbortController()
109-
if (is.nullOrUndefined(signal)) {
110-
return controller
111-
}
112-
if (signal.aborted) {
113-
throw new AbortError()
114-
}
115-
return {
116-
// @ts-expect-error - ComposedAbortSignal is hacked together as AbortSignal is not easily extendable.
117-
signal: new ComposedAbortSignal(controller.signal, signal),
118-
abort: controller.abort.bind(controller)
119-
}
46+
export function composeAbort (signal?: AbortSignal): AbortController {
47+
return new ComposedAbortController(signal)
12048
}

src/raceWithSignal.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import is from '@sindresorhus/is'
21
import { AbortSignal } from 'abort-controller'
32
import { AbortError } from './AbortError'
43
import { composeAbort } from './composeAbort'
@@ -28,7 +27,7 @@ export async function raceWithSignal <TReturn = unknown> (command: (signal: Abor
2827
const controller = composeAbort(inputSignal)
2928
const { signal } = controller
3029
const promises = Array.from(command(signal))
31-
if (!is.nullOrUndefined(inputSignal)) {
30+
if (inputSignal !== null && inputSignal !== undefined) {
3231
promises.push(new Promise((resolve, reject) => {
3332
const abortHandler = (): void => {
3433
clear()

src/wrapTimeout.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { TimeoutOptions } from './options'
22
import { AbortSignal } from 'abort-controller'
3-
import is from '@sindresorhus/is'
43
import { bubbleAbort } from './bubbleAbort'
54
import { raceWithSignal } from './raceWithSignal'
65

@@ -45,7 +44,7 @@ export type TimeoutCommand <T> = (signal: AbortSignal | undefined, resetTimeout:
4544
*/
4645
export async function wrapTimeout <T> (command: TimeoutCommand<T>, opts: TimeoutOptions = {}): Promise<T> {
4746
const { timeout, signal: inputSignal } = opts
48-
if (is.nullOrUndefined(timeout) || timeout === 0) {
47+
if (timeout === null || timeout === undefined || timeout === 0) {
4948
bubbleAbort(inputSignal)
5049
return await command(inputSignal, noop)
5150
}

0 commit comments

Comments
 (0)