Skip to content

Commit

Permalink
Upgraded dev-dependencies & required Node 20
Browse files Browse the repository at this point in the history
  • Loading branch information
yvann committed Oct 9, 2024
1 parent c435de1 commit 9cbb6de
Show file tree
Hide file tree
Showing 9 changed files with 949 additions and 907 deletions.
3 changes: 1 addition & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@ jobs:

matrix:
node:
- 18
- 20
- 22

include:
- node: 18
- node: 20
publish: true
continue-on-error: false

Expand Down
1 change: 0 additions & 1 deletion .prettierrc.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
singleQuote: true
trailingComma: all
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [6.0.0] - 2023-10-09

### Changed

- Requires Node >=20.10
- Upgraded dependencies

## [5.0.0] - 2023-04-20

### Changed
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
services:
lib:
image: node:18
image: node:20
command: sleep infinity
working_dir: /workspace
volumes:
Expand Down
14 changes: 7 additions & 7 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"url": "https://github.com/prismamedia/ts-async-event-emitter"
},
"engines": {
"node": ">=18.12"
"node": ">=20.10"
},
"type": "module",
"exports": {
Expand All @@ -27,16 +27,16 @@
"format": "prettier --write ."
},
"devDependencies": {
"@jest/globals": "29.7.0",
"@swc/core": "1.7.26",
"@jest/globals": "30.0.0-alpha.6",
"@swc/core": "1.7.28",
"@swc/jest": "0.2.36",
"@tsconfig/node18": "18.2.4",
"@types/node": "18.19.50",
"jest": "29.7.0",
"@tsconfig/node20": "20.1.4",
"@types/node": "20.16.11",
"jest": "30.0.0-alpha.6",
"prettier": "3.3.3",
"publint": "0.2.11",
"type-fest": "4.26.1",
"typescript": "5.6.2"
"typescript": "5.6.3"
},
"packageManager": "[email protected]"
}
2 changes: 1 addition & 1 deletion src/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ describe('EventEmitter', () => {

await expect(
Promise.all([ee.throwOnError(), ee.emit('error', new Error('KO'))]),
).rejects.toThrowError('KO');
).rejects.toThrow('KO');

// handles signal
{
Expand Down
72 changes: 40 additions & 32 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export { errorMonitor };

type Maybe<T> = undefined | null | T;
type ValueOrArray<T> = T | Array<T>;
type OnAbort = (event: Event) => void;

export type EventDataByName = Record<keyof any, any>;

Expand Down Expand Up @@ -111,6 +112,7 @@ export class AsyncEventEmitter<TDataByName extends EventDataByName = any> {
eventName: TName,
listener: EventListener<TDataByName, TName>,
signal?: AbortSignal | number | null,
onAbort?: OnAbort,
): BoundOff;

/**
Expand All @@ -120,6 +122,7 @@ export class AsyncEventEmitter<TDataByName extends EventDataByName = any> {
public on(
configByName: EventConfigByName<TDataByName>,
signal?: AbortSignal | number | null,
onAbort?: OnAbort,
): BoundOff;

public on<TName extends EventName<TDataByName>>(
Expand All @@ -128,16 +131,19 @@ export class AsyncEventEmitter<TDataByName extends EventDataByName = any> {
eventName: TName,
listener: EventListener<TDataByName, TName>,
signal?: AbortSignal | number | null,
onAbort?: OnAbort,
]
| [
configByName: EventConfigByName<TDataByName>,
signal?: AbortSignal | number | null,
onAbort?: OnAbort,
]
): BoundOff {
if (typeof args[0] === 'object' && args[0] != null) {
const [configByName, maybeSignal] = args as [
EventConfigByName<TDataByName>,
AbortSignal | number | null | undefined,
const [configByName, maybeSignal, maybeOnAbort] = args as [
configByName: EventConfigByName<TDataByName>,
maybeSignal?: AbortSignal | number | null,
maybeOnAbort?: OnAbort,
];

const signal =
Expand All @@ -156,7 +162,7 @@ export class AsyncEventEmitter<TDataByName extends EventDataByName = any> {
const listeners = Array.isArray(configs) ? configs : [configs];
for (const listener of listeners) {
if (listener != null) {
offs.push(this.on(eventName, listener, signal));
offs.push(this.on(eventName, listener, signal, maybeOnAbort));
}
}
}
Expand All @@ -165,10 +171,11 @@ export class AsyncEventEmitter<TDataByName extends EventDataByName = any> {
return () => offs.forEach((off) => off());
}

const [eventName, listener, maybeSignal] = args as [
TName,
EventListener<TDataByName, TName>,
AbortSignal | number | null | undefined,
const [eventName, listener, maybeSignal, maybeOnAbort] = args as [
eventName: TName,
listener: EventListener<TDataByName, TName>,
maybeSignal?: AbortSignal | number | null,
maybeOnAbort?: OnAbort,
];

if (!['number', 'string', 'symbol'].includes(typeof eventName)) {
Expand Down Expand Up @@ -215,10 +222,16 @@ export class AsyncEventEmitter<TDataByName extends EventDataByName = any> {

if (signal) {
signal.throwIfAborted();

maybeOnAbort &&
signal.addEventListener('abort', maybeOnAbort, { once: true });
signal.addEventListener('abort', off, { once: true });

Object.assign(wrappedListener, {
[unsubscribeFromSignalAbortEvent]: () =>
signal.removeEventListener('abort', off),
[unsubscribeFromSignalAbortEvent]: () => {
maybeOnAbort && signal.removeEventListener('abort', maybeOnAbort);
signal.removeEventListener('abort', off);
},
});
}

Expand All @@ -235,15 +248,17 @@ export class AsyncEventEmitter<TDataByName extends EventDataByName = any> {
eventName: TName,
listener: EventListener<TDataByName, TName>,
signal?: AbortSignal | number | null,
onAbort?: OnAbort,
): BoundOff {
const off = this.on(
eventName,
async (eventData) => {
(eventData) => {
off();

await listener(eventData);
return listener(eventData);
},
signal,
onAbort,
);

return off;
Expand All @@ -260,27 +275,20 @@ export class AsyncEventEmitter<TDataByName extends EventDataByName = any> {

signal?.throwIfAborted();

return new Promise((resolve, reject) => {
const onAbort = () => {
off();

reject(
new AbortError(
`The wait of the "${String(eventName)}" event has been aborted`,
{ cause: signal?.reason },
return new Promise((resolve, reject) =>
this.once(
eventName,
(eventData) => resolve(eventData),
signal,
() =>
reject(
new AbortError(
`The wait of the "${String(eventName)}" event has been aborted`,
signal?.reason && { cause: signal.reason },
),
),
);
};

signal?.addEventListener('abort', onAbort, { once: true });

const off = this.on(eventName, (eventData) => {
off();
signal?.removeEventListener('abort', onAbort);

resolve(eventData);
});
});
),
);
}

public async throwOnError(
Expand Down
7 changes: 4 additions & 3 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
{
"extends": "@tsconfig/node18",
"extends": "@tsconfig/node20",

"include": ["src/**/*.ts"],

"compilerOptions": {
"composite": true,
"experimentalDecorators": true,

"sourceMap": true,
"declaration": true,
"declarationMap": true,
"experimentalDecorators": true,

"rootDir": "src",
"outDir": "dist"
Expand Down
Loading

0 comments on commit 9cbb6de

Please sign in to comment.