@quilted/events
Advanced tools
Comparing version 0.0.0-fix-types-20220529011148 to 0.0.0-preview-20221213011017
@@ -1,2 +0,2 @@ | ||
export declare type AbortBehavior = 'throws' | 'returns'; | ||
export type AbortBehavior = 'throws' | 'returns'; | ||
export declare class NestedAbortController extends AbortController { | ||
@@ -7,3 +7,9 @@ private readonly cleanup; | ||
} | ||
export declare function anyAbortSignal(...signals: readonly AbortSignal[]): AbortSignal; | ||
export declare function raceAgainstAbortSignal<T>(race: () => Promise<T>, { signal, ifAborted, }: { | ||
signal: AbortSignal; | ||
ifAborted?(): void | Promise<void>; | ||
}): Promise<T>; | ||
export declare class AbortError extends Error { | ||
static test(error: unknown): error is AbortError; | ||
readonly code = "ABORT_ERR"; | ||
@@ -10,0 +16,0 @@ readonly name = "AbortError"; |
import type { AbortBehavior } from './abort'; | ||
export declare type EmitterHandler<T = unknown> = (event: T) => void; | ||
export type EmitterHandler<T = unknown> = (event: T) => void; | ||
export interface Emitter<Events = {}> { | ||
on<Event extends keyof Events>(type: Event, handler: EmitterHandler<Events[Event]>, options?: { | ||
once?: boolean; | ||
signal?: AbortSignal; | ||
abort?: never; | ||
}): void; | ||
on<Event extends keyof Events>(type: Event, options?: { | ||
once?: boolean; | ||
signal?: AbortSignal; | ||
abort?: AbortBehavior; | ||
}): AsyncGenerator<Events[Event], void, void>; | ||
on<Event extends keyof Events>(type: Event, options: { | ||
@@ -24,6 +14,32 @@ once: true; | ||
}): Promise<Abort extends 'returns' ? Events[Event] | undefined : Events[Event]>; | ||
on<Event extends keyof Events>(type: Event, options?: { | ||
once?: boolean; | ||
signal?: AbortSignal; | ||
abort?: AbortBehavior; | ||
}): AsyncGenerator<Events[Event], void, void>; | ||
on<Event extends keyof Events>(type: Event, handler: EmitterHandler<Events[Event]>, options?: { | ||
once?: boolean; | ||
signal?: AbortSignal; | ||
abort?: never; | ||
}): void; | ||
emit<Event extends keyof Events>(type: Event, event: Events[Event]): void; | ||
emit<Event extends keyof Events>(type: undefined extends Events[Event] ? Event : never): void; | ||
} | ||
export declare function createEmitter<Events = {}>(): Emitter<Events>; | ||
export declare function createEmitter<Events = {}>(internal?: Emitter<EmitterInternalEvents<Events>>): Emitter<Events>; | ||
export interface EmitterInternalEvents<Events = {}> { | ||
add: { | ||
event: keyof Events; | ||
handler: EmitterHandler<unknown>; | ||
all: Set<EmitterHandler<unknown>>; | ||
}; | ||
remove: { | ||
event: keyof Events; | ||
handler: EmitterHandler<unknown>; | ||
all: Set<EmitterHandler<unknown>>; | ||
}; | ||
} | ||
export interface EmitterWithInternals<Events = {}> extends Emitter<Events> { | ||
readonly internal: Emitter<EmitterInternalEvents<Events>>; | ||
} | ||
export declare function createEmitterWithInternals<Events = {}>(): EmitterWithInternals<Events>; | ||
//# sourceMappingURL=emitter.d.ts.map |
export { on } from './on'; | ||
export { once } from './once'; | ||
export { AbortError, NestedAbortController } from './abort'; | ||
export type { AbortBehavior } from './abort'; | ||
export { createEmitter } from './emitter'; | ||
export type { Emitter, EmitterHandler } from './emitter'; | ||
export { AbortError, NestedAbortController, anyAbortSignal, raceAgainstAbortSignal, type AbortBehavior, } from './abort'; | ||
export { addListener } from './listeners'; | ||
export { createEmitter, createEmitterWithInternals } from './emitter'; | ||
export type { Emitter, EmitterHandler, EmitterInternalEvents, EmitterWithInternals, } from './emitter'; | ||
export type { EventTarget, EventTargetOn, EventTargetAddEventListener, EventTargetFunction, } from './types'; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -17,3 +17,3 @@ export interface EventTargetAddEventListener<EventMap = Record<string, unknown>> { | ||
} | ||
export declare type EventTarget<EventMap = Record<string, unknown>> = EventTargetAddEventListener<EventMap> | EventTargetOn<EventMap> | EventTargetFunction<EventMap>; | ||
export type EventTarget<EventMap = Record<string, unknown>> = EventTargetAddEventListener<EventMap> | EventTargetOn<EventMap> | EventTargetFunction<EventMap>; | ||
//# sourceMappingURL=types.d.ts.map |
# @quilted/events | ||
## 0.0.0-fix-types-20220529011148 | ||
## 0.0.0-preview-20221213011017 | ||
### Patch Changes | ||
- [#331](https://github.com/lemonmade/quilt/pull/331) [`f356dc06`](https://github.com/lemonmade/quilt/commit/f356dc067628550114b8e2a06b6878a1506bbed2) Thanks [@lemonmade](https://github.com/lemonmade)! - Fix React types in stricter package managers | ||
- Update all development dependencies to their latest versions | ||
## 0.1.15 | ||
### Patch Changes | ||
- [#429](https://github.com/lemonmade/quilt/pull/429) [`69a5d2a1`](https://github.com/lemonmade/quilt/commit/69a5d2a1f9c2fe8d93be3157eb33506b0b8f7df7) Thanks [@lemonmade](https://github.com/lemonmade)! - Update all development dependencies to their latest versions | ||
## 0.1.14 | ||
### Patch Changes | ||
- [`fc34575a`](https://github.com/lemonmade/quilt/commit/fc34575a565760c352d7417dc26bfc989828acdd) Thanks [@lemonmade](https://github.com/lemonmade)! - Fix types for emitter once events | ||
## 0.1.13 | ||
### Patch Changes | ||
- [`2128fbe4`](https://github.com/lemonmade/quilt/commit/2128fbe469abc5589544d59317577cdc4f876353) Thanks [@lemonmade](https://github.com/lemonmade)! - Add raceAgainstAbortSignal utility | ||
## 0.1.12 | ||
### Patch Changes | ||
- [`73c73555`](https://github.com/lemonmade/quilt/commit/73c735555b8feaaf19f7355fab87a4021925d099) Thanks [@lemonmade](https://github.com/lemonmade)! - Add reason to anyAbortController | ||
## 0.1.11 | ||
### Patch Changes | ||
- [`39544227`](https://github.com/lemonmade/quilt/commit/39544227abefed9185b500e3461ad4ec2e5f11cb) Thanks [@lemonmade](https://github.com/lemonmade)! - Add anyAbortSignal utility | ||
## 0.1.10 | ||
### Patch Changes | ||
- [`a419953a`](https://github.com/lemonmade/quilt/commit/a419953aff8c955aa8ca7ef2923869f051c3f24d) Thanks [@lemonmade](https://github.com/lemonmade)! - Add internal events for emitter | ||
## 0.1.9 | ||
### Patch Changes | ||
- [`ee630a83`](https://github.com/lemonmade/quilt/commit/ee630a832b2582a71398a720a2b0ac990eae027d) Thanks [@lemonmade](https://github.com/lemonmade)! - Export addListener utility | ||
## 0.1.8 | ||
### Patch Changes | ||
- [`a12c3576`](https://github.com/lemonmade/quilt/commit/a12c357693b173461f51a35fb7efdd0a9267e471) Thanks [@lemonmade](https://github.com/lemonmade)! - Fix more build issues | ||
## 0.1.7 | ||
### Patch Changes | ||
- [`0629288e`](https://github.com/lemonmade/quilt/commit/0629288ee4ba2e2ccfd73fbb216c3559e1a5c77e) Thanks [@lemonmade](https://github.com/lemonmade)! - Fix missing package builds | ||
## 0.1.6 | ||
### Patch Changes | ||
- [#364](https://github.com/lemonmade/quilt/pull/364) [`4dc1808a`](https://github.com/lemonmade/quilt/commit/4dc1808a86d15e821b218b528617430cbd8b5b48) Thanks [@lemonmade](https://github.com/lemonmade)! - Update to simplified Quilt config | ||
## 0.1.5 | ||
### Patch Changes | ||
- [#359](https://github.com/lemonmade/quilt/pull/359) [`2eceac54`](https://github.com/lemonmade/quilt/commit/2eceac546fa3ee3e2c4d2887ab4a6a021acb52cd) Thanks [@lemonmade](https://github.com/lemonmade)! - Update TypeScript and ESLint to latest versions | ||
## 0.1.4 | ||
### Patch Changes | ||
- [#338](https://github.com/lemonmade/quilt/pull/338) [`3e2993f5`](https://github.com/lemonmade/quilt/commit/3e2993f598be4aad1b16ef378d7cd449de81c3b5) Thanks [@lemonmade](https://github.com/lemonmade)! - Add full support for from-source export condition | ||
## 0.1.3 | ||
### Patch Changes | ||
- [#331](https://github.com/lemonmade/quilt/pull/331) [`efc54f75`](https://github.com/lemonmade/quilt/commit/efc54f75cb29ec4143a8e52f577edff518014a6b) Thanks [@lemonmade](https://github.com/lemonmade)! - Fix React types in stricter package managers | ||
## 0.1.2 | ||
@@ -10,0 +88,0 @@ |
@@ -5,3 +5,3 @@ { | ||
"type": "module", | ||
"version": "0.0.0-fix-types-20220529011148", | ||
"version": "0.0.0-preview-20221213011017", | ||
"license": "MIT", | ||
@@ -22,2 +22,4 @@ "engines": { | ||
".": { | ||
"types": "./build/typescript/index.d.ts", | ||
"quilt:source": "./source/index.ts", | ||
"quilt:esnext": "./build/esnext/index.esnext", | ||
@@ -41,5 +43,5 @@ "import": "./build/esm/index.mjs", | ||
"extends": [ | ||
"@quilted/eslint-config/package" | ||
"@quilted/eslint-config/project" | ||
] | ||
} | ||
} |
@@ -1,6 +0,5 @@ | ||
import {createPackage, quiltPackage} from '@quilted/craft'; | ||
import {createProject, quiltPackage} from '@quilted/craft'; | ||
export default createPackage((pkg) => { | ||
pkg.entry({source: './source/index.ts'}); | ||
pkg.use(quiltPackage()); | ||
export default createProject((project) => { | ||
project.use(quiltPackage()); | ||
}); |
@@ -19,4 +19,73 @@ export type AbortBehavior = 'throws' | 'returns'; | ||
export function anyAbortSignal(...signals: readonly AbortSignal[]) { | ||
const controller = new AbortController(); | ||
const abortedSignal = signals.find((signal) => signal.aborted); | ||
if (abortedSignal) { | ||
controller.abort(abortedSignal.reason); | ||
} else { | ||
for (const signal of signals) { | ||
signal.addEventListener('abort', () => controller.abort(signal.reason), { | ||
signal: controller.signal, | ||
}); | ||
} | ||
} | ||
return controller.signal; | ||
} | ||
export async function raceAgainstAbortSignal<T>( | ||
race: () => Promise<T>, | ||
{ | ||
signal, | ||
ifAborted, | ||
}: {signal: AbortSignal; ifAborted?(): void | Promise<void>}, | ||
): Promise<T> { | ||
const raceAbort = new AbortController(); | ||
const result = await Promise.race([racer(), abortRacer()]); | ||
return result as T; | ||
async function racer() { | ||
try { | ||
const result = await race(); | ||
return result; | ||
} finally { | ||
raceAbort.abort(); | ||
} | ||
} | ||
async function abortRacer() { | ||
await new Promise<void>((resolve, reject) => { | ||
signal.addEventListener( | ||
'abort', | ||
async () => { | ||
try { | ||
if (ifAborted) await ifAborted(); | ||
reject(new AbortError()); | ||
} catch (error) { | ||
reject(error); | ||
} | ||
}, | ||
{signal: raceAbort.signal}, | ||
); | ||
raceAbort.signal.addEventListener( | ||
'abort', | ||
() => { | ||
resolve(); | ||
}, | ||
{signal}, | ||
); | ||
}); | ||
} | ||
} | ||
// @see https://github.com/nodejs/node/blob/master/lib/internal/errors.js#L822-L834 | ||
export class AbortError extends Error { | ||
static test(error: unknown): error is AbortError { | ||
return error != null && (error as any).code === 'ABORT_ERR'; | ||
} | ||
readonly code = 'ABORT_ERR'; | ||
@@ -23,0 +92,0 @@ readonly name = 'AbortError'; |
@@ -7,15 +7,5 @@ import {on as onEvent} from './on'; | ||
// eslint-disable-next-line @typescript-eslint/ban-types | ||
export interface Emitter<Events = {}> { | ||
on<Event extends keyof Events>( | ||
type: Event, | ||
handler: EmitterHandler<Events[Event]>, | ||
options?: {once?: boolean; signal?: AbortSignal; abort?: never}, | ||
): void; | ||
on<Event extends keyof Events>( | ||
type: Event, | ||
options?: {once?: boolean; signal?: AbortSignal; abort?: AbortBehavior}, | ||
): AsyncGenerator<Events[Event], void, void>; | ||
on<Event extends keyof Events>( | ||
type: Event, | ||
options: {once: true; signal?: never; abort?: never}, | ||
@@ -29,2 +19,11 @@ ): Promise<Events[Event]>; | ||
>; | ||
on<Event extends keyof Events>( | ||
type: Event, | ||
options?: {once?: boolean; signal?: AbortSignal; abort?: AbortBehavior}, | ||
): AsyncGenerator<Events[Event], void, void>; | ||
on<Event extends keyof Events>( | ||
type: Event, | ||
handler: EmitterHandler<Events[Event]>, | ||
options?: {once?: boolean; signal?: AbortSignal; abort?: never}, | ||
): void; | ||
@@ -37,4 +36,5 @@ emit<Event extends keyof Events>(type: Event, event: Events[Event]): void; | ||
// eslint-disable-next-line @typescript-eslint/ban-types | ||
export function createEmitter<Events = {}>(): Emitter<Events> { | ||
export function createEmitter<Events = {}>( | ||
internal?: Emitter<EmitterInternalEvents<Events>>, | ||
): Emitter<Events> { | ||
const handlerMap = new Map<keyof Events, Set<any>>(); | ||
@@ -79,3 +79,7 @@ | ||
signalAbort?.abort(); | ||
handlers!.delete(normalizedHandler); | ||
if (handlers == null) return; | ||
handlers.delete(normalizedHandler); | ||
internal?.emit('remove', {event, handler: handler as any, all: handlers}); | ||
if (handlers!.size === 0) handlerMap.delete(event); | ||
}; | ||
@@ -98,4 +102,34 @@ | ||
internal?.emit('add', {event, handler: handler as any, all: handlers}); | ||
signal?.addEventListener('abort', remove, {signal: signalAbort!.signal}); | ||
} | ||
} | ||
export interface EmitterInternalEvents<Events = {}> { | ||
add: { | ||
event: keyof Events; | ||
handler: EmitterHandler<unknown>; | ||
all: Set<EmitterHandler<unknown>>; | ||
}; | ||
remove: { | ||
event: keyof Events; | ||
handler: EmitterHandler<unknown>; | ||
all: Set<EmitterHandler<unknown>>; | ||
}; | ||
} | ||
export interface EmitterWithInternals<Events = {}> extends Emitter<Events> { | ||
readonly internal: Emitter<EmitterInternalEvents<Events>>; | ||
} | ||
export function createEmitterWithInternals< | ||
Events = {}, | ||
>(): EmitterWithInternals<Events> { | ||
const internal = createEmitter<EmitterInternalEvents<Events>>(); | ||
const emitter = createEmitter(internal); | ||
(emitter as any).internal = internal; | ||
return emitter as any; | ||
} |
export {on} from './on'; | ||
export {once} from './once'; | ||
export {AbortError, NestedAbortController} from './abort'; | ||
export type {AbortBehavior} from './abort'; | ||
export {createEmitter} from './emitter'; | ||
export type {Emitter, EmitterHandler} from './emitter'; | ||
export { | ||
AbortError, | ||
NestedAbortController, | ||
anyAbortSignal, | ||
raceAgainstAbortSignal, | ||
type AbortBehavior, | ||
} from './abort'; | ||
export {addListener} from './listeners'; | ||
export {createEmitter, createEmitterWithInternals} from './emitter'; | ||
export type { | ||
Emitter, | ||
EmitterHandler, | ||
EmitterInternalEvents, | ||
EmitterWithInternals, | ||
} from './emitter'; | ||
export type { | ||
EventTarget, | ||
@@ -9,0 +20,0 @@ EventTargetOn, |
{ | ||
"extends": "@quilted/typescript/pkg.json", | ||
"extends": "@quilted/typescript/project.json", | ||
"compilerOptions": { | ||
@@ -4,0 +4,0 @@ "rootDir": "source", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
87366
1304