webpeerjs 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,9 +3,28 @@
3
3
 
4
4
  WebpeerJS enables browser to browser connectivity without a central server.
5
5
 
6
- [Demo](https://nuzulul.github.io/webpeerjs/demo/)
6
+ [Live Demo](https://nuzulul.github.io/webpeerjs/demo/)
7
7
 
8
- ## Example
8
+ ## Features
9
+
10
+ * ✅ Decentralized Network
11
+ * ✅ Broadcast Message
12
+
13
+ ## Install
14
+
15
+ NPM :
16
+
17
+ ```
18
+ npm i webpeerjs
19
+ ```
20
+
21
+ CDN :
22
+
23
+ ```
24
+ <script src="https://cdn.jsdelivr.net/npm/webpeerjs@0.0/dist/umd/webpeerjs.min.js"></script>
25
+ ```
26
+
27
+ ## Usage
9
28
 
10
29
  ```
11
30
  import { webpeerjs } from 'webpeerjs'
@@ -16,7 +35,7 @@ void async function main() {
16
35
 
17
36
  console.log(`My node id : ${node.id}`)
18
37
 
19
- const [send,listen,members] = node.joinRoom('myroom')
38
+ const [broadcast,listen,members] = node.joinRoom('myroom')
20
39
 
21
40
  listen((message,id) => {
22
41
  console.log(`Message from ${id} : ${message}`)
@@ -24,35 +43,26 @@ void async function main() {
24
43
 
25
44
  members((data) => {
26
45
  console.log(`Members : ${data}`)
27
- send('hello')
46
+ broadcast('hello')
28
47
  })
29
48
 
30
49
  }()
31
50
  ```
32
51
 
33
- ## Install
34
-
35
- NPM :
36
-
37
- ```
38
- npm i webpeerjs
39
- ```
40
-
41
- CDN :
42
-
43
- ```
44
- <script src="https://cdn.jsdelivr.net/npm/webpeerjs@0.0/dist/umd/webpeerjs.min.js"></script>
45
- ```
46
-
47
52
  ## API
48
53
 
49
- - `createWebpeer()` Create a new local node.
50
- - `id` The unique ID of the local node as an identity in the global network.
51
- - `joinRoom()` Adding a local node to the room, returns an array of three functions (Sender, onListen, onMembers).
54
+ - `createWebpeer()` Create a new node.
55
+ - `id` The unique ID of the node as an identity in the global network.
56
+ - `joinRoom()` Adding the node to the room, returns an array of three functions (Broadcaster, onListenMessage, onMembersUpdate).
52
57
  - `peers` Get all connected peers.
58
+ - `status` Get the node status, returns `connected` or `unconnected`.
59
+
60
+ ## Related
53
61
 
54
- ## License
62
+ - [simple-peer](https://github.com/feross/simple-peer) - Simple WebRTC video, voice, and data channels.
63
+ - [peerjs](https://github.com/peers/peerjs) - Simple peer-to-peer with WebRTC.
64
+ - [trystero](https://github.com/dmotz/trystero) - Build instant multiplayer webapps, no server required.
55
65
 
56
- MIT License
66
+ ## Maintainers
57
67
 
58
- Copyright (c) 2024 [Nuzulul Zulkarnain](https://github.com/nuzulul)
68
+ [Nuzulul Zulkarnain](https://github.com/nuzulul)
@@ -2,7 +2,7 @@ export class webpeerjs {
2
2
  static createWebpeer(): Promise<webpeerjs>;
3
3
  constructor(libp2p: any, dbstore: any, onMetrics: any);
4
4
  id: any;
5
- status: any;
5
+ status: string;
6
6
  IPFS: {
7
7
  libp2p: any;
8
8
  discoveredPeers: Map<any, any>;
@@ -19,6 +19,7 @@ import { simpleMetrics } from '@libp2p/simple-metrics';
19
19
 
20
20
  const prefix$1 = 'webpeerjs';
21
21
  const CONFIG_PREFIX = prefix$1;
22
+ const CONFIG_PROTOCOL = '/'+prefix$1+'/0.0.1';
22
23
  const CONFIG_DBSTORE_PATH = prefix$1+'-dbstore';
23
24
  const CONFIG_MAX_CONNECTIONS = 100;
24
25
  const CONFIG_MIN_CONNECTIONS = 0;
@@ -29,15 +30,11 @@ const CONFIG_PEER_DISCOVERY_WEBPEERJS= prefix$1+'-peer-discovery';
29
30
  const CONFIG_PUBSUB_PEER_DISCOVERY = [CONFIG_PEER_DISCOVERY_GLOBAL, CONFIG_PEER_DISCOVERY_UNIVERSAL_CONNECTIVITY, CONFIG_PEER_DISCOVERY_WEBPEERJS];
30
31
  const CONFIG_DELEGATED_API = 'https://delegated-ipfs.dev';
31
32
 
32
- const CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS = [
33
- ];
34
-
35
- const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = [
33
+ const CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS = [
36
34
  'QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',
37
35
  'QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
38
36
  'QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt',
39
37
  'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ',
40
- '12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr',
41
38
  '12D3KooWPEDBmt7vm6FNNYuqaA4n2qMUZ6wPK5NcRc8t6KpqgRkV',
42
39
  '12D3KooWSHbugDEQeWm2LjtRRMpNgLu6oZ8zkX8XcTwYMAewVekP',
43
40
  '12D3KooWASoxFpwwy8JDdu4Tm57mhESsnbFPogam9VVmhR95FGXr',
@@ -50,6 +47,11 @@ const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = [
50
47
 
51
48
  const CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS = [
52
49
  '12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr'
50
+ ];
51
+
52
+ const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS.concat(CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS);
53
+
54
+ const CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS = [
53
55
  ];
54
56
 
55
57
  /* eslint-disable import/export */
@@ -241,16 +243,16 @@ function metrics(data){
241
243
  fail = errors+timeouts;
242
244
  const treshold = errors+timeouts+stats.open+stats.pending;
243
245
 
244
- if(treshold>60){
246
+ if(treshold>40){
245
247
  //console.log(`Treeshold hit : ${treshold}`)
246
248
  }
247
249
 
248
- if(fail>60){
250
+ if(fail>40){
249
251
  //console.log(`Open : ${stats.open} , Pending : ${stats.pending} , Succes : ${totals.success} , Fail : ${fail} `)
250
252
 
251
253
  }
252
254
 
253
- if ((fail-lastfailtreshold)>30){
255
+ if ((fail-lastfailtreshold)>40){
254
256
  if(isDialEnabled){
255
257
  isDialEnabled = false;
256
258
  const str = JSON.stringify({isDialEnabled,fail,lastfailtreshold});
@@ -367,6 +369,8 @@ class webpeerjs{
367
369
  this.status = (function(libp2p) {
368
370
  return libp2p.status
369
371
  })(this.#libp2p);
372
+
373
+ this.status = 'unconnected';
370
374
 
371
375
  this.IPFS = (function(libp2p,discoveredPeers) {
372
376
  const obj = {libp2p,discoveredPeers};
@@ -379,11 +383,11 @@ class webpeerjs{
379
383
  //listen to peer connect event
380
384
  this.#libp2p.addEventListener("peer:connect",async (evt) => {
381
385
 
382
- //console.log(`Connected to ${connection.toString()}`);
383
-
384
386
  evt.detail;
385
387
  const id = evt.detail.toString();
386
388
 
389
+ //console.log('peer:connect '+id,evt)
390
+
387
391
  const connections = this.#libp2p.getConnections().map((con)=>{return {id:con.remotePeer.toString(),addr:con.remoteAddr.toString()}});
388
392
  const connect = connections.find((con)=>con.id == id);
389
393
  const addr = connect.addr;
@@ -406,6 +410,27 @@ class webpeerjs{
406
410
  },1000);
407
411
  }
408
412
 
413
+ if(this.#webPeersId.includes(id)){
414
+
415
+ let address = [addr];
416
+
417
+ if(this.#connectedPeers.has(id)){
418
+ //reset this last seen
419
+ const now = new Date().getTime();
420
+ const metadata = {addrs:address,last:now};
421
+ this.#connectedPeers.set(id,metadata);
422
+ }
423
+ else {
424
+ //add to connected webpeers
425
+ this.#onConnectFn(id);
426
+ const now = new Date().getTime();
427
+ const metadata = {addrs:address,last:now};
428
+ this.#connectedPeers.set(id,metadata);
429
+ this.#updatePeers();
430
+ }
431
+
432
+ }
433
+
409
434
  });
410
435
 
411
436
 
@@ -442,11 +467,7 @@ class webpeerjs{
442
467
  const now = new Date().getTime();
443
468
  const metadata = {addrs:address,last:now};
444
469
  this.#connectedPeers.set(senderPeerId,metadata);
445
- this.#connectedPeersArr.length = 0;
446
- for(const peer of this.#connectedPeers){
447
- const item = {id:peer[0],address:peer[1].addrs};
448
- this.#connectedPeersArr.push(item);
449
- }
470
+ this.#updatePeers();
450
471
  }
451
472
 
452
473
  //dial if not connected
@@ -510,11 +531,7 @@ class webpeerjs{
510
531
  const metadata = {addrs:address,last:now};
511
532
  this.#connectedPeers.set(id,metadata);
512
533
  this.#webPeersAddrs.set(id,address);
513
- this.#connectedPeersArr.length = 0;
514
- for(const peer of this.#connectedPeers){
515
- const item = {id:peer[0],address:peer[1].addrs};
516
- this.#connectedPeersArr.push(item);
517
- }
534
+ this.#updatePeers();
518
535
  }
519
536
 
520
537
 
@@ -560,17 +577,6 @@ class webpeerjs{
560
577
  if(signal == 'ping'){
561
578
  //console.log('rooms',rooms)
562
579
  }
563
-
564
- //update connected webpeers
565
- const now = new Date().getTime();
566
- const metadata = {addrs:address,last:now};
567
- this.#connectedPeers.set(id,metadata);
568
- this.#webPeersAddrs.set(id,address);
569
- this.#connectedPeersArr.length = 0;
570
- for(const peer of this.#connectedPeers){
571
- const item = {id:peer[0],address:peer[1].addrs};
572
- this.#connectedPeersArr.push(item);
573
- }
574
580
 
575
581
  }
576
582
  }
@@ -621,10 +627,12 @@ class webpeerjs{
621
627
  if(multiaddrs.toString().includes('certhash')&& multiaddrs.toString().includes('webtransport') && multiaddrs.toString().includes('p2p-circuit')){
622
628
  //console.log(addrs)
623
629
  if(!this.#connections.has(id)){
630
+ let mddrs = [];
624
631
  for(const addr of addrs){
625
- multiaddr(addr);
632
+ const mddr = multiaddr(addr);
633
+ mddrs.push(mddr);
626
634
  }
627
- //this.#dialMultiaddress(mddrs)
635
+ this.#dialMultiaddress(mddrs);
628
636
  }
629
637
  }
630
638
  }
@@ -681,10 +689,8 @@ class webpeerjs{
681
689
  //redial if this disconnected peer is regular peer
682
690
  else {
683
691
  const addr = this.#connections.get(id);
684
- let mddrs = [];
685
- const addrs = multiaddr(addr);
686
- mddrs.push(addrs);
687
- this.#dialMultiaddress(mddrs);
692
+ multiaddr(addr);
693
+ //this.#dialMultiaddress(mddrs)
688
694
  }
689
695
  });
690
696
 
@@ -706,6 +712,41 @@ class webpeerjs{
706
712
  this.#ping();
707
713
  });
708
714
 
715
+ this.#libp2p.addEventListener('peer:identify', (evt) => {
716
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
717
+ if(evt.detail.protocols.includes(CONFIG_PROTOCOL)){
718
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
719
+
720
+ const id = evt.detail.peerId.toString();
721
+ let address = [];
722
+
723
+ for(const addrs of evt.detail.listenAddrs){
724
+ const addr = addrs.toString()+'/p2p/'+id;
725
+ if(addr.includes('webtransport')){
726
+ address.push(addr);
727
+ }
728
+ }
729
+
730
+ if(!this.#webPeersId.includes(id))this.#webPeersId.push(id);
731
+
732
+ if(this.#connectedPeers.has(id)){
733
+ //reset this last seen
734
+ const now = new Date().getTime();
735
+ const metadata = {addrs:address,last:now};
736
+ this.#connectedPeers.set(id,metadata);
737
+ }
738
+ else {
739
+ //add to connected webpeers
740
+ this.#onConnectFn(id);
741
+ const now = new Date().getTime();
742
+ const metadata = {addrs:address,last:now};
743
+ this.#connectedPeers.set(id,metadata);
744
+ this.#updatePeers();
745
+ }
746
+
747
+ }
748
+ });
749
+
709
750
  //dial known peers from configuration
710
751
  this.#dialKnownPeers();
711
752
 
@@ -721,6 +762,8 @@ class webpeerjs{
721
762
  //dial random discovered peers
722
763
  //this.#dialdiscoveredpeers()
723
764
 
765
+ this.#registerProtocol();
766
+
724
767
 
725
768
  onMetrics((data)=>{
726
769
  const signal = metrics(data);
@@ -761,6 +804,14 @@ class webpeerjs{
761
804
  }
762
805
  },60e3)*/
763
806
 
807
+ /*setTimeout(async()=>{
808
+ const key = uint8ArrayFromString(config.CONFIG_PREFIX)
809
+ const value = uint8ArrayFromString(this.id)
810
+ for await (const event of this.#libp2p.services.aminoDHT.put(key,value)){
811
+ console.log('put',event)
812
+ }
813
+ },30e3)*/
814
+
764
815
  }
765
816
 
766
817
 
@@ -785,11 +836,48 @@ class webpeerjs{
785
836
  /*
786
837
  PRIVATE FUNCTION
787
838
  */
839
+
840
+ #updatePeers(){
841
+ this.#connectedPeersArr.length = 0;
842
+ for(const peer of this.#connectedPeers){
843
+ const item = {id:peer[0],address:peer[1].addrs};
844
+ this.#connectedPeersArr.push(item);
845
+ }
846
+ if(this.#connectedPeers.size > 0){
847
+ this.status = 'connected';
848
+ }
849
+ else {
850
+ this.status = 'unconnected';
851
+ }
852
+ }
853
+
854
+ async #registerProtocol(){
855
+ const handler = ({ connection, stream, protocol }) => {
856
+ // use stream or connection according to the needs
857
+ };
858
+
859
+ await this.#libp2p.handle(CONFIG_PROTOCOL, handler, {
860
+ maxInboundStreams: 5,
861
+ maxOutboundStreams: 5
862
+ });
863
+
864
+ await this.#libp2p.register(CONFIG_PROTOCOL, {
865
+ onConnect: (peer, connection) => {
866
+ // handle connect
867
+ //console.log('handle connect',peer)
868
+ },
869
+ onDisconnect: (peer, connection) => {
870
+ // handle disconnect
871
+ //console.log('handle disconnect',peer)
872
+ }
873
+ });
874
+
875
+ }
788
876
 
789
877
  #findHybridPeer(){
790
878
  setTimeout(async()=>{
791
879
  for(const target of CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
792
- if(!this.#isConnected(target)){
880
+ if(!this.#isConnected(target) && !this.#connections.has(target) && this.#isDialEnabled ){
793
881
  //console.log('findPeer',target)
794
882
  const peerId = peerIdFromString(target);
795
883
  //const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
@@ -816,13 +904,14 @@ class webpeerjs{
816
904
  }
817
905
  }
818
906
  }
819
- },30e3);
907
+ },60e3);
820
908
  }
821
909
 
822
910
 
823
911
  //check the last seen in web peer
824
912
  #trackLastSeen(){
825
913
  const timeout = 25*1000;
914
+ const forcetimeout = 60*1000;
826
915
  const now = new Date().getTime();
827
916
 
828
917
  //if webpeer last seen grather then timeout send onDisconnect
@@ -830,13 +919,10 @@ class webpeerjs{
830
919
  const id = peer[0];
831
920
  const last = peer[1].last;
832
921
  const time = now-last;
833
- if(time>timeout){
922
+ if((time>timeout && !this.#isConnected(id))||(time>forcetimeout)){
923
+
834
924
  this.#connectedPeers.delete(id);
835
- this.#connectedPeersArr.length = 0;
836
- for(const peer of this.#connectedPeers){
837
- const item = {id:peer[0],address:peer[1].addrs};
838
- this.#connectedPeersArr.push(item);
839
- }
925
+ this.#updatePeers();
840
926
  this.#onDisconnectFn(id);
841
927
 
842
928
  //remove id from room member
@@ -848,6 +934,7 @@ class webpeerjs{
848
934
  this.#rooms[room].onMembers(this.#rooms[room].members);
849
935
  }
850
936
  }
937
+
851
938
  }
852
939
  }
853
940
  }
@@ -895,7 +982,7 @@ class webpeerjs{
895
982
 
896
983
  if(!this.#isDialEnabled)return
897
984
 
898
- const mddrsToDial = 3;
985
+ const mddrsToDial = 5;
899
986
 
900
987
  let queue = [];
901
988
  for(const item of this.#libp2p.getDialQueue()){
@@ -913,6 +1000,8 @@ class webpeerjs{
913
1000
 
914
1001
  if(this.#isConnected(id))continue
915
1002
  if(queue.includes(id)){continue;}
1003
+
1004
+ //console.log('dial',id)
916
1005
 
917
1006
  //dial with webtransport
918
1007
  this.#dialWebtransport(mddrs);
@@ -995,7 +1084,7 @@ class webpeerjs{
995
1084
  },
996
1085
  members : [this.id],
997
1086
  onMembers : () => {},
998
- onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);},
1087
+ onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);this.#ping();},
999
1088
  };
1000
1089
  }
1001
1090
 
@@ -1202,7 +1291,7 @@ class webpeerjs{
1202
1291
  setTimeout(()=>{
1203
1292
  this.#dialSavedKnownID();
1204
1293
  this.#findHybridPeer();
1205
- setTimeout(()=>{this.#dialUpdateSavedKnownID();},60000);
1294
+ setTimeout(()=>{this.#dialUpdateSavedKnownID();},50000);
1206
1295
  setTimeout(()=>{
1207
1296
  const peers = this.#libp2p.getPeers().length;
1208
1297
  if(peers == 0){
@@ -1290,8 +1379,13 @@ class webpeerjs{
1290
1379
  }
1291
1380
 
1292
1381
  async #dialUpdateSavedKnownID(){
1382
+ let firsttime = true;
1293
1383
  for(const target of CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
1294
- if(!this.#connections.has(target)){
1384
+ if(this.#dbstoreData.has(target)){
1385
+ firsttime = false;
1386
+ }
1387
+ if(!this.#connections.has(target) && this.#isDialEnabled && (this.#dbstoreData.has(target) || firsttime)){
1388
+ //console.log('#dialUpdateSavedKnownID()',target)
1295
1389
  const api = CONFIG_DELEGATED_API;
1296
1390
  const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
1297
1391
  const peer = await first(delegatedClient.getPeers(peerIdFromString(target)));
@@ -6,6 +6,7 @@
6
6
 
7
7
  const prefix$1 = 'webpeerjs';
8
8
  const CONFIG_PREFIX = prefix$1;
9
+ const CONFIG_PROTOCOL = '/'+prefix$1+'/0.0.1';
9
10
  const CONFIG_DBSTORE_PATH = prefix$1+'-dbstore';
10
11
  const CONFIG_MAX_CONNECTIONS = 100;
11
12
  const CONFIG_MIN_CONNECTIONS = 0;
@@ -16,15 +17,11 @@
16
17
  const CONFIG_PUBSUB_PEER_DISCOVERY = [CONFIG_PEER_DISCOVERY_GLOBAL, CONFIG_PEER_DISCOVERY_UNIVERSAL_CONNECTIVITY, CONFIG_PEER_DISCOVERY_WEBPEERJS];
17
18
  const CONFIG_DELEGATED_API = 'https://delegated-ipfs.dev';
18
19
 
19
- const CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS = [
20
- ];
21
-
22
- const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = [
20
+ const CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS = [
23
21
  'QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',
24
22
  'QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
25
23
  'QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt',
26
24
  'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ',
27
- '12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr',
28
25
  '12D3KooWPEDBmt7vm6FNNYuqaA4n2qMUZ6wPK5NcRc8t6KpqgRkV',
29
26
  '12D3KooWSHbugDEQeWm2LjtRRMpNgLu6oZ8zkX8XcTwYMAewVekP',
30
27
  '12D3KooWASoxFpwwy8JDdu4Tm57mhESsnbFPogam9VVmhR95FGXr',
@@ -37,6 +34,11 @@
37
34
 
38
35
  const CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS = [
39
36
  '12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr'
37
+ ];
38
+
39
+ const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS.concat(CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS);
40
+
41
+ const CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS = [
40
42
  ];
41
43
 
42
44
  /**
@@ -3350,16 +3352,16 @@
3350
3352
  fail = errors+timeouts;
3351
3353
  const treshold = errors+timeouts+stats.open+stats.pending;
3352
3354
 
3353
- if(treshold>60){
3355
+ if(treshold>40){
3354
3356
  //console.log(`Treeshold hit : ${treshold}`)
3355
3357
  }
3356
3358
 
3357
- if(fail>60){
3359
+ if(fail>40){
3358
3360
  //console.log(`Open : ${stats.open} , Pending : ${stats.pending} , Succes : ${totals.success} , Fail : ${fail} `)
3359
3361
 
3360
3362
  }
3361
3363
 
3362
- if ((fail-lastfailtreshold)>30){
3364
+ if ((fail-lastfailtreshold)>40){
3363
3365
  if(isDialEnabled){
3364
3366
  isDialEnabled = false;
3365
3367
  const str = JSON.stringify({isDialEnabled,fail,lastfailtreshold});
@@ -46152,6 +46154,8 @@
46152
46154
  this.status = (function(libp2p) {
46153
46155
  return libp2p.status
46154
46156
  })(this.#libp2p);
46157
+
46158
+ this.status = 'unconnected';
46155
46159
 
46156
46160
  this.IPFS = (function(libp2p,discoveredPeers) {
46157
46161
  const obj = {libp2p,discoveredPeers};
@@ -46164,11 +46168,11 @@
46164
46168
  //listen to peer connect event
46165
46169
  this.#libp2p.addEventListener("peer:connect",async (evt) => {
46166
46170
 
46167
- //console.log(`Connected to ${connection.toString()}`);
46168
-
46169
46171
  evt.detail;
46170
46172
  const id = evt.detail.toString();
46171
46173
 
46174
+ //console.log('peer:connect '+id,evt)
46175
+
46172
46176
  const connections = this.#libp2p.getConnections().map((con)=>{return {id:con.remotePeer.toString(),addr:con.remoteAddr.toString()}});
46173
46177
  const connect = connections.find((con)=>con.id == id);
46174
46178
  const addr = connect.addr;
@@ -46191,6 +46195,27 @@
46191
46195
  },1000);
46192
46196
  }
46193
46197
 
46198
+ if(this.#webPeersId.includes(id)){
46199
+
46200
+ let address = [addr];
46201
+
46202
+ if(this.#connectedPeers.has(id)){
46203
+ //reset this last seen
46204
+ const now = new Date().getTime();
46205
+ const metadata = {addrs:address,last:now};
46206
+ this.#connectedPeers.set(id,metadata);
46207
+ }
46208
+ else {
46209
+ //add to connected webpeers
46210
+ this.#onConnectFn(id);
46211
+ const now = new Date().getTime();
46212
+ const metadata = {addrs:address,last:now};
46213
+ this.#connectedPeers.set(id,metadata);
46214
+ this.#updatePeers();
46215
+ }
46216
+
46217
+ }
46218
+
46194
46219
  });
46195
46220
 
46196
46221
 
@@ -46227,11 +46252,7 @@
46227
46252
  const now = new Date().getTime();
46228
46253
  const metadata = {addrs:address,last:now};
46229
46254
  this.#connectedPeers.set(senderPeerId,metadata);
46230
- this.#connectedPeersArr.length = 0;
46231
- for(const peer of this.#connectedPeers){
46232
- const item = {id:peer[0],address:peer[1].addrs};
46233
- this.#connectedPeersArr.push(item);
46234
- }
46255
+ this.#updatePeers();
46235
46256
  }
46236
46257
 
46237
46258
  //dial if not connected
@@ -46295,11 +46316,7 @@
46295
46316
  const metadata = {addrs:address,last:now};
46296
46317
  this.#connectedPeers.set(id,metadata);
46297
46318
  this.#webPeersAddrs.set(id,address);
46298
- this.#connectedPeersArr.length = 0;
46299
- for(const peer of this.#connectedPeers){
46300
- const item = {id:peer[0],address:peer[1].addrs};
46301
- this.#connectedPeersArr.push(item);
46302
- }
46319
+ this.#updatePeers();
46303
46320
  }
46304
46321
 
46305
46322
 
@@ -46345,17 +46362,6 @@
46345
46362
  if(signal == 'ping'){
46346
46363
  //console.log('rooms',rooms)
46347
46364
  }
46348
-
46349
- //update connected webpeers
46350
- const now = new Date().getTime();
46351
- const metadata = {addrs:address,last:now};
46352
- this.#connectedPeers.set(id,metadata);
46353
- this.#webPeersAddrs.set(id,address);
46354
- this.#connectedPeersArr.length = 0;
46355
- for(const peer of this.#connectedPeers){
46356
- const item = {id:peer[0],address:peer[1].addrs};
46357
- this.#connectedPeersArr.push(item);
46358
- }
46359
46365
 
46360
46366
  }
46361
46367
  }
@@ -46406,10 +46412,12 @@
46406
46412
  if(multiaddrs.toString().includes('certhash')&& multiaddrs.toString().includes('webtransport') && multiaddrs.toString().includes('p2p-circuit')){
46407
46413
  //console.log(addrs)
46408
46414
  if(!this.#connections.has(id)){
46415
+ let mddrs = [];
46409
46416
  for(const addr of addrs){
46410
- multiaddr(addr);
46417
+ const mddr = multiaddr(addr);
46418
+ mddrs.push(mddr);
46411
46419
  }
46412
- //this.#dialMultiaddress(mddrs)
46420
+ this.#dialMultiaddress(mddrs);
46413
46421
  }
46414
46422
  }
46415
46423
  }
@@ -46466,10 +46474,8 @@
46466
46474
  //redial if this disconnected peer is regular peer
46467
46475
  else {
46468
46476
  const addr = this.#connections.get(id);
46469
- let mddrs = [];
46470
- const addrs = multiaddr(addr);
46471
- mddrs.push(addrs);
46472
- this.#dialMultiaddress(mddrs);
46477
+ multiaddr(addr);
46478
+ //this.#dialMultiaddress(mddrs)
46473
46479
  }
46474
46480
  });
46475
46481
 
@@ -46491,6 +46497,41 @@
46491
46497
  this.#ping();
46492
46498
  });
46493
46499
 
46500
+ this.#libp2p.addEventListener('peer:identify', (evt) => {
46501
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
46502
+ if(evt.detail.protocols.includes(CONFIG_PROTOCOL)){
46503
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
46504
+
46505
+ const id = evt.detail.peerId.toString();
46506
+ let address = [];
46507
+
46508
+ for(const addrs of evt.detail.listenAddrs){
46509
+ const addr = addrs.toString()+'/p2p/'+id;
46510
+ if(addr.includes('webtransport')){
46511
+ address.push(addr);
46512
+ }
46513
+ }
46514
+
46515
+ if(!this.#webPeersId.includes(id))this.#webPeersId.push(id);
46516
+
46517
+ if(this.#connectedPeers.has(id)){
46518
+ //reset this last seen
46519
+ const now = new Date().getTime();
46520
+ const metadata = {addrs:address,last:now};
46521
+ this.#connectedPeers.set(id,metadata);
46522
+ }
46523
+ else {
46524
+ //add to connected webpeers
46525
+ this.#onConnectFn(id);
46526
+ const now = new Date().getTime();
46527
+ const metadata = {addrs:address,last:now};
46528
+ this.#connectedPeers.set(id,metadata);
46529
+ this.#updatePeers();
46530
+ }
46531
+
46532
+ }
46533
+ });
46534
+
46494
46535
  //dial known peers from configuration
46495
46536
  this.#dialKnownPeers();
46496
46537
 
@@ -46506,6 +46547,8 @@
46506
46547
  //dial random discovered peers
46507
46548
  //this.#dialdiscoveredpeers()
46508
46549
 
46550
+ this.#registerProtocol();
46551
+
46509
46552
 
46510
46553
  onMetrics((data)=>{
46511
46554
  const signal = metrics(data);
@@ -46546,6 +46589,14 @@
46546
46589
  }
46547
46590
  },60e3)*/
46548
46591
 
46592
+ /*setTimeout(async()=>{
46593
+ const key = uint8ArrayFromString(config.CONFIG_PREFIX)
46594
+ const value = uint8ArrayFromString(this.id)
46595
+ for await (const event of this.#libp2p.services.aminoDHT.put(key,value)){
46596
+ console.log('put',event)
46597
+ }
46598
+ },30e3)*/
46599
+
46549
46600
  }
46550
46601
 
46551
46602
 
@@ -46570,11 +46621,48 @@
46570
46621
  /*
46571
46622
  PRIVATE FUNCTION
46572
46623
  */
46624
+
46625
+ #updatePeers(){
46626
+ this.#connectedPeersArr.length = 0;
46627
+ for(const peer of this.#connectedPeers){
46628
+ const item = {id:peer[0],address:peer[1].addrs};
46629
+ this.#connectedPeersArr.push(item);
46630
+ }
46631
+ if(this.#connectedPeers.size > 0){
46632
+ this.status = 'connected';
46633
+ }
46634
+ else {
46635
+ this.status = 'unconnected';
46636
+ }
46637
+ }
46638
+
46639
+ async #registerProtocol(){
46640
+ const handler = ({ connection, stream, protocol }) => {
46641
+ // use stream or connection according to the needs
46642
+ };
46643
+
46644
+ await this.#libp2p.handle(CONFIG_PROTOCOL, handler, {
46645
+ maxInboundStreams: 5,
46646
+ maxOutboundStreams: 5
46647
+ });
46648
+
46649
+ await this.#libp2p.register(CONFIG_PROTOCOL, {
46650
+ onConnect: (peer, connection) => {
46651
+ // handle connect
46652
+ //console.log('handle connect',peer)
46653
+ },
46654
+ onDisconnect: (peer, connection) => {
46655
+ // handle disconnect
46656
+ //console.log('handle disconnect',peer)
46657
+ }
46658
+ });
46659
+
46660
+ }
46573
46661
 
46574
46662
  #findHybridPeer(){
46575
46663
  setTimeout(async()=>{
46576
46664
  for(const target of CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
46577
- if(!this.#isConnected(target)){
46665
+ if(!this.#isConnected(target) && !this.#connections.has(target) && this.#isDialEnabled ){
46578
46666
  //console.log('findPeer',target)
46579
46667
  const peerId = peerIdFromString(target);
46580
46668
  //const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
@@ -46601,13 +46689,14 @@
46601
46689
  }
46602
46690
  }
46603
46691
  }
46604
- },30e3);
46692
+ },60e3);
46605
46693
  }
46606
46694
 
46607
46695
 
46608
46696
  //check the last seen in web peer
46609
46697
  #trackLastSeen(){
46610
46698
  const timeout = 25*1000;
46699
+ const forcetimeout = 60*1000;
46611
46700
  const now = new Date().getTime();
46612
46701
 
46613
46702
  //if webpeer last seen grather then timeout send onDisconnect
@@ -46615,13 +46704,10 @@
46615
46704
  const id = peer[0];
46616
46705
  const last = peer[1].last;
46617
46706
  const time = now-last;
46618
- if(time>timeout){
46707
+ if((time>timeout && !this.#isConnected(id))||(time>forcetimeout)){
46708
+
46619
46709
  this.#connectedPeers.delete(id);
46620
- this.#connectedPeersArr.length = 0;
46621
- for(const peer of this.#connectedPeers){
46622
- const item = {id:peer[0],address:peer[1].addrs};
46623
- this.#connectedPeersArr.push(item);
46624
- }
46710
+ this.#updatePeers();
46625
46711
  this.#onDisconnectFn(id);
46626
46712
 
46627
46713
  //remove id from room member
@@ -46633,6 +46719,7 @@
46633
46719
  this.#rooms[room].onMembers(this.#rooms[room].members);
46634
46720
  }
46635
46721
  }
46722
+
46636
46723
  }
46637
46724
  }
46638
46725
  }
@@ -46680,7 +46767,7 @@
46680
46767
 
46681
46768
  if(!this.#isDialEnabled)return
46682
46769
 
46683
- const mddrsToDial = 3;
46770
+ const mddrsToDial = 5;
46684
46771
 
46685
46772
  let queue = [];
46686
46773
  for(const item of this.#libp2p.getDialQueue()){
@@ -46698,6 +46785,8 @@
46698
46785
 
46699
46786
  if(this.#isConnected(id))continue
46700
46787
  if(queue.includes(id)){continue;}
46788
+
46789
+ //console.log('dial',id)
46701
46790
 
46702
46791
  //dial with webtransport
46703
46792
  this.#dialWebtransport(mddrs);
@@ -46780,7 +46869,7 @@
46780
46869
  },
46781
46870
  members : [this.id],
46782
46871
  onMembers : () => {},
46783
- onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);},
46872
+ onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);this.#ping();},
46784
46873
  };
46785
46874
  }
46786
46875
 
@@ -46987,7 +47076,7 @@
46987
47076
  setTimeout(()=>{
46988
47077
  this.#dialSavedKnownID();
46989
47078
  this.#findHybridPeer();
46990
- setTimeout(()=>{this.#dialUpdateSavedKnownID();},60000);
47079
+ setTimeout(()=>{this.#dialUpdateSavedKnownID();},50000);
46991
47080
  setTimeout(()=>{
46992
47081
  const peers = this.#libp2p.getPeers().length;
46993
47082
  if(peers == 0){
@@ -47075,8 +47164,13 @@
47075
47164
  }
47076
47165
 
47077
47166
  async #dialUpdateSavedKnownID(){
47167
+ let firsttime = true;
47078
47168
  for(const target of CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
47079
- if(!this.#connections.has(target)){
47169
+ if(this.#dbstoreData.has(target)){
47170
+ firsttime = false;
47171
+ }
47172
+ if(!this.#connections.has(target) && this.#isDialEnabled && (this.#dbstoreData.has(target) || firsttime)){
47173
+ //console.log('#dialUpdateSavedKnownID()',target)
47080
47174
  const api = CONFIG_DELEGATED_API;
47081
47175
  const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
47082
47176
  const peer = await first$1(delegatedClient.getPeers(peerIdFromString(target)));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webpeerjs",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "Simple peer-to-peer with IPFS",
5
5
  "main": "./dist/umd/webpeerjs.js",
6
6
  "module": "./dist/esm/webpeerjs.js",
package/src/config.js CHANGED
@@ -1,5 +1,6 @@
1
1
  const prefix = 'webpeerjs'
2
2
  export const CONFIG_PREFIX = prefix
3
+ export const CONFIG_PROTOCOL = '/'+prefix+'/0.0.1'
3
4
  export const CONFIG_BLOCKSTORE_PATH = prefix+'-blockstore'
4
5
  export const CONFIG_DATASTORE_PATH = prefix+'-datastore'
5
6
  export const CONFIG_DBSTORE_PATH = prefix+'-dbstore'
@@ -16,15 +17,11 @@ export const CONFIG_DNS_RESOLVER = 'https://dns.google/resolve'
16
17
  export const CONFIG_KNOWN_BOOTSTRAP_DNS = '_dnsaddr.bootstrap.libp2p.io'
17
18
  export const CONFIG_JOIN_ROOM_VERSION = 1
18
19
 
19
- export const CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS = [
20
- ]
21
-
22
- export const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = [
20
+ export const CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS = [
23
21
  'QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',
24
22
  'QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
25
23
  'QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt',
26
24
  'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ',
27
- '12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr',
28
25
  '12D3KooWPEDBmt7vm6FNNYuqaA4n2qMUZ6wPK5NcRc8t6KpqgRkV',
29
26
  '12D3KooWSHbugDEQeWm2LjtRRMpNgLu6oZ8zkX8XcTwYMAewVekP',
30
27
  '12D3KooWASoxFpwwy8JDdu4Tm57mhESsnbFPogam9VVmhR95FGXr',
@@ -37,4 +34,9 @@ export const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = [
37
34
 
38
35
  export const CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS = [
39
36
  '12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr'
37
+ ]
38
+
39
+ export const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS.concat(CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS)
40
+
41
+ export const CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS = [
40
42
  ]
package/src/utils.js CHANGED
@@ -142,16 +142,16 @@ export function metrics(data){
142
142
  fail = errors+timeouts
143
143
  const treshold = errors+timeouts+stats.open+stats.pending
144
144
 
145
- if(treshold>60){
145
+ if(treshold>40){
146
146
  //console.log(`Treeshold hit : ${treshold}`)
147
147
  }
148
148
 
149
- if(fail>60){
149
+ if(fail>40){
150
150
  //console.log(`Open : ${stats.open} , Pending : ${stats.pending} , Succes : ${totals.success} , Fail : ${fail} `)
151
151
 
152
152
  }
153
153
 
154
- if ((fail-lastfailtreshold)>30){
154
+ if ((fail-lastfailtreshold)>40){
155
155
  if(isDialEnabled){
156
156
  isDialEnabled = false
157
157
  const str = JSON.stringify({isDialEnabled,fail,lastfailtreshold})
package/src/webpeerjs.js CHANGED
@@ -120,6 +120,8 @@ class webpeerjs{
120
120
  this.status = (function(libp2p) {
121
121
  return libp2p.status
122
122
  })(this.#libp2p);
123
+
124
+ this.status = 'unconnected'
123
125
 
124
126
  this.IPFS = (function(libp2p,discoveredPeers) {
125
127
  const obj = {libp2p,discoveredPeers}
@@ -132,11 +134,11 @@ class webpeerjs{
132
134
  //listen to peer connect event
133
135
  this.#libp2p.addEventListener("peer:connect",async (evt) => {
134
136
 
135
- //console.log(`Connected to ${connection.toString()}`);
136
-
137
137
  const connection = evt.detail;
138
138
  const id = evt.detail.toString()
139
139
 
140
+ //console.log('peer:connect '+id,evt)
141
+
140
142
  const connections = this.#libp2p.getConnections().map((con)=>{return {id:con.remotePeer.toString(),addr:con.remoteAddr.toString()}})
141
143
  const connect = connections.find((con)=>con.id == id)
142
144
  const addr = connect.addr
@@ -159,6 +161,27 @@ class webpeerjs{
159
161
  },1000)
160
162
  }
161
163
 
164
+ if(this.#webPeersId.includes(id)){
165
+
166
+ let address = [addr]
167
+
168
+ if(this.#connectedPeers.has(id)){
169
+ //reset this last seen
170
+ const now = new Date().getTime()
171
+ const metadata = {addrs:address,last:now}
172
+ this.#connectedPeers.set(id,metadata)
173
+ }
174
+ else{
175
+ //add to connected webpeers
176
+ this.#onConnectFn(id)
177
+ const now = new Date().getTime()
178
+ const metadata = {addrs:address,last:now}
179
+ this.#connectedPeers.set(id,metadata)
180
+ this.#updatePeers()
181
+ }
182
+
183
+ }
184
+
162
185
  });
163
186
 
164
187
 
@@ -195,11 +218,7 @@ class webpeerjs{
195
218
  const now = new Date().getTime()
196
219
  const metadata = {addrs:address,last:now}
197
220
  this.#connectedPeers.set(senderPeerId,metadata)
198
- this.#connectedPeersArr.length = 0
199
- for(const peer of this.#connectedPeers){
200
- const item = {id:peer[0],address:peer[1].addrs}
201
- this.#connectedPeersArr.push(item)
202
- }
221
+ this.#updatePeers()
203
222
  }
204
223
 
205
224
  //dial if not connected
@@ -263,11 +282,7 @@ class webpeerjs{
263
282
  const metadata = {addrs:address,last:now}
264
283
  this.#connectedPeers.set(id,metadata)
265
284
  this.#webPeersAddrs.set(id,address)
266
- this.#connectedPeersArr.length = 0
267
- for(const peer of this.#connectedPeers){
268
- const item = {id:peer[0],address:peer[1].addrs}
269
- this.#connectedPeersArr.push(item)
270
- }
285
+ this.#updatePeers()
271
286
  }
272
287
 
273
288
 
@@ -313,17 +328,6 @@ class webpeerjs{
313
328
  if(signal == 'ping'){
314
329
  //console.log('rooms',rooms)
315
330
  }
316
-
317
- //update connected webpeers
318
- const now = new Date().getTime()
319
- const metadata = {addrs:address,last:now}
320
- this.#connectedPeers.set(id,metadata)
321
- this.#webPeersAddrs.set(id,address)
322
- this.#connectedPeersArr.length = 0
323
- for(const peer of this.#connectedPeers){
324
- const item = {id:peer[0],address:peer[1].addrs}
325
- this.#connectedPeersArr.push(item)
326
- }
327
331
 
328
332
  }
329
333
  }
@@ -381,7 +385,7 @@ class webpeerjs{
381
385
  const mddr = multiaddr(addr)
382
386
  mddrs.push(mddr)
383
387
  }
384
- //this.#dialMultiaddress(mddrs)
388
+ this.#dialMultiaddress(mddrs)
385
389
  }
386
390
  }
387
391
  }
@@ -445,7 +449,7 @@ class webpeerjs{
445
449
  let mddrs = []
446
450
  const addrs = multiaddr(addr)
447
451
  mddrs.push(addrs)
448
- this.#dialMultiaddress(mddrs)
452
+ //this.#dialMultiaddress(mddrs)
449
453
  }
450
454
  });
451
455
 
@@ -467,6 +471,41 @@ class webpeerjs{
467
471
  this.#ping()
468
472
  })
469
473
 
474
+ this.#libp2p.addEventListener('peer:identify', (evt) => {
475
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
476
+ if(evt.detail.protocols.includes(config.CONFIG_PROTOCOL)){
477
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
478
+
479
+ const id = evt.detail.peerId.toString()
480
+ let address = []
481
+
482
+ for(const addrs of evt.detail.listenAddrs){
483
+ const addr = addrs.toString()+'/p2p/'+id
484
+ if(addr.includes('webtransport')){
485
+ address.push(addr)
486
+ }
487
+ }
488
+
489
+ if(!this.#webPeersId.includes(id))this.#webPeersId.push(id)
490
+
491
+ if(this.#connectedPeers.has(id)){
492
+ //reset this last seen
493
+ const now = new Date().getTime()
494
+ const metadata = {addrs:address,last:now}
495
+ this.#connectedPeers.set(id,metadata)
496
+ }
497
+ else{
498
+ //add to connected webpeers
499
+ this.#onConnectFn(id)
500
+ const now = new Date().getTime()
501
+ const metadata = {addrs:address,last:now}
502
+ this.#connectedPeers.set(id,metadata)
503
+ this.#updatePeers()
504
+ }
505
+
506
+ }
507
+ })
508
+
470
509
  //dial known peers from configuration
471
510
  this.#dialKnownPeers()
472
511
 
@@ -482,6 +521,8 @@ class webpeerjs{
482
521
  //dial random discovered peers
483
522
  //this.#dialdiscoveredpeers()
484
523
 
524
+ this.#registerProtocol()
525
+
485
526
 
486
527
  onMetrics((data)=>{
487
528
  const signal = metrics(data)
@@ -522,6 +563,14 @@ class webpeerjs{
522
563
  }
523
564
  },60e3)*/
524
565
 
566
+ /*setTimeout(async()=>{
567
+ const key = uint8ArrayFromString(config.CONFIG_PREFIX)
568
+ const value = uint8ArrayFromString(this.id)
569
+ for await (const event of this.#libp2p.services.aminoDHT.put(key,value)){
570
+ console.log('put',event)
571
+ }
572
+ },30e3)*/
573
+
525
574
  }
526
575
 
527
576
 
@@ -546,11 +595,48 @@ class webpeerjs{
546
595
  /*
547
596
  PRIVATE FUNCTION
548
597
  */
598
+
599
+ #updatePeers(){
600
+ this.#connectedPeersArr.length = 0
601
+ for(const peer of this.#connectedPeers){
602
+ const item = {id:peer[0],address:peer[1].addrs}
603
+ this.#connectedPeersArr.push(item)
604
+ }
605
+ if(this.#connectedPeers.size > 0){
606
+ this.status = 'connected'
607
+ }
608
+ else{
609
+ this.status = 'unconnected'
610
+ }
611
+ }
612
+
613
+ async #registerProtocol(){
614
+ const handler = ({ connection, stream, protocol }) => {
615
+ // use stream or connection according to the needs
616
+ }
617
+
618
+ await this.#libp2p.handle(config.CONFIG_PROTOCOL, handler, {
619
+ maxInboundStreams: 5,
620
+ maxOutboundStreams: 5
621
+ })
622
+
623
+ await this.#libp2p.register(config.CONFIG_PROTOCOL, {
624
+ onConnect: (peer, connection) => {
625
+ // handle connect
626
+ //console.log('handle connect',peer)
627
+ },
628
+ onDisconnect: (peer, connection) => {
629
+ // handle disconnect
630
+ //console.log('handle disconnect',peer)
631
+ }
632
+ })
633
+
634
+ }
549
635
 
550
636
  #findHybridPeer(){
551
637
  setTimeout(async()=>{
552
638
  for(const target of config.CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
553
- if(!this.#isConnected(target)){
639
+ if(!this.#isConnected(target) && !this.#connections.has(target) && this.#isDialEnabled ){
554
640
  //console.log('findPeer',target)
555
641
  const peerId = peerIdFromString(target)
556
642
  //const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
@@ -577,13 +663,14 @@ class webpeerjs{
577
663
  }
578
664
  }
579
665
  }
580
- },30e3)
666
+ },60e3)
581
667
  }
582
668
 
583
669
 
584
670
  //check the last seen in web peer
585
671
  #trackLastSeen(){
586
672
  const timeout = 25*1000
673
+ const forcetimeout = 60*1000
587
674
  const now = new Date().getTime()
588
675
 
589
676
  //if webpeer last seen grather then timeout send onDisconnect
@@ -591,13 +678,10 @@ class webpeerjs{
591
678
  const id = peer[0]
592
679
  const last = peer[1].last
593
680
  const time = now-last
594
- if(time>timeout){
681
+ if((time>timeout && !this.#isConnected(id))||(time>forcetimeout)){
682
+
595
683
  this.#connectedPeers.delete(id)
596
- this.#connectedPeersArr.length = 0
597
- for(const peer of this.#connectedPeers){
598
- const item = {id:peer[0],address:peer[1].addrs}
599
- this.#connectedPeersArr.push(item)
600
- }
684
+ this.#updatePeers()
601
685
  this.#onDisconnectFn(id)
602
686
 
603
687
  //remove id from room member
@@ -609,6 +693,7 @@ class webpeerjs{
609
693
  this.#rooms[room].onMembers(this.#rooms[room].members)
610
694
  }
611
695
  }
696
+
612
697
  }
613
698
  }
614
699
  }
@@ -656,7 +741,7 @@ class webpeerjs{
656
741
 
657
742
  if(!this.#isDialEnabled)return
658
743
 
659
- const mddrsToDial = 3
744
+ const mddrsToDial = 5
660
745
 
661
746
  let queue = []
662
747
  for(const item of this.#libp2p.getDialQueue()){
@@ -674,6 +759,8 @@ class webpeerjs{
674
759
 
675
760
  if(this.#isConnected(id))continue
676
761
  if(queue.includes(id)){continue;}
762
+
763
+ //console.log('dial',id)
677
764
 
678
765
  //dial with webtransport
679
766
  this.#dialWebtransport(mddrs)
@@ -756,7 +843,7 @@ class webpeerjs{
756
843
  },
757
844
  members : [this.id],
758
845
  onMembers : () => {},
759
- onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members)},
846
+ onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);this.#ping()},
760
847
  }
761
848
  }
762
849
 
@@ -963,7 +1050,7 @@ class webpeerjs{
963
1050
  setTimeout(()=>{
964
1051
  this.#dialSavedKnownID()
965
1052
  this.#findHybridPeer()
966
- setTimeout(()=>{this.#dialUpdateSavedKnownID()},60000)
1053
+ setTimeout(()=>{this.#dialUpdateSavedKnownID()},50000)
967
1054
  setTimeout(()=>{
968
1055
  const peers = this.#libp2p.getPeers().length
969
1056
  if(peers == 0){
@@ -1055,8 +1142,13 @@ class webpeerjs{
1055
1142
  }
1056
1143
 
1057
1144
  async #dialUpdateSavedKnownID(){
1145
+ let firsttime = true
1058
1146
  for(const target of config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
1059
- if(!this.#connections.has(target)){
1147
+ if(this.#dbstoreData.has(target)){
1148
+ firsttime = false
1149
+ }
1150
+ if(!this.#connections.has(target) && this.#isDialEnabled && (this.#dbstoreData.has(target) || firsttime)){
1151
+ //console.log('#dialUpdateSavedKnownID()',target)
1060
1152
  const api = config.CONFIG_DELEGATED_API
1061
1153
  const delegatedClient = createDelegatedRoutingV1HttpApiClient(api)
1062
1154
  const peer = await first(delegatedClient.getPeers(peerIdFromString(target)))