@libp2p/interface 2.10.2 → 2.10.3

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.
Files changed (44) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/index.min.js.map +3 -3
  3. package/dist/src/index.d.ts +4 -5
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +1 -2
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/keys.d.ts +9 -8
  8. package/dist/src/keys.d.ts.map +1 -1
  9. package/dist/src/keys.js.map +1 -1
  10. package/dist/src/peer-discovery.d.ts +1 -1
  11. package/dist/src/peer-discovery.d.ts.map +1 -1
  12. package/dist/src/peer-store.d.ts +17 -9
  13. package/dist/src/peer-store.d.ts.map +1 -1
  14. package/dist/src/peer-store.js.map +1 -1
  15. package/dist/src/pubsub.d.ts +1 -1
  16. package/dist/src/pubsub.d.ts.map +1 -1
  17. package/dist/src/stream-handler.d.ts +2 -1
  18. package/dist/src/stream-handler.d.ts.map +1 -1
  19. package/dist/src/transport.d.ts +1 -1
  20. package/dist/src/transport.d.ts.map +1 -1
  21. package/dist/typedoc-urls.json +1 -6
  22. package/package.json +4 -9
  23. package/src/index.ts +4 -5
  24. package/src/keys.ts +9 -8
  25. package/src/peer-discovery.ts +1 -1
  26. package/src/peer-store.ts +19 -9
  27. package/src/pubsub.ts +1 -1
  28. package/src/stream-handler.ts +2 -1
  29. package/src/transport.ts +1 -1
  30. package/dist/src/event-target.d.ts +0 -36
  31. package/dist/src/event-target.d.ts.map +0 -1
  32. package/dist/src/event-target.js +0 -55
  33. package/dist/src/event-target.js.map +0 -1
  34. package/dist/src/events.browser.d.ts +0 -5
  35. package/dist/src/events.browser.d.ts.map +0 -1
  36. package/dist/src/events.browser.js +0 -5
  37. package/dist/src/events.browser.js.map +0 -1
  38. package/dist/src/events.d.ts +0 -6
  39. package/dist/src/events.d.ts.map +0 -1
  40. package/dist/src/events.js +0 -13
  41. package/dist/src/events.js.map +0 -1
  42. package/src/event-target.ts +0 -106
  43. package/src/events.browser.ts +0 -4
  44. package/src/events.ts +0 -12
package/src/peer-store.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { AbortOptions } from './index.ts'
1
2
  import type { PublicKey } from './keys.js'
2
3
  import type { PeerId } from './peer-id.js'
3
4
  import type { PeerInfo } from './peer-info.js'
@@ -147,13 +148,17 @@ export interface PeerQueryOrder { (a: Peer, b: Peer): -1 | 0 | 1 }
147
148
  /**
148
149
  * A query for getting lists of peers
149
150
  */
