webpeerjs 0.0.5 → 0.0.7

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/src/utils.js CHANGED
@@ -12,6 +12,10 @@ const prefix = config.CONFIG_PREFIX
12
12
 
13
13
  export const mkErr = msg => new Error(`${prefix}: ${msg}`)
14
14
 
15
+ export function mkDebug(error){
16
+ return
17
+ }
18
+
15
19
  export {PBPeer}
16
20
 
17
21
  export function uint8ArrayToString(uint8Array){
@@ -82,6 +86,7 @@ let lastStats = {
82
86
 
83
87
  let isDialEnabled = true
84
88
  let lastfailtreshold = 0
89
+ let fail = 0
85
90
 
86
91
  export function metrics(data){
87
92
  try{
@@ -134,29 +139,29 @@ export function metrics(data){
134
139
 
135
140
  lastStats = webTransportEvents
136
141
 
137
- const fail = errors+timeouts
142
+ fail = errors+timeouts
138
143
  const treshold = errors+timeouts+stats.open+stats.pending
139
144
 
140
- if(treshold>60){
145
+ if(treshold>40){
141
146
  //console.log(`Treeshold hit : ${treshold}`)
142
147
  }
143
148
 
144
- if(fail>60){
149
+ if(fail>40){
145
150
  //console.log(`Open : ${stats.open} , Pending : ${stats.pending} , Succes : ${totals.success} , Fail : ${fail} `)
146
151
 
147
152
  }
148
153
 
149
- if ((fail-lastfailtreshold)>30){
154
+ if ((fail-lastfailtreshold)>40){
150
155
  if(isDialEnabled){
151
156
  isDialEnabled = false
152
157
  const str = JSON.stringify({isDialEnabled,fail,lastfailtreshold})
153
- console.warn(str)
158
+ console.warn('dial disabled')
154
159
  setTimeout(()=>{
155
160
  if(!isDialEnabled){
156
161
  isDialEnabled = true
157
162
  lastfailtreshold = fail
158
163
  const str = JSON.stringify({isDialEnabled,fail,lastfailtreshold})
159
- console.warn(str)
164
+ console.warn('dial enabled')
160
165
  }
161
166
  },6*60*1000)
162
167
  }
package/src/webpeerjs.js CHANGED
@@ -8,7 +8,8 @@ import {
8
8
  Key,
9
9
  msgIdFnStrictNoSign,
10
10
  metrics,
11
- getDigest
11
+ getDigest,
12
+ mkDebug
12
13
  } from './utils'
13
14
  import { createDelegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-v1-http-api-client'
14
15
  import { createLibp2p } from 'libp2p'
@@ -129,20 +130,27 @@ class webpeerjs{
129
130
 
130
131
 
131
132
  //listen to peer connect event
132
- this.#libp2p.addEventListener("peer:connect", (evt) => {
133
-
134
- //console.log(`Connected to ${connection.toString()}`);
133
+ this.#libp2p.addEventListener("peer:connect",async (evt) => {
135
134
 
136
135
  const connection = evt.detail;
137
136
  const id = evt.detail.toString()
138
137
 
138
+ //console.log('peer:connect '+id,evt)
139
+
139
140
  const connections = this.#libp2p.getConnections().map((con)=>{return {id:con.remotePeer.toString(),addr:con.remoteAddr.toString()}})
140
141
  const connect = connections.find((con)=>con.id == id)
141
142
  const addr = connect.addr
143
+
144
+ if(config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) || config.CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS.includes(id)){
145
+ if(!this.#connections.has(id)&&addr.includes('webtransport')){
146
+ await this.#dbstore.put(new Key(id), new TextEncoder().encode(addr))
147
+ }
148
+ }
149
+
142
150
  this.#connections.set(id,addr)
143
151
 
144
152
  //required by joinRoom version 1 to announce via universal connectivity
145
- if(connection.toString() === config.CONFIG_KNOWN_BOOTSTRAP_PEER_IDS[0]){
153
+ if(config.CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS.includes(id)){
146
154
  setTimeout(()=>{
147
155
  this.#announce()
148
156
  setTimeout(()=>{
@@ -151,6 +159,31 @@ class webpeerjs{
151
159
  },1000)
152
160
  }
153
161
 
162
+ if(this.#webPeersId.includes(id)){
163
+
164
+ let address = [addr]
165
+
166
+ if(this.#connectedPeers.has(id)){
167
+ //reset this last seen
168
+ const now = new Date().getTime()
169
+ const metadata = {addrs:address,last:now}
170
+ this.#connectedPeers.set(id,metadata)
171
+ }
172
+ else{
173
+ //add to connected webpeers
174
+ this.#onConnectFn(id)
175
+ const now = new Date().getTime()
176
+ const metadata = {addrs:address,last:now}
177
+ this.#connectedPeers.set(id,metadata)
178
+ this.#connectedPeersArr.length = 0
179
+ for(const peer of this.#connectedPeers){
180
+ const item = {id:peer[0],address:peer[1].addrs}
181
+ this.#connectedPeersArr.push(item)
182
+ }
183
+ }
184
+
185
+ }
186
+
154
187
  });
155
188
 
156
189
 
@@ -187,6 +220,11 @@ class webpeerjs{
187
220
  const now = new Date().getTime()
188
221
  const metadata = {addrs:address,last:now}
189
222
  this.#connectedPeers.set(senderPeerId,metadata)
223
+ this.#connectedPeersArr.length = 0
224
+ for(const peer of this.#connectedPeers){
225
+ const item = {id:peer[0],address:peer[1].addrs}
226
+ this.#connectedPeersArr.push(item)
227
+ }
190
228
  }
191
229
 
192
230
  //dial if not connected
@@ -302,7 +340,7 @@ class webpeerjs{
302
340
  }
303
341
 
304
342
  //update connected webpeers
305
- const now = new Date().getTime()
343
+ /*const now = new Date().getTime()
306
344
  const metadata = {addrs:address,last:now}
307
345
  this.#connectedPeers.set(id,metadata)
308
346
  this.#webPeersAddrs.set(id,address)
@@ -310,14 +348,14 @@ class webpeerjs{
310
348
  for(const peer of this.#connectedPeers){
311
349
  const item = {id:peer[0],address:peer[1].addrs}
312
350
  this.#connectedPeersArr.push(item)
313
- }
351
+ }*/
314
352
 
315
353
  }
316
354
  }
317
355
 
318
356
  }catch(err){
319
357
  //console.log('from '+event.detail.from.toString())
320
- console.debug(err)
358
+ mkDebug(err)
321
359
  }
322
360
  }else{
323
361
  const json = JSON.parse(topic)
@@ -368,7 +406,7 @@ class webpeerjs{
368
406
  const mddr = multiaddr(addr)
369
407
  mddrs.push(mddr)
370
408
  }
371
- //this.#dialMultiaddress(mddrs)
409
+ this.#dialMultiaddress(mddrs)
372
410
  }
373
411
  }
374
412
  }
@@ -432,7 +470,7 @@ class webpeerjs{
432
470
  let mddrs = []
433
471
  const addrs = multiaddr(addr)
434
472
  mddrs.push(addrs)
435
- this.#dialMultiaddress(mddrs)
473
+ //this.#dialMultiaddress(mddrs)
436
474
  }
437
475
  });
438
476
 
@@ -454,6 +492,45 @@ class webpeerjs{
454
492
  this.#ping()
455
493
  })
456
494
 
495
+ this.#libp2p.addEventListener('peer:identify', (evt) => {
496
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
497
+ if(evt.detail.protocols.includes(config.CONFIG_PROTOCOL)){
498
+ //console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
499
+
500
+ const id = evt.detail.peerId.toString()
501
+ let address = []
502
+
503
+ for(const addrs of evt.detail.listenAddrs){
504
+ const addr = addrs.toString()+'/p2p/'+id
505
+ if(addr.includes('webtransport')){
506
+ address.push(addr)
507
+ }
508
+ }
509
+
510
+ if(!this.#webPeersId.includes(id))this.#webPeersId.push(id)
511
+
512
+ if(this.#connectedPeers.has(id)){
513
+ //reset this last seen
514
+ const now = new Date().getTime()
515
+ const metadata = {addrs:address,last:now}
516
+ this.#connectedPeers.set(id,metadata)
517
+ }
518
+ else{
519
+ //add to connected webpeers
520
+ this.#onConnectFn(id)
521
+ const now = new Date().getTime()
522
+ const metadata = {addrs:address,last:now}
523
+ this.#connectedPeers.set(id,metadata)
524
+ this.#connectedPeersArr.length = 0
525
+ for(const peer of this.#connectedPeers){
526
+ const item = {id:peer[0],address:peer[1].addrs}
527
+ this.#connectedPeersArr.push(item)
528
+ }
529
+ }
530
+
531
+ }
532
+ })
533
+
457
534
  //dial known peers from configuration
458
535
  this.#dialKnownPeers()
459
536
 
@@ -468,6 +545,9 @@ class webpeerjs{
468
545
 
469
546
  //dial random discovered peers
470
547
  //this.#dialdiscoveredpeers()
548
+
549
+ this.#registerProtocol()
550
+
471
551
 
472
552
  onMetrics((data)=>{
473
553
  const signal = metrics(data)
@@ -487,16 +567,7 @@ class webpeerjs{
487
567
  setInterval(()=>{
488
568
  this.#trackLastSeen()
489
569
  },5e3)
490
-
491
- setInterval(async()=>{
492
- /*const peerId = peerIdFromString('QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN')
493
- //const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
494
-
495
- //console.info(peerInfo)
496
- for await (const event of this.#libp2p.services.aminoDHT.findPeer(peerId)){
497
- console.info(event)
498
- }*/
499
- },5e3)
570
+
500
571
 
501
572
  /*setTimeout(async()=>{
502
573
  try{
@@ -517,6 +588,14 @@ class webpeerjs{
517
588
  }
518
589
  },60e3)*/
519
590
 
591
+ /*setTimeout(async()=>{
592
+ const key = uint8ArrayFromString(config.CONFIG_PREFIX)
593
+ const value = uint8ArrayFromString(this.id)
594
+ for await (const event of this.#libp2p.services.aminoDHT.put(key,value)){
595
+ console.log('put',event)
596
+ }
597
+ },30e3)*/
598
+
520
599
  }
521
600
 
522
601
 
@@ -542,6 +621,62 @@ class webpeerjs{
542
621
  PRIVATE FUNCTION
543
622
  */
544
623
 
624
+ async #registerProtocol(){
625
+ const handler = ({ connection, stream, protocol }) => {
626
+ // use stream or connection according to the needs
627
+ }
628
+
629
+ await this.#libp2p.handle(config.CONFIG_PROTOCOL, handler, {
630
+ maxInboundStreams: 5,
631
+ maxOutboundStreams: 5
632
+ })
633
+
634
+ await this.#libp2p.register(config.CONFIG_PROTOCOL, {
635
+ onConnect: (peer, connection) => {
636
+ // handle connect
637
+ //console.log('handle connect',peer)
638
+ },
639
+ onDisconnect: (peer, connection) => {
640
+ // handle disconnect
641
+ //console.log('handle disconnect',peer)
642
+ }
643
+ })
644
+
645
+ }
646
+
647
+ #findHybridPeer(){
648
+ setTimeout(async()=>{
649
+ for(const target of config.CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
650
+ if(!this.#isConnected(target) && !this.#connections.has(target) && this.#isDialEnabled ){
651
+ //console.log('findPeer',target)
652
+ const peerId = peerIdFromString(target)
653
+ //const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
654
+
655
+ //console.info(peerInfo)
656
+ for await (const event of this.#libp2p.services.aminoDHT.findPeer(peerId)){
657
+ //console.info('findPeer',event)
658
+ if (event.name === 'FINAL_PEER'){
659
+ //console.log(event.peer.id.toString(),event.peer.multiaddrs.toString())
660
+ let mddrs = []
661
+ let addrs = []
662
+ const id = event.peer.id.toString()
663
+ for(const mddr of event.peer.multiaddrs){
664
+ const peeraddr = mddr.toString()+'/p2p/'+id
665
+ const peermddr = multiaddr(peeraddr)
666
+ addrs.push(peeraddr)
667
+ mddrs.push(peermddr)
668
+ }
669
+ this.#dialedKnownBootstrap.set(id,addrs)
670
+ if(!this.#isConnected(id)){
671
+ this.#dialMultiaddress(mddrs)
672
+ }
673
+ }
674
+ }
675
+ }
676
+ }
677
+ },60e3)
678
+ }
679
+
545
680
 
