dht-data/src/index.ts

54 lines
1.4 KiB
TypeScript
Raw Normal View History

2022-11-16 07:45:10 +00:00
import DHTOnlineBase from "./dhtOnlineBase.js";
import DHTFlood from "@lumeweb/dht-flood";
2022-11-16 17:08:53 +00:00
import * as stream from "stream";
2022-11-16 07:45:10 +00:00
const DISCONNECT_SMOOTH = 500;
export default class DHTOnline extends DHTOnlineBase {
private flood: DHTFlood;
private swarm: any;
constructor(
swarm: any,
2022-11-16 17:08:53 +00:00
{ id = swarm.keyPair.publicKey, data = {}, protocol, ...opts } = {
protocol: undefined,
}
2022-11-16 07:45:10 +00:00
) {
super(id, opts);
this.flood = new DHTFlood({ id, swarm, protocol, ...opts });
2022-11-16 07:45:10 +00:00
this.swarm = swarm;
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);
}
}