emittery 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -341,7 +341,8 @@ export default class Emittery<
341
341
  */
342
342
  on<Name extends keyof AllEventData>(
343
343
  eventName: Name | readonly Name[],
344
- listener: (eventData: AllEventData[Name]) => void | Promise<void>
344
+ listener: (eventData: AllEventData[Name]) => void | Promise<void>,
345
+ options?: {signal?: AbortSignal}
345
346
  ): UnsubscribeFunction;
346
347
 
347
348
  /**
@@ -520,7 +521,8 @@ export default class Emittery<
520
521
  listener: (
521
522
  eventName: keyof EventData,
522
523
  eventData: EventData[keyof EventData]
523
- ) => void | Promise<void>
524
+ ) => void | Promise<void>,
525
+ options?: {signal?: AbortSignal}
524
526
  ): UnsubscribeFunction;
525
527
 
526
528
  /**
package/index.js CHANGED
@@ -165,13 +165,15 @@ function defaultMethodNamesOrAssert(methodNames) {
165
165
  const isMetaEvent = eventName => eventName === listenerAdded || eventName === listenerRemoved;
166
166
 
167
167
  function emitMetaEvent(emitter, eventName, eventData) {
168
- if (isMetaEvent(eventName)) {
169
- try {
170
- canEmitMetaEvents = true;
171
- emitter.emit(eventName, eventData);
172
- } finally {
173
- canEmitMetaEvents = false;
174
- }
168
+ if (!isMetaEvent(eventName)) {
169
+ return;
170
+ }
171
+
172
+ try {
173
+ canEmitMetaEvents = true;
174
+ emitter.emit(eventName, eventData);
175
+ } finally {
176
+ canEmitMetaEvents = false;
175
177
  }
176
178
  }
177
179
 
@@ -273,7 +275,7 @@ export default class Emittery {
273
275
  }
274
276
  }
275
277
 
276
- on(eventNames, listener) {
278
+ on(eventNames, listener, {signal} = {}) {
277
279
  assertListener(listener);
278
280
 
279
281
  eventNames = Array.isArray(eventNames) ? eventNames : [eventNames];
@@ -295,7 +297,18 @@ export default class Emittery {
295
297
  }
296
298
  }
297
299
 
298
- return this.off.bind(this, eventNames, listener);
300
+ const off = () => {
301
+ this.off(eventNames, listener);
302
+ signal?.removeEventListener('abort', off);
303
+ };
304
+
305
+ signal?.addEventListener('abort', off, {once: true});
306
+
307
+ if (signal?.aborted) {
308
+ off();
309
+ }
310
+
311
+ return off;
299
312
  }
300
313
 
301
314
  off(eventNames, listener) {
@@ -405,14 +418,26 @@ export default class Emittery {
405
418
  /* eslint-enable no-await-in-loop */
406
419
  }
407
420
 
408
- onAny(listener) {
421
+ onAny(listener, {signal} = {}) {
409
422
  assertListener(listener);
410
423
 
411
424
  this.logIfDebugEnabled('subscribeAny', undefined, undefined);
412
425
 
413
426
  anyMap.get(this).add(listener);
414
427
  emitMetaEvent(this, listenerAdded, {listener});
415
- return this.offAny.bind(this, listener);
428
+
429
+ const offAny = () => {
430
+ this.offAny(listener);
431
+ signal?.removeEventListener('abort', offAny);
432
+ };
433
+
434
+ signal?.addEventListener('abort', offAny, {once: true});
435
+
436
+ if (signal?.aborted) {
437
+ offAny();
438
+ }
439
+
440
+ return offAny;
416
441
  }
417
442
 
418
443
  anyEvent() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "emittery",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Simple and modern async event emitter",
5
5
  "license": "MIT",
6
6
  "repository": "sindresorhus/emittery",
@@ -57,7 +57,7 @@
57
57
  "ava": "^4.3.3",
58
58
  "delay": "^5.0.0",
59
59
  "nyc": "^15.1.0",
60
- "p-event": "^5.0.1",
60
+ "p-event": "^6.0.0",
61
61
  "tsd": "^0.23.0",
62
62
  "xo": "^0.55.0"
63
63
  },
package/readme.md CHANGED
@@ -197,7 +197,7 @@ emitter.emit('test');
197
197
  //=> [subscribe]: test
198
198
  ```
199
199
 
200
- #### on(eventName | eventName[], listener)
200
+ #### on(eventName | eventName[], listener, options?: {signal?: AbortSignal})
201
201
 
202
202
  Subscribe to one or more events.
203
203
 
@@ -222,6 +222,21 @@ emitter.emit('🦄', '🌈'); // log => '🌈' x2
222
222
  emitter.emit('🐶', '🍖'); // log => '🍖'
223
223
  ```
224
224
 
225
+ You can pass an [abort signal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) to unsubscribe too:
226
+
227
+ ```js
228
+ import Emittery from 'emittery';
229
+
230
+ const abortController = new AbortController();
231
+
232
+ emitter.on('🐗', data => {
233
+ console.log(data);
234
+ }, {signal: abortController.signal});
235
+
236
+ abortController.abort();
237
+ emitter.emit('🐗', '🍞'); // nothing happens
238
+ ```
239
+
225
240
  ##### Custom subscribable events
226
241
 
227
242
  Emittery exports some symbols which represent "meta" events that can be passed to `Emitter.on` and similar methods.
@@ -399,11 +414,11 @@ Same as above, but it waits for each listener to resolve before triggering the n
399
414
 
400
415
  If any of the listeners throw/reject, the returned promise will be rejected with the error and the remaining listeners will *not* be called.
401
416
 
402
- #### onAny(listener)
417
+ #### onAny(listener, options?: {signal?: AbortSignal})
403
418
 
404
419
  Subscribe to be notified about any event.
405
420
 
406
- Returns a method to unsubscribe.
421
+ Returns a method to unsubscribe. Abort signal is respected too.
407
422
 
408
423
  ##### listener(eventName, data)
409
424