webpeerjs 0.0.9 → 0.1.0
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 +15 -18
- package/dist/esm/webpeerjs.js +250 -171
- package/dist/umd/webpeerjs.js +50738 -47615
- package/package.json +5 -1
- package/src/config.js +49 -9
- package/src/peer.js +2 -5
- package/src/webpeerjs.js +159 -113
package/dist/esm/webpeerjs.js
CHANGED
|
@@ -11,6 +11,9 @@ import { createDelegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-
|
|
|
11
11
|
import { createLibp2p } from 'libp2p';
|
|
12
12
|
import { IDBDatastore } from 'datastore-idb';
|
|
13
13
|
import { webTransport } from '@libp2p/webtransport';
|
|
14
|
+
import { webSockets } from '@libp2p/websockets';
|
|
15
|
+
import { webRTC } from '@libp2p/webrtc';
|
|
16
|
+
import { dcutr } from '@libp2p/dcutr';
|
|
14
17
|
import { noise } from '@chainsafe/libp2p-noise';
|
|
15
18
|
import { yamux } from '@chainsafe/libp2p-yamux';
|
|
16
19
|
import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery';
|
|
@@ -32,21 +35,17 @@ const CONFIG_PEER_DISCOVERY_UNIVERSAL_CONNECTIVITY = 'universal-connectivity-bro
|
|
|
32
35
|
const CONFIG_PEER_DISCOVERY_GLOBAL = '_peer-discovery._p2p._pubsub';
|
|
33
36
|
const CONFIG_PEER_DISCOVERY_WEBPEERJS= prefix$1+'-peer-discovery';
|
|
34
37
|
const CONFIG_PUBSUB_PEER_DISCOVERY = [CONFIG_PEER_DISCOVERY_GLOBAL, CONFIG_PEER_DISCOVERY_UNIVERSAL_CONNECTIVITY, CONFIG_PEER_DISCOVERY_WEBPEERJS];
|
|
38
|
+
const CONFIG_PUPSUB_PEER_DATA = ['_'+prefix$1+'-peer-data_'];
|
|
35
39
|
const CONFIG_DELEGATED_API = 'https://delegated-ipfs.dev';
|
|
40
|
+
const CONFIG_DNS_RESOLVER = 'https://dns.google/resolve';
|
|
41
|
+
const CONFIG_KNOWN_BOOTSTRAP_DNS = '_dnsaddr.bootstrap.libp2p.io';
|
|
42
|
+
const CONFIG_TIMEOUT_DIAL_KNOWN_PEERS = 15000;
|
|
36
43
|
|
|
37
44
|
const CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS = [
|
|
38
45
|
'QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN',
|
|
39
46
|
'QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb',
|
|
40
47
|
'QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt',
|
|
41
|
-
'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ'
|
|
42
|
-
'12D3KooWPEDBmt7vm6FNNYuqaA4n2qMUZ6wPK5NcRc8t6KpqgRkV',
|
|
43
|
-
'12D3KooWSHbugDEQeWm2LjtRRMpNgLu6oZ8zkX8XcTwYMAewVekP',
|
|
44
|
-
'12D3KooWASoxFpwwy8JDdu4Tm57mhESsnbFPogam9VVmhR95FGXr',
|
|
45
|
-
'12D3KooWHh98YpAkJsn3ULjMjK1n9QVkXmi8Sb3gTDMatHxCmDP5',
|
|
46
|
-
'12D3KooWS79EhkPU7ESUwgG4vyHHzW9FDNZLoWVth9b5N5NSrvaj',
|
|
47
|
-
'12D3KooWBbkCD5MpJhMc1mfPAVGEyVkQnyxPKGS7AHwDqQM2JUsk',
|
|
48
|
-
'12D3KooWKLdecs31Zmo2pLBjR9HY2vWo3VwM4eBm21Czeucbe6FL',
|
|
49
|
-
'12D3KooWBdF3g6vSJFRPoZQo7BNnkNzaWb59gpyaVzsgtNTVeu8H'
|
|
48
|
+
'QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ'
|
|
50
49
|
];
|
|
51
50
|
|
|
52
51
|
const CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS = [
|
|
@@ -56,13 +55,46 @@ const CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS = [
|
|
|
56
55
|
const CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS = CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS.concat(CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS);
|
|
57
56
|
|
|
58
57
|
const CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS = [
|
|
58
|
+
{
|
|
59
|
+
"Peers": [
|
|
60
|
+
{
|
|
61
|
+
"Addrs": [
|
|
62
|
+
"/dns6/sv15.bootstrap.libp2p.io/tcp/443/wss",
|
|
63
|
+
"/dns4/sv15.bootstrap.libp2p.io/tcp/443/wss"
|
|
64
|
+
],
|
|
65
|
+
"ID": "QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
|
|
66
|
+
"Schema": "peer"
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"Peers": [
|
|
72
|
+
{
|
|
73
|
+
"Addrs": [
|
|
74
|
+
"/dns4/am6.bootstrap.libp2p.io/tcp/443/wss",
|
|
75
|
+
"/dns6/am6.bootstrap.libp2p.io/tcp/443/wss"
|
|
76
|
+
],
|
|
77
|
+
"ID": "QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
|
|
78
|
+
"Schema": "peer"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"Peers": [
|
|
84
|
+
{
|
|
85
|
+
"Addrs": [
|
|
86
|
+
"/dns6/sg1.bootstrap.libp2p.io/tcp/443/wss",
|
|
87
|
+
"/dns4/sg1.bootstrap.libp2p.io/tcp/443/wss"
|
|
88
|
+
],
|
|
89
|
+
"ID": "QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
|
|
90
|
+
"Schema": "peer"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
59
94
|
];
|
|
60
95
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
/* eslint-disable @typescript-eslint/no-namespace */
|
|
64
|
-
/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */
|
|
65
|
-
/* eslint-disable @typescript-eslint/no-empty-interface */
|
|
96
|
+
//this code comes from https://github.com/libp2p/js-libp2p-pubsub-peer-discovery/blob/9d0da565f70e9b2403251c9d11dfc0b9b52babfa/src/peer.ts
|
|
97
|
+
|
|
66
98
|
var Peer;
|
|
67
99
|
(function (Peer) {
|
|
68
100
|
let _codec;
|
|
@@ -387,6 +419,10 @@ class webpeerjs{
|
|
|
387
419
|
|
|
388
420
|
this.id = this.#libp2p.peerId.toString();
|
|
389
421
|
|
|
422
|
+
for(const topic of CONFIG_PUPSUB_PEER_DATA){
|
|
423
|
+
this.#libp2p.services.pubsub.subscribe(topic);
|
|
424
|
+
}
|
|
425
|
+
|
|
390
426
|
|
|
391
427
|
//listen to peer connect event
|
|
392
428
|
this.#libp2p.addEventListener("peer:connect",async (evt) => {
|
|
@@ -401,7 +437,7 @@ class webpeerjs{
|
|
|
401
437
|
const addr = connect.addr;
|
|
402
438
|
|
|
403
439
|
if(CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id)){
|
|
404
|
-
if(!this.#connections.has(id)&&addr.includes('webtransport')){
|
|
440
|
+
if((!this.#connections.has(id) || (this.#connections.get(id).includes('/wss/')))&&addr.includes('webtransport')){
|
|
405
441
|
await this.#dbstore.put(new Key(id), new TextEncoder().encode(addr));
|
|
406
442
|
}
|
|
407
443
|
}
|
|
@@ -453,9 +489,9 @@ class webpeerjs{
|
|
|
453
489
|
return
|
|
454
490
|
}
|
|
455
491
|
{
|
|
456
|
-
|
|
492
|
+
event.detail.topic;
|
|
457
493
|
const senderPeerId = event.detail.from.toString();
|
|
458
|
-
|
|
494
|
+
|
|
459
495
|
try{
|
|
460
496
|
|
|
461
497
|
//if it is webpeer
|
|
@@ -491,15 +527,17 @@ class webpeerjs{
|
|
|
491
527
|
const addrs = this.#discoveredPeers.get(senderPeerId);
|
|
492
528
|
let mddrs = [];
|
|
493
529
|
for(const addr of addrs){
|
|
530
|
+
if(!addr.includes('webrtc'))continue
|
|
494
531
|
const mddr = multiaddr(addr);
|
|
495
532
|
mddrs.push(mddr);
|
|
496
533
|
}
|
|
497
534
|
this.#dialMultiaddress(mddrs);
|
|
498
535
|
}
|
|
499
|
-
else {
|
|
536
|
+
else if(this.#connectedPeers.has(senderPeerId)){
|
|
500
537
|
const addrs = this.#connectedPeers.get(senderPeerId).addrs;
|
|
501
538
|
let mddrs = [];
|
|
502
539
|
for(const addr of addrs){
|
|
540
|
+
if(!addr.includes('webrtc'))continue
|
|
503
541
|
const mddr = multiaddr(addr);
|
|
504
542
|
mddrs.push(mddr);
|
|
505
543
|
}
|
|
@@ -548,8 +586,10 @@ class webpeerjs{
|
|
|
548
586
|
|
|
549
587
|
//update room members
|
|
550
588
|
if(!this.#rooms[room].members.includes(id)){
|
|
551
|
-
this.#
|
|
552
|
-
|
|
589
|
+
if(this.#connectedPeers.has(id)){
|
|
590
|
+
this.#rooms[room].members.push(id);
|
|
591
|
+
this.#rooms[room].onMembers(this.#rooms[room].members);
|
|
592
|
+
}
|
|
553
593
|
}
|
|
554
594
|
|
|
555
595
|
//inbound message
|
|
@@ -568,8 +608,10 @@ class webpeerjs{
|
|
|
568
608
|
for(const room of Object.keys(this.#rooms)){
|
|
569
609
|
//update room members
|
|
570
610
|
if(!this.#rooms[room].members.includes(id)){
|
|
571
|
-
this.#
|
|
572
|
-
|
|
611
|
+
if(this.#connectedPeers.has(id)){
|
|
612
|
+
this.#rooms[room].members.push(id);
|
|
613
|
+
this.#rooms[room].onMembers(this.#rooms[room].members);
|
|
614
|
+
}
|
|
573
615
|
}
|
|
574
616
|
}
|
|
575
617
|
}
|
|
@@ -578,7 +620,7 @@ class webpeerjs{
|
|
|
578
620
|
|
|
579
621
|
//repply announce with ping
|
|
580
622
|
if(signal == 'announce'){
|
|
581
|
-
setTimeout(()=>{this.#ping('
|
|
623
|
+
setTimeout(()=>{this.#ping('');},1000);
|
|
582
624
|
//console.log('rooms',rooms)
|
|
583
625
|
}
|
|
584
626
|
|
|
@@ -591,12 +633,7 @@ class webpeerjs{
|
|
|
591
633
|
|
|
592
634
|
}catch(err){
|
|
593
635
|
}
|
|
594
|
-
|
|
595
|
-
const json = JSON.parse(topic);
|
|
596
|
-
const room = json.room;
|
|
597
|
-
const message = new TextDecoder().decode(event.detail.data);
|
|
598
|
-
this.#rooms[room].onMessage(message);
|
|
599
|
-
}
|
|
636
|
+
|
|
600
637
|
}
|
|
601
638
|
|
|
602
639
|
});
|
|
@@ -637,6 +674,7 @@ class webpeerjs{
|
|
|
637
674
|
if(!this.#connections.has(id)){
|
|
638
675
|
let mddrs = [];
|
|
639
676
|
for(const addr of addrs){
|
|
677
|
+
if(!addr.includes('webrtc'))continue
|
|
640
678
|
const mddr = multiaddr(addr);
|
|
641
679
|
mddrs.push(mddr);
|
|
642
680
|
}
|
|
@@ -692,6 +730,7 @@ class webpeerjs{
|
|
|
692
730
|
//if this disconnected peer is known bootstrap redial it
|
|
693
731
|
else if(this.#dialedKnownBootstrap.has(id)){
|
|
694
732
|
const addr = this.#connections.get(id);
|
|
733
|
+
if(addr.includes('/wss/'))return
|
|
695
734
|
let mddrs = [];
|
|
696
735
|
const addrs = multiaddr(addr);
|
|
697
736
|
mddrs.push(addrs);
|
|
@@ -723,7 +762,7 @@ class webpeerjs{
|
|
|
723
762
|
const mddrs = [];
|
|
724
763
|
peer.addresses.forEach((addr)=>{
|
|
725
764
|
const maddr = addr.multiaddr.toString()+'/p2p/'+id;
|
|
726
|
-
if(maddr.includes('webtransport') && maddr.includes('certhash')){
|
|
765
|
+
if(maddr.includes('webtransport') && maddr.includes('certhash') && maddr.includes('webrtc')){
|
|
727
766
|
mddrs.push(maddr);
|
|
728
767
|
}
|
|
729
768
|
});
|
|
@@ -732,8 +771,29 @@ class webpeerjs{
|
|
|
732
771
|
this.#ping();
|
|
733
772
|
});
|
|
734
773
|
|
|
735
|
-
this.#libp2p.addEventListener('peer:identify', (evt) => {
|
|
774
|
+
this.#libp2p.addEventListener('peer:identify', async (evt) => {
|
|
736
775
|
//console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
|
|
776
|
+
|
|
777
|
+
const id = evt.detail.peerId.toString();
|
|
778
|
+
|
|
779
|
+
if(CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS.includes(id)){
|
|
780
|
+
const remoteAddr = evt.detail.connection.remoteAddr.toString();
|
|
781
|
+
if(remoteAddr.includes('/wss/')){
|
|
782
|
+
let addrs = [];
|
|
783
|
+
let mddrs = [];
|
|
784
|
+
for(const peer of evt.detail.listenAddrs){
|
|
785
|
+
if(!peer.toString().includes('webtransport'))continue
|
|
786
|
+
const addr = peer.toString()+'/p2p/'+id;
|
|
787
|
+
const mddr = multiaddr(addr);
|
|
788
|
+
addrs.push(addr);
|
|
789
|
+
mddrs.push(mddr);
|
|
790
|
+
}
|
|
791
|
+
this.#dialedKnownBootstrap.set(id,addrs);
|
|
792
|
+
await this.#libp2p.hangUp(peerIdFromString(id));
|
|
793
|
+
this.#dialMultiaddress(mddrs);
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
737
797
|
if(evt.detail.protocols.includes(CONFIG_PROTOCOL)){
|
|
738
798
|
//console.log('peer:identify '+evt.detail.peerId.toString(),evt)
|
|
739
799
|
|
|
@@ -864,7 +924,7 @@ class webpeerjs{
|
|
|
864
924
|
//join room version 1 user pupsub via pupsub peer discovery
|
|
865
925
|
{
|
|
866
926
|
|
|
867
|
-
const topics =
|
|
927
|
+
const topics = CONFIG_PUPSUB_PEER_DATA;
|
|
868
928
|
|
|
869
929
|
this.#rooms[room] = {
|
|
870
930
|
onMessage : () => {},
|
|
@@ -918,6 +978,7 @@ class webpeerjs{
|
|
|
918
978
|
else {
|
|
919
979
|
this.status = 'unconnected';
|
|
920
980
|
}
|
|
981
|
+
this.#ping();
|
|
921
982
|
}
|
|
922
983
|
|
|
923
984
|
async #registerProtocol(){
|
|
@@ -1010,7 +1071,7 @@ class webpeerjs{
|
|
|
1010
1071
|
await this.#libp2p.handle(CONFIG_PROTOCOL, handler, {
|
|
1011
1072
|
maxInboundStreams: 50,
|
|
1012
1073
|
maxOutboundStreams: 50,
|
|
1013
|
-
runOnTransientConnection:
|
|
1074
|
+
runOnTransientConnection:false
|
|
1014
1075
|
});
|
|
1015
1076
|
|
|
1016
1077
|
await this.#libp2p.register(CONFIG_PROTOCOL, {
|
|
@@ -1057,7 +1118,7 @@ class webpeerjs{
|
|
|
1057
1118
|
|
|
1058
1119
|
try{
|
|
1059
1120
|
|
|
1060
|
-
const stream = await this.#libp2p.dialProtocol(mddr, CONFIG_PROTOCOL,{runOnTransientConnection:
|
|
1121
|
+
const stream = await this.#libp2p.dialProtocol(mddr, CONFIG_PROTOCOL,{runOnTransientConnection:false});
|
|
1061
1122
|
|
|
1062
1123
|
const output = await pipe(
|
|
1063
1124
|
message,
|
|
@@ -1074,7 +1135,7 @@ class webpeerjs{
|
|
|
1074
1135
|
return string
|
|
1075
1136
|
}
|
|
1076
1137
|
);
|
|
1077
|
-
|
|
1138
|
+
//console.log(output)
|
|
1078
1139
|
const json = JSON.parse(output);
|
|
1079
1140
|
if(json.protocol == CONFIG_PROTOCOL){
|
|
1080
1141
|
const address = [addr];
|
|
@@ -1116,37 +1177,39 @@ class webpeerjs{
|
|
|
1116
1177
|
}
|
|
1117
1178
|
}
|
|
1118
1179
|
|
|
1119
|
-
#findHybridPeer(){
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
|
|
1180
|
+
async #findHybridPeer(){
|
|
1181
|
+
|
|
1182
|
+
if(!navigator.onLine)return
|
|
1183
|
+
if(!this.#isDialEnabled)return
|
|
1184
|
+
|
|
1185
|
+
for(const target of CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
|
|
1186
|
+
if(!this.#isConnected(target) && !this.#connections.has(target)){
|
|
1187
|
+
//console.log('findPeer',target)
|
|
1188
|
+
const peerId = peerIdFromString(target);
|
|
1189
|
+
//const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
|
|
1190
|
+
|
|
1191
|
+
//console.info(peerInfo)
|
|
1192
|
+
for await (const event of this.#libp2p.services.aminoDHT.findPeer(peerId)){
|
|
1193
|
+
//console.info('findPeer',event)
|
|
1194
|
+
if (event.name === 'FINAL_PEER'){
|
|
1195
|
+
//console.log(event.peer.id.toString(),event.peer.multiaddrs.toString())
|
|
1196
|
+
let mddrs = [];
|
|
1197
|
+
let addrs = [];
|
|
1198
|
+
const id = event.peer.id.toString();
|
|
1199
|
+
for(const mddr of event.peer.multiaddrs){
|
|
1200
|
+
const peeraddr = mddr.toString()+'/p2p/'+id;
|
|
1201
|
+
const peermddr = multiaddr(peeraddr);
|
|
1202
|
+
addrs.push(peeraddr);
|
|
1203
|
+
mddrs.push(peermddr);
|
|
1204
|
+
}
|
|
1205
|
+
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1206
|
+
if(!this.#isConnected(id)){
|
|
1207
|
+
this.#dialMultiaddress(mddrs);
|
|
1145
1208
|
}
|
|
1146
1209
|
}
|
|
1147
1210
|
}
|
|
1148
1211
|
}
|
|
1149
|
-
}
|
|
1212
|
+
}
|
|
1150
1213
|
}
|
|
1151
1214
|
|
|
1152
1215
|
|
|
@@ -1276,7 +1339,7 @@ class webpeerjs{
|
|
|
1276
1339
|
|
|
1277
1340
|
//announce and ping via pupsub peer discovery
|
|
1278
1341
|
async #announce(){
|
|
1279
|
-
const topics =
|
|
1342
|
+
const topics = CONFIG_PUPSUB_PEER_DATA;
|
|
1280
1343
|
const data = JSON.stringify({prefix:CONFIG_PREFIX,signal:'announce',id:this.#libp2p.peerId.toString(),address:this.address,rooms:this.#rooms});
|
|
1281
1344
|
const peer = {
|
|
1282
1345
|
publicKey: this.#libp2p.peerId.publicKey,
|
|
@@ -1288,7 +1351,7 @@ class webpeerjs{
|
|
|
1288
1351
|
}
|
|
1289
1352
|
}
|
|
1290
1353
|
async #ping(){
|
|
1291
|
-
const topics =
|
|
1354
|
+
const topics = CONFIG_PUPSUB_PEER_DATA;
|
|
1292
1355
|
const data = JSON.stringify({prefix:CONFIG_PREFIX,signal:'ping',id:this.#libp2p.peerId.toString(),address:this.address,rooms:this.#rooms});
|
|
1293
1356
|
const peer = {
|
|
1294
1357
|
publicKey: this.#libp2p.peerId.publicKey,
|
|
@@ -1490,65 +1553,47 @@ class webpeerjs{
|
|
|
1490
1553
|
if(peers == 0){
|
|
1491
1554
|
this.#dialKnownPeers();
|
|
1492
1555
|
}
|
|
1493
|
-
},
|
|
1556
|
+
},120*1000);
|
|
1494
1557
|
}
|
|
1495
1558
|
|
|
1496
1559
|
|
|
1497
1560
|
//dial to all known bootstrap peers and DNS
|
|
1498
1561
|
#dialKnownPeers(){
|
|
1499
|
-
//this.#dialKnownBootstrap()
|
|
1500
1562
|
setTimeout(()=>{
|
|
1501
1563
|
this.#dialSavedKnownID();
|
|
1502
|
-
this.#findHybridPeer();
|
|
1503
1564
|
setTimeout(()=>{this.#dialUpdateSavedKnownID();},50000);
|
|
1565
|
+
setTimeout(()=>{this.#findHybridPeer();},60000);
|
|
1504
1566
|
setTimeout(()=>{
|
|
1505
1567
|
const peers = this.#libp2p.getPeers().length;
|
|
1506
1568
|
if(peers == 0){
|
|
1507
1569
|
this.#dialKnownID();
|
|
1508
|
-
this.#findHybridPeer();
|
|
1570
|
+
setTimeout(()=>{this.#findHybridPeer();},60000);
|
|
1509
1571
|
setTimeout(()=>{
|
|
1510
1572
|
const peers = this.#libp2p.getPeers().length;
|
|
1511
1573
|
if(peers == 0){
|
|
1512
|
-
|
|
1513
|
-
|
|
1574
|
+
this.#dialKnownBootstrap();
|
|
1575
|
+
setTimeout(()=>{this.#findHybridPeer();},15000);
|
|
1514
1576
|
setTimeout(()=>{
|
|
1515
|
-
this.#libp2p.getPeers().length;
|
|
1516
|
-
|
|
1577
|
+
const peers = this.#libp2p.getPeers().length;
|
|
1578
|
+
if(peers == 0){
|
|
1579
|
+
this.#dialKnownDNS();
|
|
1580
|
+
setTimeout(()=>{this.#findHybridPeer();},15000);
|
|
1581
|
+
setTimeout(()=>{
|
|
1582
|
+
const peers = this.#libp2p.getPeers().length;
|
|
1583
|
+
if(peers == 0){
|
|
1584
|
+
this.#dialKnownDNSonly();
|
|
1585
|
+
setTimeout(()=>{this.#findHybridPeer();},15000);
|
|
1586
|
+
}
|
|
1587
|
+
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1588
|
+
}
|
|
1589
|
+
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1517
1590
|
}
|
|
1518
|
-
},
|
|
1591
|
+
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1519
1592
|
}
|
|
1520
|
-
},
|
|
1593
|
+
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1521
1594
|
},5000);
|
|
1522
1595
|
}
|
|
1523
1596
|
|
|
1524
|
-
|
|
1525
|
-
//dial based on known bootsrap peers address
|
|
1526
|
-
#dialKnownBootstrap(){
|
|
1527
|
-
|
|
1528
|
-
if(!navigator.onLine)return
|
|
1529
|
-
if(!this.#isDialEnabled)return
|
|
1530
|
-
|
|
1531
|
-
const bootstrap = CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS;
|
|
1532
|
-
for(const peer of bootstrap){
|
|
1533
|
-
const address = peer.Peers[0].Addrs;
|
|
1534
|
-
const id = peer.Peers[0].ID;
|
|
1535
|
-
let mddrs = [];
|
|
1536
|
-
let addrs = [];
|
|
1537
|
-
for(const addr of address){
|
|
1538
|
-
const peeraddr = addr+'/p2p/'+id;
|
|
1539
|
-
const peermddr = multiaddr(peeraddr);
|
|
1540
|
-
addrs.push(peeraddr);
|
|
1541
|
-
mddrs.push(peermddr);
|
|
1542
|
-
}
|
|
1543
|
-
|
|
1544
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1545
|
-
if(!this.#isConnected(id)){
|
|
1546
|
-
this.#dialMultiaddress(mddrs);
|
|
1547
|
-
}
|
|
1548
|
-
|
|
1549
|
-
}
|
|
1550
|
-
}
|
|
1551
|
-
|
|
1552
1597
|
async #dialSavedKnownID(){
|
|
1553
1598
|
|
|
1554
1599
|
if(!navigator.onLine)return
|
|
@@ -1669,118 +1714,149 @@ class webpeerjs{
|
|
|
1669
1714
|
}
|
|
1670
1715
|
}
|
|
1671
1716
|
}
|
|
1672
|
-
|
|
1717
|
+
|
|
1718
|
+
|
|
1719
|
+
//dial based on known bootsrap peers address using Websocket expected
|
|
1720
|
+
#dialKnownBootstrap(){
|
|
1721
|
+
|
|
1722
|
+
if(!navigator.onLine)return
|
|
1723
|
+
if(!this.#isDialEnabled)return
|
|
1724
|
+
|
|
1725
|
+
const bootstrap = CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS;
|
|
1726
|
+
for(const peer of bootstrap){
|
|
1727
|
+
const address = peer.Peers[0].Addrs;
|
|
1728
|
+
const id = peer.Peers[0].ID;
|
|
1729
|
+
let mddrs = [];
|
|
1730
|
+
let addrs = [];
|
|
1731
|
+
for(const addr of address){
|
|
1732
|
+
if(!addr.includes('wss'))continue
|
|
1733
|
+
const peeraddr = addr+'/p2p/'+id;
|
|
1734
|
+
const peermddr = multiaddr(peeraddr);
|
|
1735
|
+
addrs.push(peeraddr);
|
|
1736
|
+
mddrs.push(peermddr);
|
|
1737
|
+
}
|
|
1738
|
+
|
|
1739
|
+
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1740
|
+
this.#isDialWebsocket = true;
|
|
1741
|
+
if(!this.#isConnected(id)){
|
|
1742
|
+
this.#dialMultiaddress(mddrs);
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
}
|
|
1746
|
+
}
|
|
1673
1747
|
|
|
1674
1748
|
//dial based on known bootstrap DNS
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
const
|
|
1681
|
-
const
|
|
1749
|
+
async #dialKnownDNS(){
|
|
1750
|
+
|
|
1751
|
+
if(!navigator.onLine)return
|
|
1752
|
+
if(!this.#isDialEnabled)return
|
|
1753
|
+
|
|
1754
|
+
const dnsresolver = CONFIG_DNS_RESOLVER;
|
|
1755
|
+
const bootstrapdns = CONFIG_KNOWN_BOOTSTRAP_DNS;
|
|
1756
|
+
const response = await fetch(dnsresolver+'?name='+bootstrapdns+'&type=txt');
|
|
1757
|
+
const json = await response.json();
|
|
1758
|
+
const dns = json.Answer;
|
|
1759
|
+
const BOOTSTRAP_PEER_IDS = [];
|
|
1682
1760
|
for(const dnsaddr of dns){
|
|
1683
|
-
const id = dnsaddr.data.split('/').pop()
|
|
1684
|
-
BOOTSTRAP_PEER_IDS.push(id)
|
|
1761
|
+
const id = dnsaddr.data.split('/').pop();
|
|
1762
|
+
BOOTSTRAP_PEER_IDS.push(id);
|
|
1685
1763
|
}
|
|
1686
|
-
const api =
|
|
1687
|
-
const delegatedClient = createDelegatedRoutingV1HttpApiClient(api)
|
|
1764
|
+
const api = CONFIG_DELEGATED_API;
|
|
1765
|
+
const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
|
|
1688
1766
|
const peers = await Promise.all(
|
|
1689
1767
|
BOOTSTRAP_PEER_IDS.map((peerId) => first(delegatedClient.getPeers(peerIdFromString(peerId)))),
|
|
1690
|
-
)
|
|
1768
|
+
);
|
|
1691
1769
|
for(const peer of peers){
|
|
1692
|
-
const address = peer.Addrs
|
|
1693
|
-
const id = peer.ID
|
|
1694
|
-
let mddrs = []
|
|
1695
|
-
let addrs = []
|
|
1770
|
+
const address = peer.Addrs;
|
|
1771
|
+
const id = peer.ID;
|
|
1772
|
+
let mddrs = [];
|
|
1773
|
+
let addrs = [];
|
|
1696
1774
|
for(const addr of address){
|
|
1697
|
-
const peeraddr = addr.toString()+'/p2p/'+id.toString()
|
|
1698
|
-
const peermddr = multiaddr(peeraddr)
|
|
1699
|
-
addrs.push(peeraddr)
|
|
1700
|
-
mddrs.push(peermddr)
|
|
1775
|
+
const peeraddr = addr.toString()+'/p2p/'+id.toString();
|
|
1776
|
+
const peermddr = multiaddr(peeraddr);
|
|
1777
|
+
addrs.push(peeraddr);
|
|
1778
|
+
mddrs.push(peermddr);
|
|
1701
1779
|
}
|
|
1702
1780
|
|
|
1703
|
-
this.#dialedKnownBootstrap.set(id,addrs)
|
|
1781
|
+
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1782
|
+
this.#isDialWebsocket = true;
|
|
1704
1783
|
if(!this.#isConnected(id)){
|
|
1705
|
-
this.#dialMultiaddress(mddrs)
|
|
1784
|
+
this.#dialMultiaddress(mddrs);
|
|
1706
1785
|
}
|
|
1707
1786
|
}
|
|
1708
1787
|
|
|
1709
|
-
}
|
|
1788
|
+
}
|
|
1710
1789
|
|
|
1711
1790
|
|
|
1712
1791
|
//dial based on known bootstrap DNS using DNS resolver only
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
const
|
|
1792
|
+
async #dialKnownDNSonly(){
|
|
1793
|
+
|
|
1794
|
+
if(!navigator.onLine)return
|
|
1795
|
+
if(!this.#isDialEnabled)return
|
|
1796
|
+
|
|
1797
|
+
const dnsresolver = CONFIG_DNS_RESOLVER;
|
|
1798
|
+
const bootstrapdns = CONFIG_KNOWN_BOOTSTRAP_DNS;
|
|
1799
|
+
const response = await fetch(dnsresolver+'?name='+bootstrapdns+'&type=txt');
|
|
1800
|
+
const json = await response.json();
|
|
1801
|
+
const dns = json.Answer;
|
|
1719
1802
|
|
|
1720
1803
|
for(const dnsitem of dns){
|
|
1721
|
-
const arr = dnsitem.data.split('/')
|
|
1722
|
-
const id = arr.pop()
|
|
1723
|
-
const dnsaddr = '_dnsaddr.'+arr[2]
|
|
1724
|
-
this.#dialDNSWebsocketWebtransport(id,dnsaddr)
|
|
1804
|
+
const arr = dnsitem.data.split('/');
|
|
1805
|
+
const id = arr.pop();
|
|
1806
|
+
const dnsaddr = '_dnsaddr.'+arr[2];
|
|
1807
|
+
this.#dialDNSWebsocketWebtransport(id,dnsaddr);
|
|
1725
1808
|
}
|
|
1726
|
-
}
|
|
1809
|
+
}
|
|
1727
1810
|
|
|
1728
1811
|
|
|
1729
1812
|
//dial DNS with webtransport and websocket
|
|
1730
|
-
|
|
1731
|
-
const dnsresolver =
|
|
1732
|
-
const response = await fetch(dnsresolver+'?name='+dnsaddr+'&type=txt')
|
|
1733
|
-
const json = await response.json()
|
|
1734
|
-
const dns = json.Answer
|
|
1735
|
-
let mddrs = []
|
|
1736
|
-
let addrs = []
|
|
1813
|
+
async #dialDNSWebsocketWebtransport(id,dnsaddr){
|
|
1814
|
+
const dnsresolver = CONFIG_DNS_RESOLVER;
|
|
1815
|
+
const response = await fetch(dnsresolver+'?name='+dnsaddr+'&type=txt');
|
|
1816
|
+
const json = await response.json();
|
|
1817
|
+
const dns = json.Answer;
|
|
1818
|
+
let mddrs = [];
|
|
1819
|
+
let addrs = [];
|
|
1737
1820
|
for(const dnsitem of dns){
|
|
1738
|
-
const arr = dnsitem.data.split('=')
|
|
1739
|
-
const dnsaddr = arr[1]
|
|
1740
|
-
const maddr = multiaddr(dnsaddr)
|
|
1741
|
-
mddrs.push(maddr)
|
|
1742
|
-
addrs.push(dnsaddr)
|
|
1821
|
+
const arr = dnsitem.data.split('=');
|
|
1822
|
+
const dnsaddr = arr[1];
|
|
1823
|
+
const maddr = multiaddr(dnsaddr);
|
|
1824
|
+
mddrs.push(maddr);
|
|
1825
|
+
addrs.push(dnsaddr);
|
|
1743
1826
|
}
|
|
1744
1827
|
|
|
1745
1828
|
|
|
1746
|
-
this.#isDialWebsocket = true
|
|
1747
|
-
this.#dialedKnownBootstrap.set(id,addrs)
|
|
1829
|
+
this.#isDialWebsocket = true;
|
|
1830
|
+
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1748
1831
|
|
|
1749
|
-
this.#dialedKnownBootstrap.set(id,addrs)
|
|
1832
|
+
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1750
1833
|
if(!this.#isConnected(id)){
|
|
1751
|
-
this.#dialMultiaddress(mddrs)
|
|
1752
|
-
this.#dialWebsocket(mddrs)
|
|
1834
|
+
this.#dialMultiaddress(mddrs);
|
|
1835
|
+
this.#dialWebsocket(mddrs);
|
|
1753
1836
|
}
|
|
1754
|
-
}
|
|
1837
|
+
}
|
|
1755
1838
|
|
|
1756
1839
|
|
|
1757
1840
|
//dial only webtransport multiaddrs
|
|
1758
1841
|
async #dialWebtransport(multiaddrs){
|
|
1759
1842
|
const webTransportMadrs = multiaddrs.filter((maddr) => maddr.protoNames().includes('webtransport')&&maddr.protoNames().includes('certhash'));
|
|
1760
|
-
for (const
|
|
1843
|
+
for (const mddr of webTransportMadrs) {
|
|
1761
1844
|
try {
|
|
1762
|
-
//console.log(`attempting to dial webtransport multiaddr: %o`,
|
|
1763
|
-
await this.#libp2p.dial(
|
|
1845
|
+
//console.log(`attempting to dial webtransport multiaddr: %o`, mddr.toString())
|
|
1846
|
+
await this.#libp2p.dial(mddr);
|
|
1764
1847
|
return // if we succeed dialing the peer, no need to try another address
|
|
1765
1848
|
} catch (error) {
|
|
1766
1849
|
}
|
|
1767
1850
|
}
|
|
1768
1851
|
}
|
|
1769
|
-
|
|
1770
|
-
//dial only webtransport multiaddrs
|
|
1771
|
-
/*#dialWebtransport1(multiaddrs){
|
|
1772
|
-
const webTransportMadrs = multiaddrs.filter((maddr) => maddr.protoNames().includes('webtransport')&&maddr.protoNames().includes('certhash'))
|
|
1773
|
-
if(webTransportMadrs.length == 0)return
|
|
1774
|
-
this.#libp2p.dial(webTransportMadrs).then((data)=>{console.warn(data)},(data)=>{console.warn(data)})
|
|
1775
|
-
}*/
|
|
1776
1852
|
|
|
1777
1853
|
//dial only websocket multiaddrs
|
|
1778
1854
|
async #dialWebsocket(multiaddrs){
|
|
1779
1855
|
const webSocketMadrs = multiaddrs.filter((maddr) => maddr.protoNames().includes('wss'));
|
|
1780
|
-
for (const
|
|
1856
|
+
for (const mddr of webSocketMadrs) {
|
|
1781
1857
|
try {
|
|
1782
|
-
//console.log(`attempting to dial websocket multiaddr: %o`,
|
|
1783
|
-
await this.#libp2p.dial(
|
|
1858
|
+
//console.log(`attempting to dial websocket multiaddr: %o`, mddr)
|
|
1859
|
+
await this.#libp2p.dial(mddr);
|
|
1784
1860
|
return // if we succeed dialing the peer, no need to try another address
|
|
1785
1861
|
} catch (error) {
|
|
1786
1862
|
}
|
|
@@ -1815,10 +1891,13 @@ class webpeerjs{
|
|
|
1815
1891
|
const libp2p = await createLibp2p({
|
|
1816
1892
|
addresses: {
|
|
1817
1893
|
listen: [
|
|
1894
|
+
'/webrtc'
|
|
1818
1895
|
],
|
|
1819
1896
|
},
|
|
1820
1897
|
transports:[
|
|
1821
|
-
webTransport(),
|
|
1898
|
+
webTransport(),
|
|
1899
|
+
webSockets(),
|
|
1900
|
+
webRTC(),
|
|
1822
1901
|
circuitRelayTransport({
|
|
1823
1902
|
discoverRelays: CONFIG_DISCOVER_RELAYS,
|
|
1824
1903
|
reservationConcurrency: 1,
|
|
@@ -1883,7 +1962,7 @@ class webpeerjs{
|
|
|
1883
1962
|
allowPublishToZeroTopicPeers: true,
|
|
1884
1963
|
msgIdFn: msgIdFnStrictNoSign,
|
|
1885
1964
|
ignoreDuplicatePublishError: true,
|
|
1886
|
-
runOnTransientConnection:
|
|
1965
|
+
runOnTransientConnection:false,
|
|
1887
1966
|
}),
|
|
1888
1967
|
identify: identify(),
|
|
1889
1968
|
identifyPush: identifyPush(),
|
|
@@ -1892,7 +1971,7 @@ class webpeerjs{
|
|
|
1892
1971
|
peerInfoMapper: removePrivateAddressesMapper,
|
|
1893
1972
|
clientMode: false
|
|
1894
1973
|
}),
|
|
1895
|
-
|
|
1974
|
+
dcutr: dcutr()
|
|
1896
1975
|
},
|
|
1897
1976
|
peerStore: {
|
|
1898
1977
|
persistence: true,
|