150
- export interface PeerQuery {
151
+ export interface PeerQuery extends AbortOptions {
151
152
  filters?: PeerQueryFilter[]
152
153
  orders?: PeerQueryOrder[]
153
154
  limit?: number
154
155
  offset?: number
155
156
  }
156
157
 
158
+ export interface ConsumePeerRecordOptions extends AbortOptions {
159
+ expectedPeer?: PeerId
160
+ }
161
+
157
162
  export interface PeerStore {
158
163
  /**
159
164
  * Loop over every peer - the looping is async because we read from a
@@ -201,7 +206,7 @@ export interface PeerStore {
201
206
  * // []
202
207
  * ```
203
208
  */
204
- delete(peerId: PeerId): Promise<void>
209
+ delete(peerId: PeerId, options?: AbortOptions): Promise<void>
205
210
 
206
211
  /**
207
212
  * Returns true if the passed PeerId is in the peer store
@@ -216,7 +221,7 @@ export interface PeerStore {
216
221
  * // true
217
222
  * ```
218
223
  */
219
- has(peerId: PeerId): Promise<boolean>
224
+ has(peerId: PeerId, options?: AbortOptions): Promise<boolean>
220
225
 
221
226
  /**
222
227
  * Returns all data stored for the passed PeerId
@@ -228,7 +233,7 @@ export interface PeerStore {
228
233
  * // { .. }
229
234
  * ```
230
235
  */
231
- get(peerId: PeerId): Promise<Peer>
236
+ get(peerId: PeerId, options?: AbortOptions): Promise<Peer>
232
237
 
233
238
  /**
234
239
  * Returns a PeerInfo object for the passed peer id. This is similar to `get`
@@ -254,7 +259,7 @@ export interface PeerStore {
254
259
  * // }
255
260
  * ```
256
261
  */
257
- getInfo (peerId: PeerId): Promise<PeerInfo>
262
+ getInfo (peerId: PeerId, options?: AbortOptions): Promise<PeerInfo>
258
263
 
259
264
  /**
260
265
  * Adds a peer to the peer store, overwriting any existing data
@@ -267,7 +272,7 @@ export interface PeerStore {
267
272
  * })
268
273
  * ```
269
274
  */
270
- save(id: PeerId, data: PeerData): Promise<Peer>
275
+ save(id: PeerId, data: PeerData, options?: AbortOptions): Promise<Peer>
271
276
 
272
277
  /**
273
278
  * Adds a peer to the peer store, overwriting only the passed fields
@@ -280,7 +285,7 @@ export interface PeerStore {
280
285
  * })
281
286
  * ```
282
287
  */
283
- patch(id: PeerId, data: PeerData): Promise<Peer>
288
+ patch(id: PeerId, data: PeerData, options?: AbortOptions): Promise<Peer>
284
289
 
285
290
  /**
286
291
  * Adds a peer to the peer store, deeply merging any existing data.
@@ -293,7 +298,7 @@ export interface PeerStore {
293
298
  * })
294
299
  * ```
295
300
  */
296
- merge(id: PeerId, data: PeerData): Promise<Peer>
301
+ merge(id: PeerId, data: PeerData, options?: AbortOptions): Promise<Peer>
297
302
 
298
303
  /**
299
304
  * Unmarshal and verify a signed peer record, extract the multiaddrs and
@@ -308,5 +313,10 @@ export interface PeerStore {
308
313
  * await peerStore.consumePeerRecord(buf, expectedPeer)
309
314
  * ```
310
315
  */
311
- consumePeerRecord(buf: Uint8Array, expectedPeer?: PeerId): Promise<boolean>
316
+ consumePeerRecord(buf: Uint8Array, options?: ConsumePeerRecordOptions): Promise<boolean>
317
+
318
+ /**
319
+ * @deprecated Pass `expectedPeer` as a property of `options` instead
320
+ */
321
+ consumePeerRecord(buf: Uint8Array, expectedPeer?: PeerId, options?: AbortOptions): Promise<boolean>
312
322
  }
package/src/pubsub.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import type { Stream } from './connection.js'
2
- import type { TypedEventTarget } from './event-target.js'
3
2
  import type { PublicKey } from './keys.js'
4
3
  import type { PeerId } from './peer-id.js'
5
4
  import type { Pushable } from 'it-pushable'
5
+ import type { TypedEventTarget } from 'main-event'
6
6
  import type { Uint8ArrayList } from 'uint8arraylist'
7
7
 
8
8
  /**
@@ -1,4 +1,5 @@
1
1
  import type { Connection, Stream } from './connection.js'
2
+ import type { AbortOptions } from './index.ts'
2
3
 
3
4
  export interface IncomingStreamData {
4
5
  /**
@@ -19,7 +20,7 @@ export interface StreamHandler {
19
20
  (data: IncomingStreamData): void
20
21
  }
21
22
 
22
- export interface StreamHandlerOptions {
23
+ export interface StreamHandlerOptions extends AbortOptions {
23
24
  /**
24
25
  * How many incoming streams can be open for this protocol at the same time on each connection
25
26
  *
package/src/transport.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import type { Connection, ConnectionLimits, MultiaddrConnection } from './connection.js'
2
- import type { TypedEventTarget } from './event-target.js'
3
2
  import type { AbortOptions, ClearableSignal, ConnectionEncrypter } from './index.js'
4
3
  import type { StreamMuxerFactory } from './stream-muxer.js'
5
4
  import type { Multiaddr } from '@multiformats/multiaddr'
5
+ import type { TypedEventTarget } from 'main-event'
6
6
  import type { ProgressOptions, ProgressEvent } from 'progress-events'
7
7
 
8
8
  export interface ListenerEvents {
@@ -1,36 +0,0 @@
1
- export interface EventCallback<EventType> {
2
- (evt: EventType): void;
3
- }
4
- export interface EventObject<EventType> {
5
- handleEvent: EventCallback<EventType>;
6
- }
7
- export type EventHandler<EventType> = EventCallback<EventType> | EventObject<EventType>;
8
- /**
9
- * Adds types to the EventTarget class. Hopefully this won't be necessary
10
- * forever.
11
- *
12
- * https://github.com/microsoft/TypeScript/issues/28357
13
- * https://github.com/microsoft/TypeScript/issues/43477
14
- * https://github.com/microsoft/TypeScript/issues/299
15
- * etc
16
- */
17
- export interface TypedEventTarget<EventMap extends Record<string, any>> extends EventTarget {
18
- addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void;
19
- listenerCount(type: string): number;
20
- removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void;
21
- removeEventListener(type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void;
22
- safeDispatchEvent<Detail>(type: keyof EventMap, detail?: CustomEventInit<Detail>): boolean;
23
- }
24
- /**
25
- * An implementation of a typed event target
26
- */
27
- export declare class TypedEventEmitter<EventMap extends Record<string, any>> extends EventTarget implements TypedEventTarget<EventMap> {
28
- #private;
29
- constructor();
30
- listenerCount(type: string): number;
31
- addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void;
32
- removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void;
33
- dispatchEvent(event: Event): boolean;
34
- safeDispatchEvent<Detail>(type: keyof EventMap, detail?: CustomEventInit<Detail>): boolean;
35
- }
36
- //# sourceMappingURL=event-target.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-target.d.ts","sourceRoot":"","sources":["../../src/event-target.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa,CAAC,SAAS;IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAA;CAAE;AACpE,MAAM,WAAW,WAAW,CAAC,SAAS;IAAI,WAAW,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;CAAE;AACjF,MAAM,MAAM,YAAY,CAAC,SAAS,IAAI,aAAa,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;AAOvF;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB,CAAE,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,WAAW;IAC1F,gBAAgB,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI,CAAA;IAElJ,aAAa,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IAEpC,mBAAmB,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAAA;IAEnJ,mBAAmB,CAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAAA;IAElH,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,EAAE,MAAM,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,GAAG,OAAO,CAAA;CAC3F;AAED;;GAEG;AACH,qBAAa,iBAAiB,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAE,SAAQ,WAAY,YAAW,gBAAgB,CAAC,QAAQ,CAAC;;;IAW5H,aAAa,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAUpC,gBAAgB,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAAG,IAAI;IAiBlJ,mBAAmB,CAAC,CAAC,SAAS,MAAM,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI;IAcnJ,aAAa,CAAE,KAAK,EAAE,KAAK,GAAG,OAAO;IAerC,iBAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,EAAE,MAAM,GAAE,eAAe,CAAC,MAAM,CAAM,GAAG,OAAO;CAG/F"}
@@ -1,55 +0,0 @@
1
- import { setMaxListeners } from './events.js';
2
- /**
3
- * An implementation of a typed event target
4
- */
5
- export class TypedEventEmitter extends EventTarget {
6
- #listeners = new Map();
7
- constructor() {
8
- super();
9
- // silence MaxListenersExceededWarning warning on Node.js, this is a red
10
- // herring almost all of the time
11
- setMaxListeners(Infinity, this);
12
- }
13
- listenerCount(type) {
14
- const listeners = this.#listeners.get(type);
15
- if (listeners == null) {
16
- return 0;
17
- }
18
- return listeners.length;
19
- }
20
- addEventListener(type, listener, options) {
21
- super.addEventListener(type, listener, options);
22
- let list = this.#listeners.get(type);
23
- if (list == null) {
24
- list = [];
25
- this.#listeners.set(type, list);
26
- }
27
- list.push({
28
- callback: listener,
29
- once: (options !== true && options !== false && options?.once) ?? false
30
- });
31
- }
32
- removeEventListener(type, listener, options) {
33
- super.removeEventListener(type.toString(), listener ?? null, options);
34
- let list = this.#listeners.get(type);
35
- if (list == null) {
36
- return;
37
- }
38
- list = list.filter(({ callback }) => callback !== listener);
39
- this.#listeners.set(type, list);
40
- }
41
- dispatchEvent(event) {
42
- const result = super.dispatchEvent(event);
43
- let list = this.#listeners.get(event.type);
44
- if (list == null) {
45
- return result;
46
- }
47
- list = list.filter(({ once }) => !once);
48
- this.#listeners.set(event.type, list);
49
- return result;
50
- }
51
- safeDispatchEvent(type, detail = {}) {
52
- return this.dispatchEvent(new CustomEvent(type, detail));
53
- }
54
- }
55
- //# sourceMappingURL=event-target.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-target.js","sourceRoot":"","sources":["../../src/event-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAgC7C;;GAEG;AACH,MAAM,OAAO,iBAAwD,SAAQ,WAAW;IAC7E,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAA;IAEhD;QACE,KAAK,EAAE,CAAA;QAEP,wEAAwE;QACxE,iCAAiC;QACjC,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,aAAa,CAAE,IAAY;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAE3C,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,OAAO,CAAC,CAAA;QACV,CAAC;QAED,OAAO,SAAS,CAAC,MAAM,CAAA;IACzB,CAAC;IAGD,gBAAgB,CAAE,IAAY,EAAE,QAA6B,EAAE,OAA2C;QACxG,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAE/C,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,IAAI,GAAG,EAAE,CAAA;YACT,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QACjC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC;YACR,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,EAAE,IAAI,CAAC,IAAI,KAAK;SACxE,CAAC,CAAA;IACJ,CAAC;IAGD,mBAAmB,CAAE,IAAY,EAAE,QAA8B,EAAE,OAAwC;QACzG,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,IAAI,IAAI,EAAE,OAAO,CAAC,CAAA;QAErE,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpC,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;QAC3D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,aAAa,CAAE,KAAY;QACzB,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;QAEzC,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAE1C,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QACvC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAErC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,iBAAiB,CAAS,IAAoB,EAAE,SAAkC,EAAE;QAClF,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAS,IAAc,EAAE,MAAM,CAAC,CAAC,CAAA;IAC5E,CAAC;CACF"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Noop for browser compatibility
3
- */
4
- export declare function setMaxListeners(): void;
5
- //# sourceMappingURL=events.browser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.browser.d.ts","sourceRoot":"","sources":["../../src/events.browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,eAAe,IAAK,IAAI,CAAG"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Noop for browser compatibility
3
- */
4
- export function setMaxListeners() { }
5
- //# sourceMappingURL=events.browser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.browser.js","sourceRoot":"","sources":["../../src/events.browser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,eAAe,KAAW,CAAC"}
@@ -1,6 +0,0 @@
1
- import { setMaxListeners as nodeSetMaxListeners } from 'node:events';
2
- /**
3
- * Create a setMaxListeners that doesn't break browser usage
4
- */
5
- export declare const setMaxListeners: typeof nodeSetMaxListeners;
6
- //# sourceMappingURL=events.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEpE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,OAAO,mBAMpC,CAAA"}
@@ -1,13 +0,0 @@
1
- import { setMaxListeners as nodeSetMaxListeners } from 'node:events';
2
- /**
3
- * Create a setMaxListeners that doesn't break browser usage
4
- */
5
- export const setMaxListeners = (n, ...eventTargets) => {
6
- try {
7
- nodeSetMaxListeners(n, ...eventTargets);
8
- }
9
- catch {
10
- // swallow error, gulp
11
- }
12
- };
13
- //# sourceMappingURL=events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,IAAI,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEpE;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAA+B,CAAC,CAAC,EAAE,GAAG,YAAY,EAAE,EAAE;IAChF,IAAI,CAAC;QACH,mBAAmB,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAA;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC,CAAA"}
@@ -1,106 +0,0 @@
1
- import { setMaxListeners } from './events.js'
2
-
3
- export interface EventCallback<EventType> { (evt: EventType): void }
4
- export interface EventObject<EventType> { handleEvent: EventCallback<EventType> }
5
- export type EventHandler<EventType> = EventCallback<EventType> | EventObject<EventType>
6
-
7
- interface Listener {
8
- once: boolean
9
- callback: any
10
- }
11
-
12
- /**
13
- * Adds types to the EventTarget class. Hopefully this won't be necessary
14
- * forever.
15
- *
16
- * https://github.com/microsoft/TypeScript/issues/28357
17
- * https://github.com/microsoft/TypeScript/issues/43477
18
- * https://github.com/microsoft/TypeScript/issues/299
19
- * etc
20
- */
21
- export interface TypedEventTarget <EventMap extends Record<string, any>> extends EventTarget {
22
- addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void
23
-
24
- listenerCount (type: string): number
25
-
26
- removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void
27
-
28
- removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void
29
-
30
- safeDispatchEvent<Detail>(type: keyof EventMap, detail?: CustomEventInit<Detail>): boolean
31
- }
32
-
33
- /**
34
- * An implementation of a typed event target
35
- */
36
- export class TypedEventEmitter<EventMap extends Record<string, any>> extends EventTarget implements TypedEventTarget<EventMap> {
37
- readonly #listeners = new Map<any, Listener[]>()
38
-
39
- constructor () {
40
- super()
41
-
42
- // silence MaxListenersExceededWarning warning on Node.js, this is a red
43
- // herring almost all of the time
44
- setMaxListeners(Infinity, this)
45
- }
46
-
47
- listenerCount (type: string): number {
48
- const listeners = this.#listeners.get(type)
49
-
50
- if (listeners == null) {
51
- return 0
52
- }
53
-
54
- return listeners.length
55
- }
56
-
57
- addEventListener<K extends keyof EventMap>(type: K, listener: EventHandler<EventMap[K]> | null, options?: boolean | AddEventListenerOptions): void
58
- addEventListener (type: string, listener: EventHandler<Event>, options?: boolean | AddEventListenerOptions): void {
59
- super.addEventListener(type, listener, options)
60
-
61
- let list = this.#listeners.get(type)
62
-
63
- if (list == null) {
64
- list = []
65
- this.#listeners.set(type, list)
66
- }
67
-
68
- list.push({
69
- callback: listener,
70
- once: (options !== true && options !== false && options?.once) ?? false
71
- })
72
- }
73
-
74
- removeEventListener<K extends keyof EventMap>(type: K, listener?: EventHandler<EventMap[K]> | null, options?: boolean | EventListenerOptions): void
75
- removeEventListener (type: string, listener?: EventHandler<Event>, options?: boolean | EventListenerOptions): void {
76
- super.removeEventListener(type.toString(), listener ?? null, options)
77
-
78
- let list = this.#listeners.get(type)
79
-
80
- if (list == null) {
81
- return
82
- }
83
-
84
- list = list.filter(({ callback }) => callback !== listener)
85
- this.#listeners.set(type, list)
86
- }
87
-
88
- dispatchEvent (event: Event): boolean {
89
- const result = super.dispatchEvent(event)
90
-
91
- let list = this.#listeners.get(event.type)
92
-
93
- if (list == null) {
94
- return result
95
- }
96
-
97
- list = list.filter(({ once }) => !once)
98
- this.#listeners.set(event.type, list)
99
-
100
- return result
101
- }
102
-
103
- safeDispatchEvent<Detail>(type: keyof EventMap, detail: CustomEventInit<Detail> = {}): boolean {
104
- return this.dispatchEvent(new CustomEvent<Detail>(type as string, detail))
105
- }
106
- }
@@ -1,4 +0,0 @@
1
- /**
2
- * Noop for browser compatibility
3
- */
4
- export function setMaxListeners (): void {}
package/src/events.ts DELETED
@@ -1,12 +0,0 @@
1
- import { setMaxListeners as nodeSetMaxListeners } from 'node:events'
2
-
3
- /**
4
- * Create a setMaxListeners that doesn't break browser usage
5
- */
6
- export const setMaxListeners: typeof nodeSetMaxListeners = (n, ...eventTargets) => {
7
- try {
8
- nodeSetMaxListeners(n, ...eventTargets)
9
- } catch {
10
- // swallow error, gulp
11
- }
12
- }