This repository has been archived by the owner on Jun 26, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: move startable and events interfaces (#209)
The index file is a dumping ground for interfaces, move them into their own files to keep things manageable. Also fixes pubsub test to actually shut the nodes down.
- Loading branch information
1 parent
9ca1d2e
commit 8ce8a08
Showing
31 changed files
with
294 additions
and
278 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,70 +1,5 @@ | ||
import { isStartable, Startable } from '@libp2p/interfaces' | ||
|
||
export interface TestSetup<T, SetupArgs = {}> { | ||
setup: (args?: SetupArgs) => Promise<T> | ||
teardown: () => Promise<void> | ||
} | ||
|
||
export async function start (...objs: any[]) { | ||
const startables: Startable[] = [] | ||
|
||
for (const obj of objs) { | ||
if (isStartable(obj)) { | ||
startables.push(obj) | ||
} | ||
} | ||
|
||
await Promise.all( | ||
startables.map(async s => { | ||
if (s.beforeStart != null) { | ||
await s.beforeStart() | ||
} | ||
}) | ||
) | ||
|
||
await Promise.all( | ||
startables.map(async s => { | ||
await s.start() | ||
}) | ||
) | ||
|
||
await Promise.all( | ||
startables.map(async s => { | ||
if (s.afterStart != null) { | ||
await s.afterStart() | ||
} | ||
}) | ||
) | ||
} | ||
|
||
export async function stop (...objs: any[]) { | ||
const startables: Startable[] = [] | ||
|
||
for (const obj of objs) { | ||
if (isStartable(obj)) { | ||
startables.push(obj) | ||
} | ||
} | ||
|
||
await Promise.all( | ||
startables.map(async s => { | ||
if (s.beforeStop != null) { | ||
await s.beforeStop() | ||
} | ||
}) | ||
) | ||
|
||
await Promise.all( | ||
startables.map(async s => { | ||
await s.stop() | ||
}) | ||
) | ||
|
||
await Promise.all( | ||
startables.map(async s => { | ||
if (s.afterStop != null) { | ||
await s.afterStop() | ||
} | ||
}) | ||
) | ||
} |
3 changes: 2 additions & 1 deletion
3
packages/libp2p-interface-compliance-tests/src/mocks/connection-manager.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
packages/libp2p-interface-compliance-tests/test/peer-discovery/mock-discovery.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import type { Multiaddr } from '@multiformats/multiaddr' | ||
import type { EventEmitter } from '../events.js' | ||
|
||
export interface AddressManagerEvents { | ||
/** | ||
* Emitted when the current node's addresses change | ||
*/ | ||
'change:addresses': CustomEvent | ||
} | ||
|
||
export interface AddressManager extends EventEmitter<AddressManagerEvents> { | ||
/** | ||
* Get peer listen multiaddrs | ||
*/ | ||
getListenAddrs: () => Multiaddr[] | ||
|
||
/** | ||
* Get peer announcing multiaddrs | ||
*/ | ||
getAnnounceAddrs: () => Multiaddr[] | ||
|
||
/** | ||
* Get observed multiaddrs | ||
*/ | ||
getObservedAddrs: () => Multiaddr[] | ||
|
||
/** | ||
* Add peer observed addresses | ||
*/ | ||
addObservedAddr: (addr: Multiaddr) => void | ||
|
||
/** | ||
* Get the current node's addresses | ||
*/ | ||
getAddresses: () => Multiaddr[] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
|
||
export interface EventCallback<EventType> { (evt: EventType): void } | ||
export type EventHandler<EventType> = EventCallback<EventType> | ({ handleEvent: EventCallback<EventType> }) | null | ||
|
||
interface Listener { | ||
once: boolean | ||
callback: any | ||
} | ||
|
||
/** | ||
* Adds types to the EventTarget class. Hopefully this won't be necessary forever. | ||
* | ||
* https://github.com/microsoft/TypeScript/issues/28357 | ||
* https://github.com/microsoft/TypeScript/issues/43477 | ||
* https://github.com/microsoft/TypeScript/issues/299 | ||
* etc | ||
*/ | ||
export class EventEmitter<EventMap> extends EventTarget { | ||
#listeners: Map<any, Listener[]> = new Map() | ||
|
||
listenerCount (type: string) { | ||
const listeners = this.#listeners.get(type) | ||
|
||
if (listeners == null) { | ||
return 0 | ||
} | ||
|
||
return listeners.length | ||
} | ||
|
||
// @ts-expect-error EventTarget is not typed | ||
addEventListener<U extends keyof EventMap> (type: U, callback: EventHandler<EventMap[U]>, options?: AddEventListenerOptions | boolean) { | ||
// @ts-expect-error EventTarget is not typed | ||
super.addEventListener(type, callback, options) | ||
|
||
let list = this.#listeners.get(type) | ||
|
||
if (list == null) { | ||
list = [] | ||
this.#listeners.set(type, list) | ||
} | ||
|
||
list.push({ | ||
callback, | ||
once: (options !== true && options !== false && options?.once) ?? false | ||
}) | ||
} | ||
|
||
// @ts-expect-error EventTarget is not typed | ||
removeEventListener<U extends keyof EventMap> (type: U, callback?: EventHandler<EventMap[U]> | undefined, options?: EventListenerOptions | boolean) { | ||
// @ts-expect-error EventTarget is not typed | ||
super.removeEventListener(type, callback, options) | ||
|
||
let list = this.#listeners.get(type) | ||
|
||
if (list == null) { | ||
return | ||
} | ||
|
||
list = list.filter(({ callback: cb }) => cb !== callback) | ||
this.#listeners.set(type, list) | ||
} | ||
|
||
dispatchEvent (event: Event): boolean { | ||
const result = super.dispatchEvent(event) | ||
|
||
let list = this.#listeners.get(event.type) | ||
|
||
if (list == null) { | ||
return result | ||
} | ||
|
||
list = list.filter(({ once }) => !once) | ||
this.#listeners.set(event.type, list) | ||
|
||
return result | ||
} | ||
} | ||
|
||
/** | ||
* CustomEvent is a standard event but it's not supported by node. | ||
* | ||
* Remove this when https://github.com/nodejs/node/issues/40678 is closed. | ||
* | ||
* Ref: https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent | ||
*/ | ||
class CustomEventPolyfill<T = any> extends Event { | ||
/** Returns any custom data event was created with. Typically used for synthetic events. */ | ||
public detail: T | ||
|
||
constructor (message: string, data?: EventInit & { detail: T }) { | ||
super(message, data) | ||
// @ts-expect-error could be undefined | ||
this.detail = data?.detail | ||
} | ||
} | ||
|
||
export const CustomEvent = globalThis.CustomEvent ?? CustomEventPolyfill |
Oops, something went wrong.