feat: use light push and filter to access Waku network

This commit is contained in:
fryorcraken.eth 2022-08-20 18:31:52 +10:00
parent 257e4910a1
commit a3fe2709db
No known key found for this signature in database
GPG Key ID: A82ED75A8DFC50A4
2 changed files with 54 additions and 32 deletions

View File

@ -5,7 +5,8 @@
- Private Messaging - Private Messaging
- React/TypeScript - React/TypeScript
- Waku Light Push - Waku Light Push
- Signature with Web3 - Waku Filter
- Signature with Web3 (EIP-712, sign typed data)
- Asymmetric Encryption - Asymmetric Encryption
- Symmetric Encryption - Symmetric Encryption

View File

@ -67,6 +67,10 @@ const useStyles = makeStyles({
function App() { function App() {
const [waku, setWaku] = useState<Waku>(); const [waku, setWaku] = useState<Waku>();
const [unsubscribePublicKeyMsg, setUnsubscribePublicKeyMsg] =
useState<() => Promise<void>>();
const [unsubscribePrivateMsg, setUnsubscribePrivateMsg] =
useState<() => Promise<void>>();
const [provider, setProvider] = useState<Web3Provider>(); const [provider, setProvider] = useState<Web3Provider>();
const [encryptionKeyPair, setEncryptionKeyPair] = useState< const [encryptionKeyPair, setEncryptionKeyPair] = useState<
KeyPair | undefined KeyPair | undefined
@ -77,10 +81,10 @@ function App() {
const [messages, setMessages] = useState<Message[]>([]); const [messages, setMessages] = useState<Message[]>([]);
const [address, setAddress] = useState<string>(); const [address, setAddress] = useState<string>();
const [peerStats, setPeerStats] = useState<{ const [peerStats, setPeerStats] = useState<{
relayPeers: number; filterPeers: number;
lightPushPeers: number; lightPushPeers: number;
}>({ }>({
relayPeers: 0, filterPeers: 0,
lightPushPeers: 0, lightPushPeers: 0,
}); });
@ -88,15 +92,15 @@ function App() {
// Waku initialization // Waku initialization
useEffect(() => { useEffect(() => {
if (waku) return; (async () => {
initWaku() if (waku) return;
.then((_waku) => {
console.log("waku: ready"); const _waku = await initWaku();
setWaku(_waku); console.log("waku: ready");
}) setWaku(_waku);
.catch((e) => { })().catch((e) => {
console.error("Failed to initiate Waku", e); console.error("Failed to initiate Waku", e);
}); });
}, [waku]); }, [waku]);
useEffect(() => { useEffect(() => {
@ -108,30 +112,40 @@ function App() {
setPublicKeys setPublicKeys
); );
waku.relay.addDecryptionKey(PublicKeyMessageEncryptionKey); waku.filter.addDecryptionKey(PublicKeyMessageEncryptionKey);
waku.relay.addObserver(observerPublicKeyMessage, [PublicKeyContentTopic]); waku.filter
.subscribe(observerPublicKeyMessage, [PublicKeyContentTopic])
.then(
(unsubscribe) => {
setUnsubscribePublicKeyMsg(unsubscribe);
},
(e) => {
console.error("Failed to subscribe", e);
}
);
return function cleanUp() { return function cleanUp() {
if (!waku) return; if (!waku) return;
if (!unsubscribePublicKeyMsg) return;
waku.relay.deleteDecryptionKey(PublicKeyMessageEncryptionKey); waku.filter.deleteDecryptionKey(PublicKeyMessageEncryptionKey);
waku.relay.deleteObserver(observerPublicKeyMessage, [ unsubscribePublicKeyMsg().catch((e) =>
PublicKeyContentTopic, console.error("Failed to unsubscribe", e)
]); );
}; };
}, [waku, address]); }, [waku, address, unsubscribePublicKeyMsg]);
useEffect(() => { useEffect(() => {
if (!waku) return; if (!waku) return;
if (!encryptionKeyPair) return; if (!encryptionKeyPair) return;
waku.relay.addDecryptionKey(encryptionKeyPair.privateKey); waku.filter.addDecryptionKey(encryptionKeyPair.privateKey);
return function cleanUp() { return function cleanUp() {
if (!waku) return; if (!waku) return;
if (!encryptionKeyPair) return; if (!encryptionKeyPair) return;
waku.relay.deleteDecryptionKey(encryptionKeyPair.privateKey); waku.filter.deleteDecryptionKey(encryptionKeyPair.privateKey);
}; };
}, [waku, encryptionKeyPair]); }, [waku, encryptionKeyPair]);
@ -146,28 +160,35 @@ function App() {
address address
); );
waku.relay.addObserver(observerPrivateMessage, [ waku.filter
PrivateMessageContentTopic, .subscribe(observerPrivateMessage, [PrivateMessageContentTopic])
]); .then(
(unsubscribe) => {
setUnsubscribePrivateMsg(unsubscribe);
},
(e) => {
console.error("Failed to subscribe", e);
}
);
return function cleanUp() { return function cleanUp() {
if (!waku) return; if (!waku) return;
if (!observerPrivateMessage) return; if (!unsubscribePrivateMsg) return;
waku.relay.deleteObserver(observerPrivateMessage, [ unsubscribePrivateMsg().catch((e) =>
PrivateMessageContentTopic, console.error("Failed to unsubscribe", e)
]); );
}; };
}, [waku, address, encryptionKeyPair]); }, [waku, address, encryptionKeyPair, unsubscribePrivateMsg]);
useEffect(() => { useEffect(() => {
if (!waku) return; if (!waku) return;
const interval = setInterval(async () => { const interval = setInterval(async () => {
const lightPushPeers = await waku.store.peers(); const lightPushPeers = await waku.store.peers();
const relayPeers = waku.relay.getMeshPeers(); const filterPeers = await waku.filter.peers();
setPeerStats({ setPeerStats({
relayPeers: relayPeers.length, filterPeers: filterPeers.length,
lightPushPeers: lightPushPeers.length, lightPushPeers: lightPushPeers.length,
}); });
}, 1000); }, 1000);
@ -196,7 +217,7 @@ function App() {
/> />
</IconButton> </IconButton>
<Typography className={classes.peers} aria-label="connected-peers"> <Typography className={classes.peers} aria-label="connected-peers">
Peers: {peerStats.relayPeers} relay, {peerStats.lightPushPeers}{" "} Peers: {peerStats.filterPeers} filter, {peerStats.lightPushPeers}{" "}
light push light push
</Typography> </Typography>
<Typography variant="h6" className={classes.title}> <Typography variant="h6" className={classes.title}>