diff --git a/src/config.js b/src/config.js index 9a19766..c12380d 100644 --- a/src/config.js +++ b/src/config.js @@ -1,5 +1,6 @@ const prefix = 'webpeerjs' export const CONFIG_PREFIX = prefix +export const CONFIG_PROTOCOL = '/'+prefix+'/0.0.1' export const CONFIG_BLOCKSTORE_PATH = prefix+'-blockstore' export const CONFIG_DATASTORE_PATH = prefix+'-datastore' export const CONFIG_DBSTORE_PATH = prefix+'-dbstore' diff --git a/src/webpeerjs.js b/src/webpeerjs.js index 38c9a48..c9955fb 100644 --- a/src/webpeerjs.js +++ b/src/webpeerjs.js @@ -132,11 +132,11 @@ class webpeerjs{ //listen to peer connect event this.#libp2p.addEventListener("peer:connect",async (evt) => { - //console.log(`Connected to ${connection.toString()}`); - const connection = evt.detail; const id = evt.detail.toString() + //console.log('peer:connect '+id,evt) + const connections = this.#libp2p.getConnections().map((con)=>{return {id:con.remotePeer.toString(),addr:con.remoteAddr.toString()}}) const connect = connections.find((con)=>con.id == id) const addr = connect.addr @@ -159,6 +159,22 @@ class webpeerjs{ },1000) } + if(this.#webPeersAddrs.has(id)){ + + let address = [addr] + + //update connected webpeers + const now = new Date().getTime() + const metadata = {addrs:address,last:now} + this.#connectedPeers.set(id,metadata) + this.#webPeersAddrs.set(id,address) + this.#connectedPeersArr.length = 0 + for(const peer of this.#connectedPeers){ + const item = {id:peer[0],address:peer[1].addrs} + this.#connectedPeersArr.push(item) + } + } + }); @@ -381,7 +397,7 @@ class webpeerjs{ const mddr = multiaddr(addr) mddrs.push(mddr) } - //this.#dialMultiaddress(mddrs) + this.#dialMultiaddress(mddrs) } } } @@ -467,6 +483,37 @@ class webpeerjs{ this.#ping() }) + this.#libp2p.addEventListener('peer:identify', (evt) => { + //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail) + if(evt.detail.protocols.includes(config.CONFIG_PROTOCOL)){ + //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail.listenAddrs.toString()) + + const id = evt.detail.peerId.toString() + let address = [] + + for(const addrs of evt.detail.listenAddrs){ + const addr = addrs.toString()+'/p2p/'+id + if(addr.includes('webtransport')){ + address.push(addr) + } + } + + //update connected webpeers + const now = new Date().getTime() + const metadata = {addrs:address,last:now} + this.#connectedPeers.set(id,metadata) + this.#webPeersAddrs.set(id,address) + this.#connectedPeersArr.length = 0 + for(const peer of this.#connectedPeers){ + const item = {id:peer[0],address:peer[1].addrs} + this.#connectedPeersArr.push(item) + } + + if(!this.#webPeersId.includes(id))this.#webPeersId.push(id) + + } + }) + //dial known peers from configuration this.#dialKnownPeers() @@ -482,6 +529,8 @@ class webpeerjs{ //dial random discovered peers //this.#dialdiscoveredpeers() + this.#registerProtocol() + onMetrics((data)=>{ const signal = metrics(data) @@ -555,6 +604,29 @@ class webpeerjs{ PRIVATE FUNCTION */ + async #registerProtocol(){ + const handler = ({ connection, stream, protocol }) => { + // use stream or connection according to the needs + } + + await this.#libp2p.handle(config.CONFIG_PROTOCOL, handler, { + maxInboundStreams: 5, + maxOutboundStreams: 5 + }) + + await this.#libp2p.register(config.CONFIG_PROTOCOL, { + onConnect: (peer, connection) => { + // handle connect + //console.log('handle connect',peer) + }, + onDisconnect: (peer, connection) => { + // handle disconnect + //console.log('handle disconnect',peer) + } + }) + + } + #findHybridPeer(){ setTimeout(async()=>{ for(const target of config.CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){