webpeerjs 0.0.8 → 0.0.10

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.
@@ -2,24 +2,29 @@ import { message, encodeMessage, decodeMessage } from 'protons-runtime';
2
2
  import { alloc } from 'uint8arrays/alloc';
3
3
  import { Key } from 'interface-datastore';
4
4
  import { sha256 } from 'multiformats/hashes/sha2';
5
+ import { multiaddr } from '@multiformats/multiaddr';
6
+ import { pipe } from 'it-pipe';
7
+ import 'it-length-prefixed-stream';
8
+ import * as lp from 'it-length-prefixed';
9
+ import map from 'it-map';
5
10
  import { createDelegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-v1-http-api-client';
6
11
  import { createLibp2p } from 'libp2p';
7
12
  import { IDBDatastore } from 'datastore-idb';
8
13
  import { webTransport } from '@libp2p/webtransport';
14
+ import { webSockets } from '@libp2p/websockets';
9
15
  import { noise } from '@chainsafe/libp2p-noise';
10
16
  import { yamux } from '@chainsafe/libp2p-yamux';
11
17
  import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery';
12
18
  import { circuitRelayTransport } from '@libp2p/circuit-relay-v2';
13
19
  import { gossipsub } from '@chainsafe/libp2p-gossipsub';
14
20
  import { identify, identifyPush } from '@libp2p/identify';
15
- import { multiaddr } from '@multiformats/multiaddr';
16
21
  import { peerIdFromString } from '@libp2p/peer-id';
17
22
  import { kadDHT, removePrivateAddressesMapper } from '@libp2p/kad-dht';
18
23
  import { simpleMetrics } from '@libp2p/simple-metrics';
19
24
 
20
25
  const prefix$1 = 'webpeerjs';
21
26
  const CONFIG_PREFIX = prefix$1;
22
- const CONFIG_PROTOCOL = '/'+prefix$1+'/0.0.1';
27
+ const CONFIG_PROTOCOL = '/'+prefix$1+'/1.0.0';
23
28
  const CONFIG_DBSTORE_PATH = prefix$1+'-dbstore';
24
29
  const CONFIG_MAX_CONNECTIONS = 100;
25
30
  const CONFIG_MIN_CONNECTIONS = 0;
@@ -29,20 +34,15 @@ const CONFIG_PEER_DISCOVERY_GLOBAL = '_peer-discovery._p2p._pubsub';
29
34
  const CONFIG_PEER_DISCOVERY_WEBPEERJS= prefix$1+'-peer-discovery';
30
35
  const CONFIG_PUBSUB_PEER_DISCOVERY = [CONFIG_PEER_DISCOVERY_GLOBAL, CONFIG_PEER_DISCOVERY_UNIVERSAL_CONNECTIVITY, CONFIG_PEER_DISCOVERY_WEBPEERJS];
31
36
  const CONFIG_DELEGATED_API = 'https://delegated-ipfs.dev';
37
+ const CONFIG_DNS_RESOLVER = 'https://dns.google/resolve';
38
+ const CONFIG_KNOWN_BOOTSTRAP_DNS = '_dnsaddr.bootstrap.libp2p.io';
39
+ const CONFIG_TIMEOUT_DIAL_KNOWN_PEERS = 15000;
32
40
 
33
41
  const CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS = [
34
42
  'QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',
35
43
  'QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
36
44
  'QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt',
37
- 'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ',
38
- '12D3KooWPEDBmt7vm6FNNYuqaA4n2qMUZ6wPK5NcRc8t6KpqgRkV',
39
- '12D3KooWSHbugDEQeWm2LjtRRMpNgLu6oZ8zkX8XcTwYMAewVekP',
40
- '12D3KooWASoxFpwwy8JDdu4Tm57mhESsnbFPogam9VVmhR95FGXr',
41
- '12D3KooWHh98YpAkJsn3ULjMjK1n9QVkXmi8Sb3gTDMatHxCmDP5',
42
- '12D3KooWS79EhkPU7ESUwgG4vyHHzW9FDNZLoWVth9b5N5NSrvaj',
43
- '12D3KooWBbkCD5MpJhMc1mfPAVGEyVkQnyxPKGS7AHwDqQM2JUsk',
44
- '12D3KooWKLdecs31Zmo2pLBjR9HY2vWo3VwM4eBm21Czeucbe6FL',
45
- '12D3KooWBdF3g6vSJFRPoZQo7BNnkNzaWb59gpyaVzsgtNTVeu8H'
45
+ 'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ'
46
46
  ];
47
47
 
48
48
  const CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS = [
@@ -52,13 +52,46 @@ const CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS = [
52
52
  const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS.concat(CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS);
53
53
 
54
54
  const CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS = [
55
+ {
56
+ "Peers": [
57
+ {
58
+ "Addrs": [
59
+ "/dns6/sv15.bootstrap.libp2p.io/tcp/443/wss",
60
+ "/dns4/sv15.bootstrap.libp2p.io/tcp/443/wss"
61
+ ],
62
+ "ID": "QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
63
+ "Schema": "peer"
64
+ }
65
+ ]
66
+ },
67
+ {
68
+ "Peers": [
69
+ {
70
+ "Addrs": [
71
+ "/dns4/am6.bootstrap.libp2p.io/tcp/443/wss",
72
+ "/dns6/am6.bootstrap.libp2p.io/tcp/443/wss"
73
+ ],
74
+ "ID": "QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
75
+ "Schema": "peer"
76
+ }
77
+ ]
78
+ },
79
+ {
80
+ "Peers": [
81
+ {
82
+ "Addrs": [
83
+ "/dns6/sg1.bootstrap.libp2p.io/tcp/443/wss",
84
+ "/dns4/sg1.bootstrap.libp2p.io/tcp/443/wss"
85
+ ],
86
+ "ID": "QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
87
+ "Schema": "peer"
88
+ }
89
+ ]
90
+ }
55
91
  ];
56
92
 
57
- /* eslint-disable import/export */
58
- /* eslint-disable complexity */
59
- /* eslint-disable @typescript-eslint/no-namespace */
60
- /* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */
61
- /* eslint-disable @typescript-eslint/no-empty-interface */
93
+ //this code comes from https://github.com/libp2p/js-libp2p-pubsub-peer-discovery/blob/9d0da565f70e9b2403251c9d11dfc0b9b52babfa/src/peer.ts
94
+
62
95
  var Peer;
63
96
  (function (Peer) {
64
97
  let _codec;
@@ -243,16 +276,16 @@ function metrics(data){
243
276
  fail = errors+timeouts;
244
277
  const treshold = errors+timeouts+stats.open+stats.pending;
245
278
 
246
- if(treshold>40){
279
+ if(treshold>30){
247
280
  //console.log(`Treeshold hit : ${treshold}`)
248
281
  }
249
282
 
250
- if(fail>40){
283
+ if(fail>30){
251
284
  //console.log(`Open : ${stats.open} , Pending : ${stats.pending} , Succes : ${totals.success} , Fail : ${fail} `)
252
285
 
253
286
  }
254
287
 
255
- if ((fail-lastfailtreshold)>40){
288
+ if ((fail-lastfailtreshold)>30){
256
289
  if(isDialEnabled){
257
290
  isDialEnabled = false;
258
291
  const str = JSON.stringify({isDialEnabled,fail,lastfailtreshold});
@@ -333,6 +366,9 @@ class webpeerjs{
333
366
  //message tracker avoid double
334
367
  #msgIdtracker
335
368
 
369
+ //map of peer exchange data
370
+ #peerexchangedata
371
+
336
372
  id
337
373
  status
338
374
  IPFS
@@ -361,6 +397,7 @@ class webpeerjs{
361
397
  this.#dialQueue = [];
362
398
  this.#isDialEnabled = true;
363
399
  this.#msgIdtracker = [];
400
+ this.#peerexchangedata = new Map();
364
401
 
365
402
  this.peers = (function(f) {
366
403
  return f
@@ -392,8 +429,8 @@ class webpeerjs{
392
429
  const connect = connections.find((con)=>con.id == id);
393
430
  const addr = connect.addr;
394
431
 
395
- if(CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) || CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS.includes(id)){
396
- if(!this.#connections.has(id)&&addr.includes('webtransport')){
432
+ if(CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id)){
433
+ if((!this.#connections.has(id) || (this.#connections.get(id).includes('/wss/')))&&addr.includes('webtransport')){
397
434
  await this.#dbstore.put(new Key(id), new TextEncoder().encode(addr));
398
435
  }
399
436
  }
@@ -653,9 +690,8 @@ class webpeerjs{
653
690
  count++;
654
691
  this.#trackDisconnect.set(id,count);
655
692
  //console.log(this.#trackDisconnect)
656
- if(count>5){
693
+ if(count>10){
657
694
  if(this.#dbstoreData.has(id)){
658
- //await this.#dbstore.delete(new Key(id))
659
695
  this.#dbstoreData.delete(id);
660
696
  }
661
697
 
@@ -668,6 +704,11 @@ class webpeerjs{
668
704
  this.#trackDisconnect.set(id,0);
669
705
  }
670
706
 
707
+ let peerexchangelist = [];
708
+ for(const peer of this.#peerexchangedata.values()){
709
+ peerexchangelist.push(peer.id);
710
+ }
711
+
671
712
  //if this disconnected peer is web peer redial it
672
713
  if(this.#webPeersId.includes(id)){
673
714
  const addr = this.#connections.get(id);
@@ -679,6 +720,15 @@ class webpeerjs{
679
720
 
680
721
  //if this disconnected peer is known bootstrap redial it
681
722
  else if(this.#dialedKnownBootstrap.has(id)){
723
+ const addr = this.#connections.get(id);
724
+ if(addr.includes('/wss/'))return
725
+ let mddrs = [];
726
+ const addrs = multiaddr(addr);
727
+ mddrs.push(addrs);
728
+ this.#dialMultiaddress(mddrs);
729
+ }
730
+
731
+ else if(peerexchangelist.includes(id)){
682
732
  const addr = this.#connections.get(id);
683
733
  let mddrs = [];
684
734
  const addrs = multiaddr(addr);
@@ -712,37 +762,54 @@ class webpeerjs{
712
762
  this.#ping();
713
763
  });
714
764
 
715
- this.#libp2p.addEventListener('peer:identify', (evt) => {
765
+ this.#libp2p.addEventListener('peer:identify', async (evt) => {
716
766
  //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
767
+
768
+ const id = evt.detail.peerId.toString();
769
+
770
+ if(CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS.includes(id)){
771
+ const remoteAddr = evt.detail.connection.remoteAddr.toString();
772
+ if(remoteAddr.includes('/wss/')){
773
+ let addrs = [];
774
+ let mddrs = [];
775
+ for(const peer of evt.detail.listenAddrs){
776
+ if(!peer.toString().includes('webtransport'))continue
777
+ const addr = peer.toString()+'/p2p/'+id;
778
+ const mddr = multiaddr(addr);
779
+ addrs.push(addr);
780
+ mddrs.push(mddr);
781
+ }
782
+ this.#dialedKnownBootstrap.set(id,addrs);
783
+ await this.#libp2p.hangUp(peerIdFromString(id));
784
+ this.#dialMultiaddress(mddrs);
785
+ }
786
+ }
787
+
717
788
  if(evt.detail.protocols.includes(CONFIG_PROTOCOL)){
718
- //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
789
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt)
719
790
 
720
791
  const id = evt.detail.peerId.toString();
721
792
  let address = [];
722
793
 
723
794
  for(const addrs of evt.detail.listenAddrs){
724
795
  const addr = addrs.toString()+'/p2p/'+id;
796
+ multiaddr(addr);
725
797
  if(addr.includes('webtransport')){
726
798
  address.push(addr);
727
799
  }
728
800
  }
729
801
 
730
- if(!this.#webPeersId.includes(id))this.#webPeersId.push(id);
731
-
732
802
  if(this.#connectedPeers.has(id)){
733
803
  //reset this last seen
734
804
  const now = new Date().getTime();
735
805
  const metadata = {addrs:address,last:now};
736
806
  this.#connectedPeers.set(id,metadata);
737
807
  }
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
- }
808
+
809
+
810
+ const command = 'peer-exchange';
811
+ this.#dialProtocol(id,command);
812
+
746
813
 
747
814
  }
748
815
  });
@@ -823,14 +890,67 @@ class webpeerjs{
823
890
 
824
891
  //Listen on new peer connection
825
892
  #onConnectFn = () => {}
826
- onJoin = f => (this.#onConnectFn = f)
893
+ onConnect = f => (this.#onConnectFn = f)
827
894
 
828
895
 
829
896
  //Listen on peer disconnect
830
897
  #onDisconnectFn = () => {}
831
- onLeave = f => (this.#onDisconnectFn = f)
898
+ onDisconnect = f => (this.#onDisconnectFn = f)
832
899
 
900
+ joinRoom = room => {
901
+ if (this.#rooms[room]) {
902
+ return [
903
+ this.#rooms[room].sendMessage,
904
+ this.#rooms[room].listenMessage,
905
+ this.#rooms[room].onMembersChange
906
+ ]
907
+
833
908
 
909
+ }
910
+
911
+ if (!room) {
912
+ throw mkErr('room is required')
913
+ }
914
+
915
+ //join room version 1 user pupsub via pupsub peer discovery
916
+ {
917
+
918
+ const topics = CONFIG_PUBSUB_PEER_DISCOVERY;
919
+
920
+ this.#rooms[room] = {
921
+ onMessage : () => {},
922
+ listenMessage : f => (this.#rooms[room] = {...this.#rooms[room], onMessage: f}),
923
+ sendMessage : async (message) => {
924
+ const msgId = (new Date()).getTime();
925
+ const data = JSON.stringify({prefix:CONFIG_PREFIX,room,message,id:this.#libp2p.peerId.toString(),msgId});
926
+ const peer = {
927
+ publicKey: this.#libp2p.peerId.publicKey,
928
+ addrs: [uint8ArrayFromString(data)],
929
+ };
930
+ const encodedPeer = Peer.encode(peer);
931
+ for(const topic of topics){
932
+ await this.#libp2p.services.pubsub.publish(topic, encodedPeer);
933
+ }
934
+ },
935
+ members : [this.id],
936
+ onMembers : () => {},
937
+ onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);this.#ping();},
938
+ };
939
+ }
940
+
941
+ return [
942
+ this.#rooms[room].sendMessage,
943
+ this.#rooms[room].listenMessage,
944
+ this.#rooms[room].onMembersChange
945
+ ]
946
+ }
947
+
948
+ dial(addr){
949
+ let mddrs = [];
950
+ const mddr = multiaddr(addr);
951
+ mddrs.push(mddr);
952
+ this.#dialMultiaddress(mddrs);
953
+ }
834
954
 
835
955
 
836
956
  /*
@@ -852,13 +972,96 @@ class webpeerjs{
852
972
  }
853
973
 
854
974
  async #registerProtocol(){
855
- const handler = ({ connection, stream, protocol }) => {
856
- // use stream or connection according to the needs
975
+
976
+ const handler = async ({ connection, stream, protocol }) => {
977
+ try{
978
+ const output = await pipe(
979
+ stream.source,
980
+ (source) => lp.decode(source),
981
+ (source) => map(source, (buf) => uint8ArrayToString(buf.subarray())),
982
+ async function (source) {
983
+ let string = '';
984
+ for await (const msg of source) {
985
+ string += msg.toString();
986
+ }
987
+ return string
988
+ }
989
+ );
990
+
991
+ const id = connection.remotePeer.toString();
992
+
993
+ let json = JSON.parse(output);
994
+
995
+ let jsonMessage = {
996
+ protocol:CONFIG_PROTOCOL,
997
+ command:null,
998
+ data:null
999
+ };
1000
+
1001
+ if(json.command === 'peer-exchange'){
1002
+
1003
+ if(json.protocol == CONFIG_PROTOCOL){
1004
+ const address = [connection.remoteAddr.toString()];
1005
+ if(this.#connectedPeers.has(id)){
1006
+ //reset this last seen
1007
+ const now = new Date().getTime();
1008
+ const metadata = {addrs:address,last:now};
1009
+ this.#connectedPeers.set(id,metadata);
1010
+ }
1011
+ else {
1012
+ if(!this.#webPeersId.includes(id))this.#webPeersId.push(id);
1013
+
1014
+ //add to connected webpeers
1015
+ this.#onConnectFn(id);
1016
+ const now = new Date().getTime();
1017
+ const metadata = {addrs:address,last:now};
1018
+ this.#connectedPeers.set(id,metadata);
1019
+ this.#updatePeers();
1020
+ }
1021
+ }
1022
+
1023
+ if(json.data != null){
1024
+ this.#peerexchangedata.set(id,json.data);
1025
+ let mddrs = [];
1026
+ const dataaddr = json.data.addr;
1027
+ const datamddr = multiaddr(dataaddr);
1028
+ const dataid = json.data.id;
1029
+ mddrs.push(datamddr);
1030
+ this.#dialMultiaddress(mddrs);
1031
+ if(!this.#dbstoreData.has(dataid)){
1032
+ //await this.#dbstore.put(new Key(dataid), new TextEncoder().encode(dataaddr))
1033
+ //this.#dbstoreData.set(dataid,dataaddr)
1034
+ }
1035
+ }
1036
+
1037
+ const keys = Array.from(this.#dbstoreData.keys());
1038
+ const randomKey = Math.floor(Math.random() * keys.length);
1039
+ const key = keys[randomKey];
1040
+ const addr = this.#dbstoreData.get(key);
1041
+
1042
+ jsonMessage.command = json.command;
1043
+ jsonMessage.data = {id:key,addr};
1044
+ }
1045
+
1046
+ const message = JSON.stringify(jsonMessage);
1047
+ //console.log('answer message '+id,message)
1048
+
1049
+ pipe(
1050
+ message,
1051
+ (source) => map(source, (string) => uint8ArrayFromString(string)),
1052
+ (source) => lp.encode(source),
1053
+ stream.sink
1054
+ );
1055
+ }
1056
+ catch(err){
1057
+ //console.warn(err)
1058
+ }
857
1059
  };
858
1060
 
859
1061
  await this.#libp2p.handle(CONFIG_PROTOCOL, handler, {
860
- maxInboundStreams: 5,
861
- maxOutboundStreams: 5
1062
+ maxInboundStreams: 50,
1063
+ maxOutboundStreams: 50,
1064
+ runOnTransientConnection:true
862
1065
  });
863
1066
 
864
1067
  await this.#libp2p.register(CONFIG_PROTOCOL, {
@@ -874,37 +1077,129 @@ class webpeerjs{
874
1077
 
875
1078
  }
876
1079
 
877
- #findHybridPeer(){
878
- setTimeout(async()=>{
879
- for(const target of CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
880
- if(!this.#isConnected(target) && !this.#connections.has(target) && this.#isDialEnabled ){
881
- //console.log('findPeer',target)
882
- const peerId = peerIdFromString(target);
883
- //const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
884
-
885
- //console.info(peerInfo)
886
- for await (const event of this.#libp2p.services.aminoDHT.findPeer(peerId)){
887
- //console.info('findPeer',event)
888
- if (event.name === 'FINAL_PEER'){
889
- //console.log(event.peer.id.toString(),event.peer.multiaddrs.toString())
890
- let mddrs = [];
891
- let addrs = [];
892
- const id = event.peer.id.toString();
893
- for(const mddr of event.peer.multiaddrs){
894
- const peeraddr = mddr.toString()+'/p2p/'+id;
895
- const peermddr = multiaddr(peeraddr);
896
- addrs.push(peeraddr);
897
- mddrs.push(peermddr);
898
- }
899
- this.#dialedKnownBootstrap.set(id,addrs);
900
- if(!this.#isConnected(id)){
901
- this.#dialMultiaddress(mddrs);
902
- }
1080
+ async #dialProtocol(id,command){
1081
+
1082
+ const connections = this.#libp2p.getConnections().map((con)=>{return {id:con.remotePeer.toString(),addr:con.remoteAddr.toString()}});
1083
+ const connect = connections.find((con)=>con.id == id);
1084
+ const addr = connect.addr;
1085
+ const mddr = multiaddr(addr);
1086
+
1087
+ let jsonMessage = {
1088
+ protocol:CONFIG_PROTOCOL,
1089
+ command:null,
1090
+ data:null
1091
+ };
1092
+
1093
+ if(command === 'peer-exchange'){
1094
+
1095
+ if(this.#peerexchangedata.has(id))return
1096
+
1097
+ const keys = Array.from(this.#dbstoreData.keys());
1098
+ const randomKey = Math.floor(Math.random() * keys.length);
1099
+ const key = keys[randomKey];
1100
+ const addr = this.#dbstoreData.get(key);
1101
+
1102
+ jsonMessage.command = command;
1103
+ jsonMessage.data = {id:key,addr};
1104
+ }
1105
+
1106
+ const message = JSON.stringify(jsonMessage);
1107
+ //console.log('ask message '+id,message)
1108
+
1109
+ try{
1110
+
1111
+ const stream = await this.#libp2p.dialProtocol(mddr, CONFIG_PROTOCOL,{runOnTransientConnection:true});
1112
+
1113
+ const output = await pipe(
1114
+ message,
1115
+ (source) => map(source, (string) => uint8ArrayFromString(string)),
1116
+ (source) => lp.encode(source),
1117
+ stream,
1118
+ (source) => lp.decode(source),
1119
+ (source) => map(source, (buf) => uint8ArrayToString(buf.subarray())),
1120
+ async function (source) {
1121
+ let string = '';
1122
+ for await (const msg of source) {
1123
+ string += msg.toString();
1124
+ }
1125
+ return string
1126
+ }
1127
+ );
1128
+
1129
+ const json = JSON.parse(output);
1130
+ if(json.protocol == CONFIG_PROTOCOL){
1131
+ const address = [addr];
1132
+ if(this.#connectedPeers.has(id)){
1133
+ //reset this last seen
1134
+ const now = new Date().getTime();
1135
+ const metadata = {addrs:address,last:now};
1136
+ this.#connectedPeers.set(id,metadata);
1137
+ }
1138
+ else {
1139
+ if(!this.#webPeersId.includes(id))this.#webPeersId.push(id);
1140
+
1141
+ //add to connected webpeers
1142
+ this.#onConnectFn(id);
1143
+ const now = new Date().getTime();
1144
+ const metadata = {addrs:address,last:now};
1145
+ this.#connectedPeers.set(id,metadata);
1146
+ this.#updatePeers();
1147
+ }
1148
+ }
1149
+ if(json.command == 'peer-exchange'){
1150
+ if(json.data != null){
1151
+ this.#peerexchangedata.set(id,json.data);
1152
+ let mddrs = [];
1153
+ const dataaddr = json.data.addr;
1154
+ const datamddr = multiaddr(dataaddr);
1155
+ const dataid = json.data.id;
1156
+ mddrs.push(datamddr);
1157
+ this.#dialMultiaddress(mddrs);
1158
+ if(!this.#dbstoreData.has(dataid)){
1159
+ //await this.#dbstore.put(new Key(dataid), new TextEncoder().encode(dataaddr))
1160
+ //this.#dbstoreData.set(dataid,dataaddr)
1161
+ }
1162
+ }
1163
+ }
1164
+ }
1165
+ catch(err){
1166
+ //console.warn(err)
1167
+ }
1168
+ }
1169
+
1170
+ async #findHybridPeer(){
1171
+
1172
+ if(!navigator.onLine)return
1173
+ if(!this.#isDialEnabled)return
1174
+
1175
+ for(const target of CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
1176
+ if(!this.#isConnected(target) && !this.#connections.has(target)){
1177
+ //console.log('findPeer',target)
1178
+ const peerId = peerIdFromString(target);
1179
+ //const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
1180
+
1181
+ //console.info(peerInfo)
1182
+ for await (const event of this.#libp2p.services.aminoDHT.findPeer(peerId)){
1183
+ //console.info('findPeer',event)
1184
+ if (event.name === 'FINAL_PEER'){
1185
+ //console.log(event.peer.id.toString(),event.peer.multiaddrs.toString())
1186
+ let mddrs = [];
1187
+ let addrs = [];
1188
+ const id = event.peer.id.toString();
1189
+ for(const mddr of event.peer.multiaddrs){
1190
+ const peeraddr = mddr.toString()+'/p2p/'+id;
1191
+ const peermddr = multiaddr(peeraddr);
1192
+ addrs.push(peeraddr);
1193
+ mddrs.push(peermddr);
1194
+ }
1195
+ this.#dialedKnownBootstrap.set(id,addrs);
1196
+ if(!this.#isConnected(id)){
1197
+ this.#dialMultiaddress(mddrs);
903
1198
  }
904
1199
  }
905
1200
  }
906
1201
  }
907
- },60e3);
1202
+ }
908
1203
  }
909
1204
 
910
1205
 
@@ -960,13 +1255,25 @@ class webpeerjs{
960
1255
 
961
1256
  const id = mddrs[0].toString().split('/').pop();
962
1257
 
963
- const ids = this.#dialQueue.map((arr)=> arr[0].toString().split('/').pop());
1258
+ const queueids = this.#dialQueue.map((arr)=> arr[0].toString().split('/').pop());
964
1259
 
965
1260
  //if peer id is already in the queque cancel queque
966
- if(ids.includes(id)){
1261
+ if(queueids.includes(id)){
967
1262
  return
968
1263
  }
969
1264
 
1265
+ const webPeerCount = this.#connectedPeers.size;
1266
+ const allPeerCount = this.#libp2p.getPeers().length;
1267
+ const nodePeerCount = allPeerCount - webPeerCount;
1268
+ const limitCount = CONFIG_MAX_CONNECTIONS / 2;
1269
+
1270
+ if(this.#webPeersId.includes(id)){
1271
+ if(webPeerCount>limitCount)return
1272
+ }
1273
+ else {
1274
+ if(nodePeerCount>limitCount)return
1275
+ }
1276
+
970
1277
  if(this.#webPeersId.includes(id) || CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) || CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS.includes(id)){
971
1278
  this.#dialQueue.unshift(mddrs);
972
1279
  }
@@ -980,7 +1287,7 @@ class webpeerjs{
980
1287
  //dial multiaddr address in queue list
981
1288
  #dialQueueList(){
982
1289
 
983
- if(!this.#isDialEnabled)return
1290
+ if(!this.#isDialEnabled || !navigator.onLine)return
984
1291
 
985
1292
  const mddrsToDial = 5;
986
1293
 
@@ -1045,55 +1352,6 @@ class webpeerjs{
1045
1352
  await this.#libp2p.services.pubsub.publish(topic, encodedPeer);
1046
1353
  }
1047
1354
  }
1048
-
1049
-
1050
- joinRoom = room => {
1051
- if (this.#rooms[room]) {
1052
- return [
1053
- this.#rooms[room].sendMessage,
1054
- this.#rooms[room].listenMessage,
1055
- this.#rooms[room].onMembersChange
1056
- ]
1057
-
1058
-
1059
- }
1060
-
1061
- if (!room) {
1062
- throw mkErr('room is required')
1063
- }
1064
-
1065
- //join room version 1 user pupsub via pupsub peer discovery
1066
- {
1067
-
1068
- const topics = CONFIG_PUBSUB_PEER_DISCOVERY;
1069
-
1070
- this.#rooms[room] = {
1071
- onMessage : () => {},
1072
- listenMessage : f => (this.#rooms[room] = {...this.#rooms[room], onMessage: f}),
1073
- sendMessage : async (message) => {
1074
- const msgId = (new Date()).getTime();
1075
- const data = JSON.stringify({prefix:CONFIG_PREFIX,room,message,id:this.#libp2p.peerId.toString(),msgId});
1076
- const peer = {
1077
- publicKey: this.#libp2p.peerId.publicKey,
1078
- addrs: [uint8ArrayFromString(data)],
1079
- };
1080
- const encodedPeer = Peer.encode(peer);
1081
- for(const topic of topics){
1082
- await this.#libp2p.services.pubsub.publish(topic, encodedPeer);
1083
- }
1084
- },
1085
- members : [this.id],
1086
- onMembers : () => {},
1087
- onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);this.#ping();},
1088
- };
1089
- }
1090
-
1091
- return [
1092
- this.#rooms[room].sendMessage,
1093
- this.#rooms[room].listenMessage,
1094
- this.#rooms[room].onMembersChange
1095
- ]
1096
- }
1097
1355
 
1098
1356
 
1099
1357
  //dial discovered peers
@@ -1196,8 +1454,7 @@ class webpeerjs{
1196
1454
  if(besttime>bestlimit){
1197
1455
  const addr = remote.toString();
1198
1456
  const id = peer.toString();
1199
- if(!this.#webPeersId.includes(id) && !CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) && !this.#dbstoreData.get(id) && !addr.includes('p2p-circuit') && addr.includes('webtransport')){
1200
- //await this.#dbstore.delete(new Key(id))
1457
+ if(!this.#webPeersId.includes(id) && !CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) && !this.#dbstoreData.has(id) && !addr.includes('p2p-circuit') && addr.includes('webtransport')){
1201
1458
  await this.#dbstore.put(new Key(id), new TextEncoder().encode(addr));
1202
1459
  this.#dbstoreData.set(id,addr);
1203
1460
  }
@@ -1212,26 +1469,31 @@ class webpeerjs{
1212
1469
  }
1213
1470
 
1214
1471
 
1215
- let peers = [];
1216
- for(const peer of this.#libp2p.getPeers()){
1217
- peers.push(peer.toString());
1218
- }
1219
-
1220
-
1221
1472
  //connect to saved best peer address
1222
1473
  //working great
1223
1474
  for(const peer of this.#dbstoreData){
1224
1475
  const id = peer[0];
1225
1476
  const addr = peer[1];
1226
- if(peers.includes(id)){
1477
+ if(this.#isConnected(id)){
1227
1478
  this.#connectionTrackerStore.set(id,0);
1228
1479
  continue
1229
1480
  }else {
1230
1481
  if(this.#connectionTrackerStore.has(id)){
1231
1482
  let current = this.#connectionTrackerStore.get(id);
1232
- if(current>10)continue
1233
1483
  current++;
1234
1484
  this.#connectionTrackerStore.set(id,current);
1485
+ if(current>5){
1486
+ if(!this.#connections.has(id) && !CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) && navigator.onLine)
1487
+ {
1488
+ setTimeout(async ()=> {
1489
+ if(this.#dbstoreData.has(id) && !this.#connections.has(id)){
1490
+ this.#dbstoreData.delete(id);
1491
+ await this.#dbstore.delete(new Key(id));
1492
+ }
1493
+ },60*1000);
1494
+ }
1495
+ continue
1496
+ }
1235
1497
  }
1236
1498
  else {
1237
1499
  this.#connectionTrackerStore.set(id,0);
@@ -1246,7 +1508,7 @@ class webpeerjs{
1246
1508
  //connect to good peer address if it is disconnected
1247
1509
  const goods = Array.from(this.#dialedGoodPeers.keys());
1248
1510
  for(const id of goods){
1249
- if(peers.includes(id)){
1511
+ if(this.#isConnected(id)){
1250
1512
  this.#dialedGoodPeers.set(id,0);
1251
1513
  continue
1252
1514
  }
@@ -1281,62 +1543,52 @@ class webpeerjs{
1281
1543
  if(peers == 0){
1282
1544
  this.#dialKnownPeers();
1283
1545
  }
1284
- },60*1000);
1546
+ },120*1000);
1285
1547
  }
1286
1548
 
1287
1549
 
1288
1550
  //dial to all known bootstrap peers and DNS
1289
1551
  #dialKnownPeers(){
1290
- //this.#dialKnownBootstrap()
1291
1552
  setTimeout(()=>{
1292
1553
  this.#dialSavedKnownID();
1293
- this.#findHybridPeer();
1294
1554
  setTimeout(()=>{this.#dialUpdateSavedKnownID();},50000);
1555
+ setTimeout(()=>{this.#findHybridPeer();},60000);
1295
1556
  setTimeout(()=>{
1296
1557
  const peers = this.#libp2p.getPeers().length;
1297
1558
  if(peers == 0){
1298
1559
  this.#dialKnownID();
1299
- this.#findHybridPeer();
1560
+ setTimeout(()=>{this.#findHybridPeer();},60000);
1300
1561
  setTimeout(()=>{
1301
1562
  const peers = this.#libp2p.getPeers().length;
1302
1563
  if(peers == 0){
1303
- //currently not needed
1304
- //this.#dialKnownDNS()
1564
+ this.#dialKnownBootstrap();
1565
+ setTimeout(()=>{this.#findHybridPeer();},15000);
1305
1566
  setTimeout(()=>{
1306
- this.#libp2p.getPeers().length;
1307
- },15000);
1567
+ const peers = this.#libp2p.getPeers().length;
1568
+ if(peers == 0){
1569
+ this.#dialKnownDNS();
1570
+ setTimeout(()=>{this.#findHybridPeer();},15000);
1571
+ setTimeout(()=>{
1572
+ const peers = this.#libp2p.getPeers().length;
1573
+ if(peers == 0){
1574
+ this.#dialKnownDNSonly();
1575
+ setTimeout(()=>{this.#findHybridPeer();},15000);
1576
+ }
1577
+ },CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
1578
+ }
1579
+ },CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
1308
1580
  }
1309
- },15000);
1581
+ },CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
1310
1582
  }
1311
- },15000);
1583
+ },CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
1312
1584
  },5000);
1313
1585
  }
1314
1586
 
1315
-
1316
- //dial based on known bootsrap peers address
1317
- #dialKnownBootstrap(){
1318
- const bootstrap = CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS;
1319
- for(const peer of bootstrap){
1320
- const address = peer.Peers[0].Addrs;
1321
- const id = peer.Peers[0].ID;
1322
- let mddrs = [];
1323
- let addrs = [];
1324
- for(const addr of address){
1325
- const peeraddr = addr+'/p2p/'+id;
1326
- const peermddr = multiaddr(peeraddr);
1327
- addrs.push(peeraddr);
1328
- mddrs.push(peermddr);
1329
- }
1330
-
1331
- this.#dialedKnownBootstrap.set(id,addrs);
1332
- if(!this.#isConnected(id)){
1333
- this.#dialMultiaddress(mddrs);
1334
- }
1335
-
1336
- }
1337
- }
1338
-
1339
1587
  async #dialSavedKnownID(){
1588
+
1589
+ if(!navigator.onLine)return
1590
+ if(!this.#isDialEnabled)return
1591
+
1340
1592
  let firsttime = true;
1341
1593
  for(const target of CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
1342
1594
  if(this.#dbstoreData.has(target)){
@@ -1359,6 +1611,7 @@ class webpeerjs{
1359
1611
  const api = CONFIG_DELEGATED_API;
1360
1612
  const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
1361
1613
  const peer = await first(delegatedClient.getPeers(peerIdFromString(target)));
1614
+ if(!peer)continue
1362
1615
  const address = peer.Addrs;
1363
1616
  const id = peer.ID;
1364
1617
  let mddrs = [];
@@ -1379,16 +1632,26 @@ class webpeerjs{
1379
1632
  }
1380
1633
 
1381
1634
  async #dialUpdateSavedKnownID(){
1635
+
1636
+ if(!navigator.onLine)return
1637
+ if(!this.#isDialEnabled)return
1638
+
1382
1639
  let firsttime = true;
1383
1640
  for(const target of CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
1384
1641
  if(this.#dbstoreData.has(target)){
1385
1642
  firsttime = false;
1386
1643
  }
1387
- if(!this.#connections.has(target) && this.#isDialEnabled && (this.#dbstoreData.has(target) || firsttime)){
1644
+ if(!this.#connections.has(target) && (this.#dbstoreData.has(target) || firsttime)){
1388
1645
  //console.log('#dialUpdateSavedKnownID()',target)
1389
1646
  const api = CONFIG_DELEGATED_API;
1390
1647
  const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
1391
1648
  const peer = await first(delegatedClient.getPeers(peerIdFromString(target)));
1649
+ if(!peer){
1650
+ if (navigator.onLine) {
1651
+ await this.#dbstore.delete(new Key(target));
1652
+ }
1653
+ continue
1654
+ }
1392
1655
  const address = peer.Addrs;
1393
1656
  const id = peer.ID;
1394
1657
  let mddrs = [];
@@ -1411,6 +1674,10 @@ class webpeerjs{
1411
1674
 
1412
1675
  //dial based on known peers ID
1413
1676
  async #dialKnownID(){
1677
+
1678
+ if(!navigator.onLine)return
1679
+ if(!this.#isDialEnabled)return
1680
+
1414
1681
  //console.log('#dialKnownID()')
1415
1682
  const api = CONFIG_DELEGATED_API;
1416
1683
  const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
@@ -1437,118 +1704,149 @@ class webpeerjs{
1437
1704
  }
1438
1705
  }
1439
1706
  }
1440
-
1707
+
1708
+
1709
+ //dial based on known bootsrap peers address using Websocket expected
1710
+ #dialKnownBootstrap(){
1711
+
1712
+ if(!navigator.onLine)return
1713
+ if(!this.#isDialEnabled)return
1714
+
1715
+ const bootstrap = CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS;
1716
+ for(const peer of bootstrap){
1717
+ const address = peer.Peers[0].Addrs;
1718
+ const id = peer.Peers[0].ID;
1719
+ let mddrs = [];
1720
+ let addrs = [];
1721
+ for(const addr of address){
1722
+ if(!addr.includes('wss'))continue
1723
+ const peeraddr = addr+'/p2p/'+id;
1724
+ const peermddr = multiaddr(peeraddr);
1725
+ addrs.push(peeraddr);
1726
+ mddrs.push(peermddr);
1727
+ }
1728
+
1729
+ this.#dialedKnownBootstrap.set(id,addrs);
1730
+ this.#isDialWebsocket = true;
1731
+ if(!this.#isConnected(id)){
1732
+ this.#dialMultiaddress(mddrs);
1733
+ }
1734
+
1735
+ }
1736
+ }
1441
1737
 
1442
1738
  //dial based on known bootstrap DNS
1443
- /*async #dialKnownDNS(){
1444
- const dnsresolver = config.CONFIG_DNS_RESOLVER
1445
- const bootstrapdns = config.CONFIG_KNOWN_BOOTSTRAP_DNS
1446
- const response = await fetch(dnsresolver+'?name='+bootstrapdns+'&type=txt')
1447
- const json = await response.json()
1448
- const dns = json.Answer
1449
- const BOOTSTRAP_PEER_IDS = []
1739
+ async #dialKnownDNS(){
1740
+
1741
+ if(!navigator.onLine)return
1742
+ if(!this.#isDialEnabled)return
1743
+
1744
+ const dnsresolver = CONFIG_DNS_RESOLVER;
1745
+ const bootstrapdns = CONFIG_KNOWN_BOOTSTRAP_DNS;
1746
+ const response = await fetch(dnsresolver+'?name='+bootstrapdns+'&type=txt');
1747
+ const json = await response.json();
1748
+ const dns = json.Answer;
1749
+ const BOOTSTRAP_PEER_IDS = [];
1450
1750
  for(const dnsaddr of dns){
1451
- const id = dnsaddr.data.split('/').pop()
1452
- BOOTSTRAP_PEER_IDS.push(id)
1751
+ const id = dnsaddr.data.split('/').pop();
1752
+ BOOTSTRAP_PEER_IDS.push(id);
1453
1753
  }
1454
- const api = config.CONFIG_DELEGATED_API
1455
- const delegatedClient = createDelegatedRoutingV1HttpApiClient(api)
1754
+ const api = CONFIG_DELEGATED_API;
1755
+ const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
1456
1756
  const peers = await Promise.all(
1457
1757
  BOOTSTRAP_PEER_IDS.map((peerId) => first(delegatedClient.getPeers(peerIdFromString(peerId)))),
1458
- )
1758
+ );
1459
1759
  for(const peer of peers){
1460
- const address = peer.Addrs
1461
- const id = peer.ID
1462
- let mddrs = []
1463
- let addrs = []
1760
+ const address = peer.Addrs;
1761
+ const id = peer.ID;
1762
+ let mddrs = [];
1763
+ let addrs = [];
1464
1764
  for(const addr of address){
1465
- const peeraddr = addr.toString()+'/p2p/'+id.toString()
1466
- const peermddr = multiaddr(peeraddr)
1467
- addrs.push(peeraddr)
1468
- mddrs.push(peermddr)
1765
+ const peeraddr = addr.toString()+'/p2p/'+id.toString();
1766
+ const peermddr = multiaddr(peeraddr);
1767
+ addrs.push(peeraddr);
1768
+ mddrs.push(peermddr);
1469
1769
  }
1470
1770
 
1471
- this.#dialedKnownBootstrap.set(id,addrs)
1771
+ this.#dialedKnownBootstrap.set(id,addrs);
1772
+ this.#isDialWebsocket = true;
1472
1773
  if(!this.#isConnected(id)){
1473
- this.#dialMultiaddress(mddrs)
1774
+ this.#dialMultiaddress(mddrs);
1474
1775
  }
1475
1776
  }
1476
1777
 
1477
- }*/
1778
+ }
1478
1779
 
1479
1780
 
1480
1781
  //dial based on known bootstrap DNS using DNS resolver only
1481
- /*async #dialKnownDNSonly(){
1482
- const dnsresolver = config.CONFIG_DNS_RESOLVER
1483
- const bootstrapdns = config.CONFIG_KNOWN_BOOTSTRAP_DNS
1484
- const response = await fetch(dnsresolver+'?name='+bootstrapdns+'&type=txt')
1485
- const json = await response.json()
1486
- const dns = json.Answer
1782
+ async #dialKnownDNSonly(){
1783
+
1784
+ if(!navigator.onLine)return
1785
+ if(!this.#isDialEnabled)return
1786
+
1787
+ const dnsresolver = CONFIG_DNS_RESOLVER;
1788
+ const bootstrapdns = CONFIG_KNOWN_BOOTSTRAP_DNS;
1789
+ const response = await fetch(dnsresolver+'?name='+bootstrapdns+'&type=txt');
1790
+ const json = await response.json();
1791
+ const dns = json.Answer;
1487
1792
 
1488
1793
  for(const dnsitem of dns){
1489
- const arr = dnsitem.data.split('/')
1490
- const id = arr.pop()
1491
- const dnsaddr = '_dnsaddr.'+arr[2]
1492
- this.#dialDNSWebsocketWebtransport(id,dnsaddr)
1794
+ const arr = dnsitem.data.split('/');
1795
+ const id = arr.pop();
1796
+ const dnsaddr = '_dnsaddr.'+arr[2];
1797
+ this.#dialDNSWebsocketWebtransport(id,dnsaddr);
1493
1798
  }
1494
- }*/
1799
+ }
1495
1800
 
1496
1801
 
1497
1802
  //dial DNS with webtransport and websocket
1498
- /*async #dialDNSWebsocketWebtransport(id,dnsaddr){
1499
- const dnsresolver = config.CONFIG_DNS_RESOLVER
1500
- const response = await fetch(dnsresolver+'?name='+dnsaddr+'&type=txt')
1501
- const json = await response.json()
1502
- const dns = json.Answer
1503
- let mddrs = []
1504
- let addrs = []
1803
+ async #dialDNSWebsocketWebtransport(id,dnsaddr){
1804
+ const dnsresolver = CONFIG_DNS_RESOLVER;
1805
+ const response = await fetch(dnsresolver+'?name='+dnsaddr+'&type=txt');
1806
+ const json = await response.json();
1807
+ const dns = json.Answer;
1808
+ let mddrs = [];
1809
+ let addrs = [];
1505
1810
  for(const dnsitem of dns){
1506
- const arr = dnsitem.data.split('=')
1507
- const dnsaddr = arr[1]
1508
- const maddr = multiaddr(dnsaddr)
1509
- mddrs.push(maddr)
1510
- addrs.push(dnsaddr)
1811
+ const arr = dnsitem.data.split('=');
1812
+ const dnsaddr = arr[1];
1813
+ const maddr = multiaddr(dnsaddr);
1814
+ mddrs.push(maddr);
1815
+ addrs.push(dnsaddr);
1511
1816
  }
1512
1817
 
1513
1818
 
1514
- this.#isDialWebsocket = true
1515
- this.#dialedKnownBootstrap.set(id,addrs)
1819
+ this.#isDialWebsocket = true;
1820
+ this.#dialedKnownBootstrap.set(id,addrs);
1516
1821
 
1517
- this.#dialedKnownBootstrap.set(id,addrs)
1822
+ this.#dialedKnownBootstrap.set(id,addrs);
1518
1823
  if(!this.#isConnected(id)){
1519
- this.#dialMultiaddress(mddrs)
1520
- this.#dialWebsocket(mddrs)
1824
+ this.#dialMultiaddress(mddrs);
1825
+ this.#dialWebsocket(mddrs);
1521
1826
  }
1522
- }*/
1827
+ }
1523
1828
 
1524
1829
 
1525
1830
  //dial only webtransport multiaddrs
1526
1831
  async #dialWebtransport(multiaddrs){
1527
1832
  const webTransportMadrs = multiaddrs.filter((maddr) => maddr.protoNames().includes('webtransport')&&maddr.protoNames().includes('certhash'));
1528
- for (const addr of webTransportMadrs) {
1833
+ for (const mddr of webTransportMadrs) {
1529
1834
  try {
1530
- //console.log(`attempting to dial webtransport multiaddr: %o`, addr.toString())
1531
- await this.#libp2p.dial(addr);
1835
+ //console.log(`attempting to dial webtransport multiaddr: %o`, mddr.toString())
1836
+ await this.#libp2p.dial(mddr);
1532
1837
  return // if we succeed dialing the peer, no need to try another address
1533
1838
  } catch (error) {
1534
1839
  }
1535
1840
  }
1536
1841
  }
1537
-
1538
- //dial only webtransport multiaddrs
1539
- /*#dialWebtransport1(multiaddrs){
1540
- const webTransportMadrs = multiaddrs.filter((maddr) => maddr.protoNames().includes('webtransport')&&maddr.protoNames().includes('certhash'))
1541
- if(webTransportMadrs.length == 0)return
1542
- this.#libp2p.dial(webTransportMadrs).then((data)=>{console.warn(data)},(data)=>{console.warn(data)})
1543
- }*/
1544
1842
 
1545
1843
  //dial only websocket multiaddrs
1546
1844
  async #dialWebsocket(multiaddrs){
1547
1845
  const webSocketMadrs = multiaddrs.filter((maddr) => maddr.protoNames().includes('wss'));
1548
- for (const addr of webSocketMadrs) {
1846
+ for (const mddr of webSocketMadrs) {
1549
1847
  try {
1550
- //console.log(`attempting to dial websocket multiaddr: %o`, addr)
1551
- await this.#libp2p.dial(addr);
1848
+ //console.log(`attempting to dial websocket multiaddr: %o`, mddr)
1849
+ await this.#libp2p.dial(mddr);
1552
1850
  return // if we succeed dialing the peer, no need to try another address
1553
1851
  } catch (error) {
1554
1852
  }
@@ -1586,7 +1884,8 @@ class webpeerjs{
1586
1884
  ],
1587
1885
  },
1588
1886
  transports:[
1589
- webTransport(),
1887
+ webTransport(),
1888
+ webSockets(),
1590
1889
  circuitRelayTransport({
1591
1890
  discoverRelays: CONFIG_DISCOVER_RELAYS,
1592
1891
  reservationConcurrency: 1,