Skip to content

Commit

Permalink
fix: upgrade to strict-event-emitter@0.5.0
Browse files Browse the repository at this point in the history
  • Loading branch information
kettanaito committed Jun 13, 2023
1 parent ca47c88 commit a88ad86
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 30 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
"debug": "^4.3.3",
"headers-polyfill": "^3.1.0",
"outvariant": "^1.2.1",
"strict-event-emitter": "^0.2.4",
"strict-event-emitter": "^0.5.0",
"web-encoding": "^1.1.5"
},
"keywords": [
Expand Down
16 changes: 8 additions & 8 deletions src/BatchInterceptor.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { EventMapType } from 'strict-event-emitter'
import { ExtractEventNames, Interceptor } from './Interceptor'
import { FunctionEventMap } from './utils/AsyncEventEmitter'

export interface BatchInterceptorOptions<
InterceptorList extends Interceptor<any>[]
Expand All @@ -8,10 +8,10 @@ export interface BatchInterceptorOptions<
interceptors: InterceptorList
}

export type ExtractEventMapType<InterceptorList extends Interceptor<any>[]> =
export type ExtractEventsType<InterceptorList extends Interceptor<any>[]> =
InterceptorList extends Array<infer InterceptorType>
? InterceptorType extends Interceptor<infer EventMap>
? EventMap
? InterceptorType extends Interceptor<infer Events>
? Events
: never
: never

Expand All @@ -21,8 +21,8 @@ export type ExtractEventMapType<InterceptorList extends Interceptor<any>[]> =
*/
export class BatchInterceptor<
InterceptorList extends Interceptor<any>[],
EventMap extends EventMapType = ExtractEventMapType<InterceptorList>
> extends Interceptor<EventMap> {
Events extends FunctionEventMap = ExtractEventsType<InterceptorList>
> extends Interceptor<Events> {
static symbol: Symbol

private interceptors: InterceptorList
Expand All @@ -47,9 +47,9 @@ export class BatchInterceptor<
}
}

public on<Event extends ExtractEventNames<EventMap>>(
public on<Event extends ExtractEventNames<Events>>(
event: Event,
listener: EventMap[Event]
listener: Events[Event]
) {
// Instead of adding a listener to the batch interceptor,
// propagate the listener to each of the individual interceptors.
Expand Down
45 changes: 24 additions & 21 deletions src/utils/AsyncEventEmitter.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
import { Debugger, debug } from 'debug'
import { StrictEventEmitter, EventMapType } from 'strict-event-emitter'
import { Emitter } from 'strict-event-emitter'
import { nextTick } from './nextTick'

export type FunctionEventMap = Record<string, (...args: Array<any>) => any>
export type FunctionEventMapToStrictEventEmitterMap<
Functions extends FunctionEventMap
> = {
[K in keyof Functions]: Parameters<Functions[K]>
}

export interface QueueItem<Args extends any[]> {
args: Args
done: Promise<void>
Expand All @@ -12,15 +19,15 @@ export enum AsyncEventEmitterReadyState {
DEACTIVATED = 'DEACTIVATED',
}

export class AsyncEventEmitter<
EventMap extends EventMapType
> extends StrictEventEmitter<EventMap> {
export class AsyncEventEmitter<Events extends FunctionEventMap> extends Emitter<
FunctionEventMapToStrictEventEmitterMap<Events>
> {
public readyState: AsyncEventEmitterReadyState

private log: Debugger
protected queue: Map<
keyof EventMap,
QueueItem<Parameters<EventMap[keyof EventMap]>>[]
keyof Events,
QueueItem<Parameters<Events[keyof Events]>>[]
>

constructor() {
Expand All @@ -32,10 +39,7 @@ export class AsyncEventEmitter<
this.readyState = AsyncEventEmitterReadyState.ACTIVE
}

public on<Event extends keyof EventMap>(
event: Event,
listener: EventMap[Event]
) {
public on<Event extends keyof Events>(event: Event, listener: Events[Event]) {
const log = this.log.extend('on')

log('adding "%s" listener...', event)
Expand All @@ -45,7 +49,7 @@ export class AsyncEventEmitter<
return this
}

return super.on(event, (async (...args: Parameters<EventMap[Event]>) => {
return super.on(event, (async (...args: Parameters<Events[Event]>) => {
// Event queue is always established when calling ".emit()".
const queue = this.openListenerQueue(event)

Expand All @@ -69,12 +73,12 @@ export class AsyncEventEmitter<
}
}),
})
}) as EventMap[Event])
}) as Events[Event])
}

public emit<Event extends keyof EventMap>(
public emit<Event extends keyof Events>(
event: Event,
...args: Parameters<EventMap[Event]>
...args: Parameters<Events[Event]>
): boolean {
const log = this.log.extend('emit')

Expand All @@ -99,7 +103,7 @@ export class AsyncEventEmitter<
this.queue.delete(event)
log('cleaned up "%s" listeners queue!', event)
})
}) as EventMap[Event])
}) as Events[Event])

return super.emit(event, ...args)
}
Expand All @@ -109,10 +113,9 @@ export class AsyncEventEmitter<
* has been called. Awaits asynchronous listeners.
* If the event has no listeners, resolves immediately.
*/
public async untilIdle<Event extends keyof EventMap>(
public async untilIdle<Event extends keyof Events>(
event: Event,
filter: (item: QueueItem<Parameters<EventMap[Event]>>) => boolean = () =>
true
filter: (item: QueueItem<Parameters<Events[Event]>>) => boolean = () => true
): Promise<void> {
const listenersQueue = this.queue.get(event) || []

Expand All @@ -125,9 +128,9 @@ export class AsyncEventEmitter<
})
}

private openListenerQueue<Event extends keyof EventMap>(
private openListenerQueue<Event extends keyof Events>(
event: Event
): QueueItem<Parameters<EventMap[Event]>>[] {
): QueueItem<Parameters<Events[Event]>>[] {
const log = this.log.extend('openListenerQueue')

log('opening "%s" listeners queue...', event)
Expand All @@ -145,7 +148,7 @@ export class AsyncEventEmitter<
return queue
}

public removeAllListeners<Event extends keyof EventMap>(event?: Event) {
public removeAllListeners<Event extends keyof Events>(event?: Event) {
const log = this.log.extend('removeAllListeners')
log('event:', event)

Expand Down

0 comments on commit a88ad86

Please sign in to comment.