2022-11-16 07:45:10 +00:00
|
|
|
import DHTOnlineBase from "./dhtOnlineBase.js";
|
|
|
|
import DHTFlood from "@lumeweb/dht-flood";
|
|
|
|
|
|
|
|
const DISCONNECT_SMOOTH = 500;
|
|
|
|
|
|
|
|
export default class DHTOnline extends DHTOnlineBase {
|
|
|
|
private flood: DHTFlood;
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
swarm: any,
|
2022-11-16 17:15:51 +00:00
|
|
|
{
|
|
|
|
id = swarm.keyPair.publicKey,
|
|
|
|
data = {},
|
|
|
|
...opts
|
2022-11-16 17:27:53 +00:00
|
|
|
}: { id?: Buffer; data?: {}; [key: string]: any } = {}
|
2022-11-16 07:45:10 +00:00
|
|
|
) {
|
2022-11-20 00:44:55 +00:00
|
|
|
super(id, { swarm, ...(opts as any) });
|
2022-11-16 17:13:00 +00:00
|
|
|
this.flood = new DHTFlood({ id, swarm, ...opts });
|
2022-11-16 07:45:10 +00:00
|
|
|
|
|
|
|
this.flood.on("peer-open", (peer) => this.handlePeerAdd(peer));
|
|
|
|
this.flood.on("peer-remove", (peer) => this.handlePeerRemove(peer));
|
|
|
|
this.flood.on("message", (message, id) => this.onGetBroadcast(message, id));
|
|
|
|
|
|
|
|
this.swarm.on("connection", (peer: any) =>
|
|
|
|
this.flood.send(peer, Buffer.from("hello"), 0)
|
|
|
|
);
|
|
|
|
|
2022-11-16 16:14:44 +00:00
|
|
|
this.data = data;
|
2022-11-16 07:45:10 +00:00
|
|
|
|
|
|
|
[...this.swarm.peers.values()].forEach(this.handlePeerAdd.bind(this));
|
|
|
|
}
|
|
|
|
|
|
|
|
handlePeerAdd(peer: any) {
|
|
|
|
const id = peer.remotePublicKey;
|
|
|
|
this.onAddPeer(id);
|
|
|
|
}
|
|
|
|
|
|
|
|
handlePeerRemove(peer: any) {
|
|
|
|
const id = peer.remotePublicKey;
|
|
|
|
// Wait for a bit and check if we're still disconnected before removing the peer
|
|
|
|
setTimeout(() => {
|
|
|
|
if (this.swarm._allConnections.has(id)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.onRemovePeer(id);
|
|
|
|
}, DISCONNECT_SMOOTH);
|
|
|
|
}
|
|
|
|
|
|
|
|
broadcast(message: any, ttl?: number) {
|
|
|
|
this.flood.broadcast(message, ttl);
|
|
|
|
}
|
|
|
|
}
|