546
681
  //check the last seen in web peer
547
682
  #trackLastSeen(){
@@ -603,7 +738,7 @@ class webpeerjs{
603
738
  return
604
739
  }
605
740
 
606
- if(this.#webPeersId.includes(id) || id == config.CONFIG_KNOWN_BOOTSTRAP_PEER_IDS[0] ){
741
+ if(this.#webPeersId.includes(id) || config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) || config.CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS.includes(id)){
607
742
  this.#dialQueue.unshift(mddrs)
608
743
  }
609
744
  else{
@@ -618,7 +753,7 @@ class webpeerjs{
618
753
 
619
754
  if(!this.#isDialEnabled)return
620
755
 
621
- const mddrsToDial = 3
756
+ const mddrsToDial = 5
622
757
 
623
758
  let queue = []
624
759
  for(const item of this.#libp2p.getDialQueue()){
@@ -636,6 +771,8 @@ class webpeerjs{
636
771
 
637
772
  if(this.#isConnected(id))continue
638
773
  if(queue.includes(id)){continue;}
774
+
775
+ //console.log('dial',id)
639
776
 
640
777
  //dial with webtransport
641
778
  this.#dialWebtransport(mddrs)
@@ -718,7 +855,7 @@ class webpeerjs{
718
855
  },
719
856
  members : [this.id],
720
857
  onMembers : () => {},
721
- onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members)},
858
+ onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);this.#ping()},
722
859
  }
723
860
  }
724
861
 
@@ -755,13 +892,15 @@ class webpeerjs{
755
892
  #dialRandomBootstrap(){
756
893
  setInterval(()=>{
757
894
  //const keys = Array.from(this.#dialedKnownBootstrap.keys())
758
- const keys = config.CONFIG_KNOWN_BOOTSTRAP_PEER_IDS
895
+ const keys = config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS
759
896
  const randomKey = Math.floor(Math.random() * keys.length)
760
897
  let ids = []
761
898
  ids.push(keys[randomKey])
762
899
 
763
900
  //universal connectivity id for webpeer discovery and joinRoom version 1 to work
764
- ids.push(config.CONFIG_KNOWN_BOOTSTRAP_PEER_IDS[0])
901
+ for(const id of config.CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
902
+ ids.push(id)
903
+ }
765
904
 
766
905
  for(const id of ids){
767
906
  if(id == undefined)continue
@@ -828,7 +967,7 @@ class webpeerjs{
828
967
  if(besttime>bestlimit){
829
968
  const addr = remote.toString()
830
969
  const id = peer.toString()
831
- if(!this.#webPeersId.includes(id) && !config.CONFIG_KNOWN_BOOTSTRAP_PEER_IDS.includes(id) && !this.#dbstoreData.get(id) && !addr.includes('p2p-circuit')){
970
+ if(!this.#webPeersId.includes(id) && !config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) && !this.#dbstoreData.get(id) && !addr.includes('p2p-circuit') && addr.includes('webtransport')){
832
971
  //await this.#dbstore.delete(new Key(id))
833
972
  await this.#dbstore.put(new Key(id), new TextEncoder().encode(addr))
834
973
  this.#dbstoreData.set(id,addr)
@@ -897,7 +1036,7 @@ class webpeerjs{
897
1036
  }
898
1037
  }
899
1038
 
900
- },30*1000)
1039
+ },15*1000)
901
1040
  }
902
1041
 
903
1042
 
@@ -920,27 +1059,32 @@ class webpeerjs{
920
1059
  //dial to all known bootstrap peers and DNS
921
1060
  #dialKnownPeers(){
922
1061
  //this.#dialKnownBootstrap()
923
- //setTimeout(()=>{
924
- //const peers = this.#libp2p.getPeers().length
925
- //if(peers == 0){
926
- //currently not needed
927
- this.#dialKnownID()
928
- setTimeout(()=>{
929
- const peers = this.#libp2p.getPeers().length
930
- if(peers == 0){
931
- //currently not needed
932
- //this.#dialKnownDNS()
933
- setTimeout(()=>{
934
- const peers = this.#libp2p.getPeers().length
935
- if(peers == 0){
936
- //currently not needed
937
- //this.#dialKnownDNSonly()
938
- }
939
- },15000)
940
- }
941
- },15000)
942
- //}
943
- //},15000)
1062
+ setTimeout(()=>{
1063
+ this.#dialSavedKnownID()
1064
+ this.#findHybridPeer()
1065
+ setTimeout(()=>{this.#dialUpdateSavedKnownID()},50000)
1066
+ setTimeout(()=>{
1067
+ const peers = this.#libp2p.getPeers().length
1068
+ if(peers == 0){
1069
+ this.#dialKnownID()
1070
+ this.#findHybridPeer()
1071
+ setTimeout(()=>{
1072
+ const peers = this.#libp2p.getPeers().length
1073
+ if(peers == 0){
1074
+ //currently not needed
1075
+ //this.#dialKnownDNS()
1076
+ setTimeout(()=>{
1077
+ const peers = this.#libp2p.getPeers().length
1078
+ if(peers == 0){
1079
+ //currently not needed
1080
+ //this.#dialKnownDNSonly()
1081
+ }
1082
+ },15000)
1083
+ }
1084
+ },15000)
1085
+ }
1086
+ },15000)
1087
+ },5000)
944
1088
  }
945
1089
 
946
1090
 
@@ -967,12 +1111,81 @@ class webpeerjs{
967
1111
  }
968
1112
  }
969
1113
 
1114
+ async #dialSavedKnownID(){
1115
+ let firsttime = true
1116
+ for(const target of config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
1117
+ if(this.#dbstoreData.has(target)){
1118
+ firsttime = false
1119
+ let mddrs = []
1120
+ let addrs = []
1121
+ const id = target
1122
+ const peeraddr = this.#dbstoreData.get(target)
1123
+ const peermddr = multiaddr(peeraddr)
1124
+ addrs.push(peeraddr)
1125
+ mddrs.push(peermddr)
1126
+ this.#dialedKnownBootstrap.set(id,addrs)
1127
+ if(!this.#isConnected(id)){
1128
+ this.#dialMultiaddress(mddrs)
1129
+ }
1130
+ }
1131
+ }
1132
+ if(firsttime){
1133
+ for(const target of config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
1134
+ const api = config.CONFIG_DELEGATED_API
1135
+ const delegatedClient = createDelegatedRoutingV1HttpApiClient(api)
1136
+ const peer = await first(delegatedClient.getPeers(peerIdFromString(target)))
1137
+ const address = peer.Addrs
1138
+ const id = peer.ID
1139
+ let mddrs = []
1140
+ let addrs = []
1141
+ for(const addr of address){
1142
+ const peeraddr = addr.toString()+'/p2p/'+id.toString()
1143
+ const peermddr = multiaddr(peeraddr)
1144
+ addrs.push(peeraddr)
1145
+ mddrs.push(peermddr)
1146
+ }
1147
+
1148
+ this.#dialedKnownBootstrap.set(id,addrs)
1149
+ if(!this.#isConnected(id)){
1150
+ this.#dialMultiaddress(mddrs)
1151
+ }
1152
+ }
1153
+ }
1154
+ }
1155
+
1156
+ async #dialUpdateSavedKnownID(){
1157
+ for(const target of config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
1158
+ if(!this.#connections.has(target) && this.#isDialEnabled && this.#dbstoreData.has(target)){
1159
+ //console.log('#dialUpdateSavedKnownID()',target)
1160
+ const api = config.CONFIG_DELEGATED_API
1161
+ const delegatedClient = createDelegatedRoutingV1HttpApiClient(api)
1162
+ const peer = await first(delegatedClient.getPeers(peerIdFromString(target)))
1163
+ const address = peer.Addrs
1164
+ const id = peer.ID
1165
+ let mddrs = []
1166
+ let addrs = []
1167
+ for(const addr of address){
1168
+ const peeraddr = addr.toString()+'/p2p/'+id.toString()
1169
+ const peermddr = multiaddr(peeraddr)
1170
+ addrs.push(peeraddr)
1171
+ mddrs.push(peermddr)
1172
+ }
1173
+
1174
+ this.#dialedKnownBootstrap.set(id,addrs)
1175
+ if(!this.#isConnected(id)){
1176
+ this.#dialMultiaddress(mddrs)
1177
+ }
1178
+ }
1179
+ }
1180
+ }
1181
+
970
1182
 
971
1183
  //dial based on known peers ID
972
1184
  async #dialKnownID(){
1185
+ //console.log('#dialKnownID()')
973
1186
  const api = config.CONFIG_DELEGATED_API
974
1187
  const delegatedClient = createDelegatedRoutingV1HttpApiClient(api)
975
- const BOOTSTRAP_PEER_IDS = config.CONFIG_KNOWN_BOOTSTRAP_PEER_IDS
1188
+ const BOOTSTRAP_PEER_IDS = config.CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS
976
1189
  const peers = await Promise.all(
977
1190
  BOOTSTRAP_PEER_IDS.map((peerId) => first(delegatedClient.getPeers(peerIdFromString(peerId)))),
978
1191
  )
@@ -1090,7 +1303,7 @@ class webpeerjs{
1090
1303
  return // if we succeed dialing the peer, no need to try another address
1091
1304
  } catch (error) {
1092
1305
  //console.log(`failed to dial webtransport multiaddr: %o`, addr.toString())
1093
- console.debug(error)
1306
+ mkDebug(error)
1094
1307
  }
1095
1308
  }
1096
1309
  }
@@ -1112,7 +1325,7 @@ class webpeerjs{
1112
1325
  return // if we succeed dialing the peer, no need to try another address
1113
1326
  } catch (error) {
1114
1327
  //console.log(`failed to dial websocket multiaddr: %o`, addr)
1115
- console.debug(error)
1328
+ mkDebug(error)
1116
1329
  }
1117
1330
  }
1118
1331
  }
@@ -1122,7 +1335,7 @@ class webpeerjs{
1122
1335
  static async createWebpeer(){
1123
1336
 
1124
1337
  // all libp2p debug logs
1125
- localStorage.setItem('debug', 'libp2p:*')
1338
+ //localStorage.setItem('debug', 'libp2p:*')
1126
1339
 
1127
1340
  const dbstore = new IDBDatastore(config.CONFIG_DBSTORE_PATH)
1128
1341
  await dbstore.open()