Sasha eab8ce81b4
feat!: local peer discovery improvements (#2557)
* update local peer discovery, make it configurable for cache

* move to separate file

* up tests, remove local storage from tests

* pass local peer cache options

* add e2e tests

* add aditional e2e tests for local cache

* rename local-peer-cache into peer-cache

* update tests, ci

* prevent filterign ws addresses
2025-08-15 00:14:32 +02:00

74 lines
1.5 KiB
TypeScript

import type { PartialPeerInfo, PeerCache } from "@waku/interfaces";
const isValidStoredPeer = (peer: unknown): boolean => {
return (
!!peer &&
typeof peer === "object" &&
"id" in peer &&
typeof peer.id === "string" &&
"multiaddrs" in peer &&
Array.isArray(peer.multiaddrs)
);
};
/**
* A noop cache that will be used in environments where localStorage is not available.
*/
class NoopCache implements PeerCache {
public get(): PartialPeerInfo[] {
return [];
}
public set(_value: PartialPeerInfo[]): void {
return;
}
public remove(): void {
return;
}
}
/**
* A cache that uses localStorage to store peer information.
*/
class LocalStorageCache implements PeerCache {
public get(): PartialPeerInfo[] {
try {
const cachedPeers = localStorage.getItem("waku:peers");
const peers = cachedPeers ? JSON.parse(cachedPeers) : [];
return peers.filter(isValidStoredPeer);
} catch (e) {
return [];
}
}
public set(_value: PartialPeerInfo[]): void {
try {
localStorage.setItem("waku:peers", JSON.stringify(_value));
} catch (e) {
// ignore
}
}
public remove(): void {
try {
localStorage.removeItem("waku:peers");
} catch (e) {
// ignore
}
}
}
export const defaultCache = (): PeerCache => {
try {
if (typeof localStorage !== "undefined") {
return new LocalStorageCache();
}
} catch (_e) {
// ignore
}
return new NoopCache();
};