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.
- package/README.md +21 -8
- package/dist/esm/webpeerjs.d.ts +3 -2
- package/dist/esm/webpeerjs.js +532 -233
- package/dist/umd/webpeerjs.js +48600 -47394
- package/package.json +13 -14
- package/src/config.js +49 -10
- package/src/peer.js +2 -5
- package/src/utils.js +19 -8
- package/src/webpeerjs.js +442 -173
package/dist/esm/webpeerjs.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
58
|
-
|
|
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>
|
|
279
|
+
if(treshold>30){
|
|
247
280
|
//console.log(`Treeshold hit : ${treshold}`)
|
|
248
281
|
}
|
|
249
282
|
|
|
250
|
-
if(fail>
|
|
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)>
|
|
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)
|
|
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>
|
|
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
|
|
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
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
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
|
-
|
|
893
|
+
onConnect = f => (this.#onConnectFn = f)
|
|
827
894
|
|
|
828
895
|
|
|
829
896
|
//Listen on peer disconnect
|
|
830
897
|
#onDisconnectFn = () => {}
|
|
831
|
-
|
|
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
|
-
|
|
856
|
-
|
|
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:
|
|
861
|
-
maxOutboundStreams:
|
|
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
|
-
#
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
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
|
-
}
|
|
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
|
|
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(
|
|
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.
|
|
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(
|
|
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(
|
|
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
|
-
},
|
|
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
|
-
|
|
1304
|
-
|
|
1564
|
+
this.#dialKnownBootstrap();
|
|
1565
|
+
setTimeout(()=>{this.#findHybridPeer();},15000);
|
|
1305
1566
|
setTimeout(()=>{
|
|
1306
|
-
this.#libp2p.getPeers().length;
|
|
1307
|
-
|
|
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
|
-
},
|
|
1581
|
+
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1310
1582
|
}
|
|
1311
|
-
},
|
|
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) &&
|
|
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
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
const
|
|
1449
|
-
const
|
|
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 =
|
|
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
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
const
|
|
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
|
-
|
|
1499
|
-
const dnsresolver =
|
|
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
|
|
1833
|
+
for (const mddr of webTransportMadrs) {
|
|
1529
1834
|
try {
|
|
1530
|
-
//console.log(`attempting to dial webtransport multiaddr: %o`,
|
|
1531
|
-
await this.#libp2p.dial(
|
|
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
|
|
1846
|
+
for (const mddr of webSocketMadrs) {
|
|
1549
1847
|
try {
|
|
1550
|
-
//console.log(`attempting to dial websocket multiaddr: %o`,
|
|
1551
|
-
await this.#libp2p.dial(
|
|
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,
|