mirror of
https://github.com/logos-messaging/logos-messaging-js.git
synced 2026-02-13 12:43:11 +00:00
* remove public pubsub field and redundant util * add hangUp and improve dial operations, improve keepAliveManager and remove unused method, move utils and add tests * improve public dial method to start keep alive checks * move dial method * implement discovery dialer * implement discovery dialer with queue with tests * add discovery dialer e2e tests, change local discovery log tag, update other tests * remove comment * add issue link, remove only * implement shard reader component * create evetns module, remove unused connection manager events and related tests * implement network indicator * implement connection limiter, change public API of connection manager, implement recovery strategy * decouple keep alive maanger * add connection manager js-doc * refactor keep alive manager, cover with tests * add tests for connection manager main facade * add tests for connection limiter * add e2e tests for connection manager modules pass js-waku config during test node init remove dns discovery for js-waku * restructure dialing tests * address last e2e tests * address review * add logging for main methods * decouple pure dialer class, update network monitor with specific metrics * remove console.log * remove usage of protocols * update sdk package tests * add connect await promise * add debug for e2e tests * enable only packages tests * use only one file * revert debugging * up interface for netwrok manager * add logs * add more logs * add more logs * add another logs * remove .only * remove log statements * skip the test with follow up
164 lines
4.3 KiB
TypeScript
164 lines
4.3 KiB
TypeScript
import { TypedEventEmitter } from "@libp2p/interface";
|
|
import {
|
|
IdentifyResult,
|
|
PeerDiscovery,
|
|
PeerDiscoveryEvents,
|
|
PeerInfo,
|
|
Startable
|
|
} from "@libp2p/interface";
|
|
import { peerIdFromString } from "@libp2p/peer-id";
|
|
import { multiaddr } from "@multiformats/multiaddr";
|
|
import {
|
|
type Libp2pComponents,
|
|
type LocalStoragePeerInfo,
|
|
Tags
|
|
} from "@waku/interfaces";
|
|
import { getWsMultiaddrFromMultiaddrs, Logger } from "@waku/utils";
|
|
|
|
const log = new Logger("local-cache-discovery");
|
|
|
|
type LocalPeerCacheDiscoveryOptions = {
|
|
tagName?: string;
|
|
tagValue?: number;
|
|
tagTTL?: number;
|
|
};
|
|
|
|
const DEFAULT_LOCAL_TAG_NAME = Tags.LOCAL;
|
|
const DEFAULT_LOCAL_TAG_VALUE = 50;
|
|
const DEFAULT_LOCAL_TAG_TTL = 100_000_000;
|
|
|
|
export class LocalPeerCacheDiscovery
|
|
extends TypedEventEmitter<PeerDiscoveryEvents>
|
|
implements PeerDiscovery, Startable
|
|
{
|
|
private isStarted: boolean;
|
|
private peers: LocalStoragePeerInfo[] = [];
|
|
|
|
public constructor(
|
|
private readonly components: Libp2pComponents,
|
|
private readonly options?: LocalPeerCacheDiscoveryOptions
|
|
) {
|
|
super();
|
|
this.isStarted = false;
|
|
this.peers = this.getPeersFromLocalStorage();
|
|
}
|
|
|
|
public get [Symbol.toStringTag](): string {
|
|
return "@waku/local-peer-cache-discovery";
|
|
}
|
|
|
|
public async start(): Promise<void> {
|
|
if (this.isStarted) return;
|
|
|
|
log.info("Starting Local Storage Discovery");
|
|
this.components.events.addEventListener(
|
|
"peer:identify",
|
|
this.handleNewPeers
|
|
);
|
|
|
|
for (const { id: idStr, address } of this.peers) {
|
|
const peerId = peerIdFromString(idStr);
|
|
if (await this.components.peerStore.has(peerId)) continue;
|
|
|
|
await this.components.peerStore.save(peerId, {
|
|
multiaddrs: [multiaddr(address)],
|
|
tags: {
|
|
[this.options?.tagName ?? DEFAULT_LOCAL_TAG_NAME]: {
|
|
value: this.options?.tagValue ?? DEFAULT_LOCAL_TAG_VALUE,
|
|
ttl: this.options?.tagTTL ?? DEFAULT_LOCAL_TAG_TTL
|
|
}
|
|
}
|
|
});
|
|
|
|
this.dispatchEvent(
|
|
new CustomEvent<PeerInfo>("peer", {
|
|
detail: {
|
|
id: peerId,
|
|
multiaddrs: [multiaddr(address)]
|
|
}
|
|
})
|
|
);
|
|
}
|
|
|
|
log.info(`Discovered ${this.peers.length} peers`);
|
|
|
|
this.isStarted = true;
|
|
}
|
|
|
|
public stop(): void | Promise<void> {
|
|
if (!this.isStarted) return;
|
|
log.info("Stopping Local Storage Discovery");
|
|
this.components.events.removeEventListener(
|
|
"peer:identify",
|
|
this.handleNewPeers
|
|
);
|
|
this.isStarted = false;
|
|
|
|
this.savePeersToLocalStorage();
|
|
}
|
|
|
|
public handleNewPeers = (event: CustomEvent<IdentifyResult>): void => {
|
|
const { peerId, listenAddrs } = event.detail;
|
|
|
|
const websocketMultiaddr = getWsMultiaddrFromMultiaddrs(listenAddrs);
|
|
|
|
const localStoragePeers = this.getPeersFromLocalStorage();
|
|
|
|
const existingPeerIndex = localStoragePeers.findIndex(
|
|
(_peer) => _peer.id === peerId.toString()
|
|
);
|
|
|
|
if (existingPeerIndex >= 0) {
|
|
localStoragePeers[existingPeerIndex].address =
|
|
websocketMultiaddr.toString();
|
|
} else {
|
|
localStoragePeers.push({
|
|
id: peerId.toString(),
|
|
address: websocketMultiaddr.toString()
|
|
});
|
|
}
|
|
|
|
this.peers = localStoragePeers;
|
|
this.savePeersToLocalStorage();
|
|
};
|
|
|
|
private getPeersFromLocalStorage(): LocalStoragePeerInfo[] {
|
|
try {
|
|
const storedPeersData = localStorage.getItem("waku:peers");
|
|
if (!storedPeersData) return [];
|
|
const peers = JSON.parse(storedPeersData);
|
|
return peers.filter(isValidStoredPeer);
|
|
} catch (error) {
|
|
log.error("Error parsing peers from local storage:", error);
|
|
return [];
|
|
}
|
|
}
|
|
|
|
private savePeersToLocalStorage(): void {
|
|
try {
|
|
localStorage.setItem("waku:peers", JSON.stringify(this.peers));
|
|
} catch (error) {
|
|
log.error("Error saving peers to local storage:", error);
|
|
}
|
|
}
|
|
}
|
|
|
|
function isValidStoredPeer(peer: any): peer is LocalStoragePeerInfo {
|
|
return (
|
|
peer &&
|
|
typeof peer === "object" &&
|
|
typeof peer.id === "string" &&
|
|
typeof peer.address === "string"
|
|
);
|
|
}
|
|
|
|
export function wakuLocalPeerCacheDiscovery(): (
|
|
components: Libp2pComponents,
|
|
options?: LocalPeerCacheDiscoveryOptions
|
|
) => LocalPeerCacheDiscovery {
|
|
return (
|
|
components: Libp2pComponents,
|
|
options?: LocalPeerCacheDiscoveryOptions
|
|
) => new LocalPeerCacheDiscovery(components, options);
|
|
}
|