webpeerjs 0.1.5 → 0.1.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/README.md +4 -1
- package/dist/esm/webpeerjs.js +18 -18
- package/dist/umd/webpeerjs.js +19 -19
- package/package.json +88 -88
- package/src/config.js +13 -7
- package/src/utils.js +70 -18
- package/src/webpeerjs.js +99 -36
package/src/webpeerjs.js
CHANGED
|
@@ -10,11 +10,10 @@ import {
|
|
|
10
10
|
Key,
|
|
11
11
|
msgIdFnStrictNoSign,
|
|
12
12
|
metrics,
|
|
13
|
-
getDigest,
|
|
13
|
+
//getDigest,
|
|
14
14
|
mkDebug,
|
|
15
15
|
multiaddr,
|
|
16
16
|
pipe,
|
|
17
|
-
lpStream,
|
|
18
17
|
lp,
|
|
19
18
|
map
|
|
20
19
|
} from './utils'
|
|
@@ -98,20 +97,25 @@ class webpeerjs{
|
|
|
98
97
|
|
|
99
98
|
//track last connect to webpeer network
|
|
100
99
|
#lastTimeConnectToNetwork
|
|
100
|
+
#lastTimeReceiveData
|
|
101
101
|
|
|
102
102
|
//arr to track on connect event
|
|
103
103
|
#onConnectQueue
|
|
104
104
|
|
|
105
|
+
//callback to websocket dialable
|
|
106
|
+
#onWebsocketFn
|
|
107
|
+
|
|
105
108
|
id
|
|
106
109
|
status
|
|
107
110
|
IPFS
|
|
108
111
|
address
|
|
109
112
|
peers
|
|
110
113
|
|
|
111
|
-
constructor(libp2p,dbstore,onMetrics){
|
|
114
|
+
constructor(libp2p,dbstore,onMetrics,onWebsocketFn,onDialFn){
|
|
112
115
|
|
|
113
116
|
this.#libp2p = libp2p
|
|
114
117
|
this.#dbstore = dbstore
|
|
118
|
+
this.#onWebsocketFn = onWebsocketFn
|
|
115
119
|
this.#dbstoreData = new Map()
|
|
116
120
|
this.#discoveredPeers = new Map()
|
|
117
121
|
this.#webPeersId = []
|
|
@@ -132,6 +136,7 @@ class webpeerjs{
|
|
|
132
136
|
this.#msgIdtracker = []
|
|
133
137
|
this.#peerexchangedata = new Map()
|
|
134
138
|
this.#lastTimeConnectToNetwork = new Date().getTime()
|
|
139
|
+
this.#lastTimeReceiveData = new Date().getTime()
|
|
135
140
|
this.#onConnectQueue = []
|
|
136
141
|
|
|
137
142
|
this.peers = (function(f) {
|
|
@@ -162,7 +167,7 @@ class webpeerjs{
|
|
|
162
167
|
//listen to peer connect event
|
|
163
168
|
this.#libp2p.addEventListener("peer:connect",async (evt) => {
|
|
164
169
|
|
|
165
|
-
const connection = evt.detail;
|
|
170
|
+
//const connection = evt.detail;
|
|
166
171
|
const id = evt.detail.toString()
|
|
167
172
|
|
|
168
173
|
//console.log('peer:connect '+id,evt)
|
|
@@ -209,7 +214,7 @@ class webpeerjs{
|
|
|
209
214
|
const metadata = {addrs:address,last:now}
|
|
210
215
|
this.#connectedPeers.set(id,metadata)
|
|
211
216
|
}
|
|
212
|
-
else{
|
|
217
|
+
else if(this.#lastTimeReceiveData < 10*1000){
|
|
213
218
|
//add to connected webpeers
|
|
214
219
|
this.#onConnectFnUpdate(id)
|
|
215
220
|
const now = new Date().getTime()
|
|
@@ -240,6 +245,10 @@ class webpeerjs{
|
|
|
240
245
|
|
|
241
246
|
try{
|
|
242
247
|
|
|
248
|
+
if(topic === config.CONFIG_PUPSUB_PEER_DATA || config.CONFIG_PUBSUB_PEER_DISCOVERY_WEBPEER.includes(topic) || config.CONFIG_RUN_ON_TRANSIENT_CONNECTION){
|
|
249
|
+
this.#lastTimeReceiveData = new Date().getTime()
|
|
250
|
+
}
|
|
251
|
+
|
|
243
252
|
//track last connect to webpeer network
|
|
244
253
|
if(config.CONFIG_PUBSUB_PEER_DISCOVERY_WEBPEER.includes(topic)){
|
|
245
254
|
const now = new Date().getTime()
|
|
@@ -262,7 +271,7 @@ class webpeerjs{
|
|
|
262
271
|
const metadata = {addrs:address,last:now}
|
|
263
272
|
this.#connectedPeers.set(senderPeerId,metadata)
|
|
264
273
|
}
|
|
265
|
-
else{
|
|
274
|
+
else if(this.#lastTimeReceiveData < 10*1000){
|
|
266
275
|
//add to connected webpeers
|
|
267
276
|
this.#onConnectFnUpdate(senderPeerId)
|
|
268
277
|
const address = this.#webPeersAddrs.get(senderPeerId)
|
|
@@ -339,18 +348,29 @@ class webpeerjs{
|
|
|
339
348
|
//detect special webpeer identity
|
|
340
349
|
if(prefix === config.CONFIG_PREFIX){
|
|
341
350
|
|
|
351
|
+
this.#lastTimeReceiveData = new Date().getTime()
|
|
352
|
+
|
|
342
353
|
//add to webpeers id
|
|
343
354
|
if(!this.#webPeersId.includes(id))this.#webPeersId.push(id)
|
|
344
355
|
|
|
345
356
|
//add to connected webpeers
|
|
346
357
|
if(!this.#connectedPeers.has(id)){
|
|
347
358
|
this.#onConnectFnUpdate(id)
|
|
348
|
-
address = []
|
|
349
359
|
const now = new Date().getTime()
|
|
350
360
|
const metadata = {addrs:address,last:now}
|
|
351
361
|
this.#connectedPeers.set(id,metadata)
|
|
352
|
-
|
|
362
|
+
if(address){
|
|
363
|
+
if(address.length > 0){
|
|
364
|
+
this.#webPeersAddrs.set(id,address)
|
|
365
|
+
}
|
|
366
|
+
}
|
|
353
367
|
this.#updatePeers()
|
|
368
|
+
}else{
|
|
369
|
+
if(address){
|
|
370
|
+
if(address.length > 0){
|
|
371
|
+
this.#webPeersAddrs.set(id,address)
|
|
372
|
+
}
|
|
373
|
+
}
|
|
354
374
|
}
|
|
355
375
|
|
|
356
376
|
|
|
@@ -565,15 +585,16 @@ class webpeerjs{
|
|
|
565
585
|
//const multiaddrs = peer.addresses.map(({ multiaddr }) => multiaddr)
|
|
566
586
|
//console.log(`changed multiaddrs: peer ${peer.id.toString()} multiaddrs: ${multiaddrs}`)
|
|
567
587
|
const id = peer.id.toString()
|
|
568
|
-
const
|
|
569
|
-
peer.addresses.forEach((
|
|
570
|
-
const
|
|
571
|
-
if(
|
|
572
|
-
|
|
588
|
+
const addrs = []
|
|
589
|
+
peer.addresses.forEach((address)=>{
|
|
590
|
+
const addr = address.multiaddr.toString()+'/p2p/'+id
|
|
591
|
+
if(addr.includes('webtransport') && addr.includes('certhash')){
|
|
592
|
+
addrs.push(addr)
|
|
573
593
|
}
|
|
574
594
|
})
|
|
575
|
-
|
|
576
|
-
this
|
|
595
|
+
if(!config.CONFIG_RUN_ON_TRANSIENT_CONNECTION)addrs.reverse()
|
|
596
|
+
//this.#ListenAddressChange(addrs)
|
|
597
|
+
this.address = addrs
|
|
577
598
|
this.#ping()
|
|
578
599
|
this.#peerDiscoveryHybrid()
|
|
579
600
|
})
|
|
@@ -652,7 +673,8 @@ class webpeerjs{
|
|
|
652
673
|
|
|
653
674
|
onMetrics((data)=>{
|
|
654
675
|
const signal = metrics(data)
|
|
655
|
-
this.#isDialEnabled = signal
|
|
676
|
+
this.#isDialEnabled = signal.isDialEnabled
|
|
677
|
+
onDialFn(signal.isAutoDialEnabled)
|
|
656
678
|
|
|
657
679
|
})
|
|
658
680
|
|
|
@@ -672,6 +694,7 @@ class webpeerjs{
|
|
|
672
694
|
setInterval(()=>{
|
|
673
695
|
this.#peerDiscoveryHybrid()
|
|
674
696
|
this.#trackHybridPeersConnection()
|
|
697
|
+
this.#trackWebpeerConnection()
|
|
675
698
|
},10e3)
|
|
676
699
|
|
|
677
700
|
|
|
@@ -792,6 +815,7 @@ class webpeerjs{
|
|
|
792
815
|
PRIVATE FUNCTION
|
|
793
816
|
*/
|
|
794
817
|
|
|
818
|
+
//track hybrid peer connection and try to dial if not connected at least 1
|
|
795
819
|
#trackHybridPeersConnection(){
|
|
796
820
|
let isConnectedToHybridPeers = false
|
|
797
821
|
for(const id of config.CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
|
|
@@ -811,6 +835,24 @@ class webpeerjs{
|
|
|
811
835
|
}
|
|
812
836
|
}
|
|
813
837
|
|
|
838
|
+
//track webpeer connection and try to dial if not connected to network using saved webpeer address
|
|
839
|
+
#trackWebpeerConnection(){
|
|
840
|
+
if(this.status === 'connected')return
|
|
841
|
+
if(this.#webPeersAddrs.size < 1)return
|
|
842
|
+
|
|
843
|
+
const keys = Array.from(this.#webPeersAddrs.keys())
|
|
844
|
+
const randomKey = Math.floor(Math.random() * keys.length)
|
|
845
|
+
const key = keys[randomKey]
|
|
846
|
+
const addrs = this.#webPeersAddrs.get(key)
|
|
847
|
+
|
|
848
|
+
let mddrs = []
|
|
849
|
+
for(const addr of addrs){
|
|
850
|
+
const mddr = multiaddr(addr)
|
|
851
|
+
mddrs.push(mddr)
|
|
852
|
+
}
|
|
853
|
+
this.#dialMultiaddress(mddrs)
|
|
854
|
+
}
|
|
855
|
+
|
|
814
856
|
//prevent double on connect event
|
|
815
857
|
#onConnectFnUpdate(id){
|
|
816
858
|
if(!this.#onConnectQueue.includes(id)){
|
|
@@ -842,7 +884,7 @@ class webpeerjs{
|
|
|
842
884
|
|
|
843
885
|
async #registerProtocol(){
|
|
844
886
|
|
|
845
|
-
const handler = async ({ connection, stream
|
|
887
|
+
const handler = async ({ connection, stream }) => {
|
|
846
888
|
try{
|
|
847
889
|
const output = await pipe(
|
|
848
890
|
stream.source,
|
|
@@ -923,7 +965,7 @@ class webpeerjs{
|
|
|
923
965
|
)
|
|
924
966
|
}
|
|
925
967
|
catch(err){
|
|
926
|
-
|
|
968
|
+
mkDebug(err)
|
|
927
969
|
}
|
|
928
970
|
}
|
|
929
971
|
|
|
@@ -934,14 +976,14 @@ class webpeerjs{
|
|
|
934
976
|
})
|
|
935
977
|
|
|
936
978
|
await this.#libp2p.register(config.CONFIG_PROTOCOL, {
|
|
937
|
-
onConnect: (peer, connection) => {
|
|
938
|
-
//
|
|
979
|
+
/*onConnect: (peer, connection) => {
|
|
980
|
+
//handle connect
|
|
939
981
|
//console.log('handle connect',peer)
|
|
940
982
|
},
|
|
941
983
|
onDisconnect: (peer, connection) => {
|
|
942
|
-
//
|
|
984
|
+
//handle disconnect
|
|
943
985
|
//console.log('handle disconnect',peer)
|
|
944
|
-
}
|
|
986
|
+
}*/
|
|
945
987
|
})
|
|
946
988
|
|
|
947
989
|
}
|
|
@@ -1032,7 +1074,7 @@ class webpeerjs{
|
|
|
1032
1074
|
}
|
|
1033
1075
|
}
|
|
1034
1076
|
catch(err){
|
|
1035
|
-
|
|
1077
|
+
mkDebug(err)
|
|
1036
1078
|
}
|
|
1037
1079
|
}
|
|
1038
1080
|
|
|
@@ -1074,7 +1116,7 @@ class webpeerjs{
|
|
|
1074
1116
|
|
|
1075
1117
|
//check the last seen in web peer
|
|
1076
1118
|
#trackLastSeen(){
|
|
1077
|
-
const timeout =
|
|
1119
|
+
const timeout = 10*1000
|
|
1078
1120
|
const forcetimeout = 60*1000
|
|
1079
1121
|
const now = new Date().getTime()
|
|
1080
1122
|
|
|
@@ -1620,7 +1662,7 @@ class webpeerjs{
|
|
|
1620
1662
|
|
|
1621
1663
|
//dial based on known bootsrap peers address using Websocket expected
|
|
1622
1664
|
#dialKnownBootstrap(){
|
|
1623
|
-
|
|
1665
|
+
//console.log('#dialKnownBootstrap()')
|
|
1624
1666
|
if(!navigator.onLine)return
|
|
1625
1667
|
if(!this.#isDialEnabled)return
|
|
1626
1668
|
|
|
@@ -1640,6 +1682,7 @@ class webpeerjs{
|
|
|
1640
1682
|
|
|
1641
1683
|
this.#dialedKnownBootstrap.set(id,addrs)
|
|
1642
1684
|
this.#isDialWebsocket = true
|
|
1685
|
+
this.#onWebsocketFn(true)
|
|
1643
1686
|
if(!this.#isConnected(id)){
|
|
1644
1687
|
this.#dialMultiaddress(mddrs)
|
|
1645
1688
|
}
|
|
@@ -1649,7 +1692,7 @@ class webpeerjs{
|
|
|
1649
1692
|
|
|
1650
1693
|
//dial based on known bootstrap DNS
|
|
1651
1694
|
async #dialKnownDNS(){
|
|
1652
|
-
|
|
1695
|
+
//console.log('#dialKnownDNS()')
|
|
1653
1696
|
if(!navigator.onLine)return
|
|
1654
1697
|
if(!this.#isDialEnabled)return
|
|
1655
1698
|
|
|
@@ -1682,6 +1725,7 @@ class webpeerjs{
|
|
|
1682
1725
|
|
|
1683
1726
|
this.#dialedKnownBootstrap.set(id,addrs)
|
|
1684
1727
|
this.#isDialWebsocket = true
|
|
1728
|
+
this.#onWebsocketFn(true)
|
|
1685
1729
|
if(!this.#isConnected(id)){
|
|
1686
1730
|
this.#dialMultiaddress(mddrs)
|
|
1687
1731
|
}
|
|
@@ -1692,7 +1736,7 @@ class webpeerjs{
|
|
|
1692
1736
|
|
|
1693
1737
|
//dial based on known bootstrap DNS using DNS resolver only
|
|
1694
1738
|
async #dialKnownDNSonly(){
|
|
1695
|
-
|
|
1739
|
+
console.log('#dialKnownDNSonly()')
|
|
1696
1740
|
if(!navigator.onLine)return
|
|
1697
1741
|
if(!this.#isDialEnabled)return
|
|
1698
1742
|
|
|
@@ -1729,6 +1773,7 @@ class webpeerjs{
|
|
|
1729
1773
|
|
|
1730
1774
|
|
|
1731
1775
|
this.#isDialWebsocket = true
|
|
1776
|
+
this.#onWebsocketFn(true)
|
|
1732
1777
|
this.#dialedKnownBootstrap.set(id,addrs)
|
|
1733
1778
|
|
|
1734
1779
|
this.#dialedKnownBootstrap.set(id,addrs)
|
|
@@ -1796,6 +1841,21 @@ class webpeerjs{
|
|
|
1796
1841
|
|
|
1797
1842
|
let onMetricsFn = () => {}
|
|
1798
1843
|
const onMetrics = f => (onMetricsFn = f)
|
|
1844
|
+
|
|
1845
|
+
let isWebsocket = false
|
|
1846
|
+
let onWebsocketFn = () => {}
|
|
1847
|
+
const onWebsocket = f => (onWebsocketFn = f)
|
|
1848
|
+
onWebsocket((data)=>{
|
|
1849
|
+
isWebsocket = data
|
|
1850
|
+
})
|
|
1851
|
+
|
|
1852
|
+
let isDial = true
|
|
1853
|
+
let onDialFn = () => {}
|
|
1854
|
+
const onDial = f => (onDialFn = f)
|
|
1855
|
+
onDial((data)=>{
|
|
1856
|
+
//if(isDial!=data)console.warn('isDial',data)
|
|
1857
|
+
isDial = data
|
|
1858
|
+
})
|
|
1799
1859
|
|
|
1800
1860
|
let listenaddress = []
|
|
1801
1861
|
|
|
@@ -1892,12 +1952,13 @@ class webpeerjs{
|
|
|
1892
1952
|
};
|
|
1893
1953
|
|
|
1894
1954
|
pc.onicecandidateerror = (e) => {
|
|
1895
|
-
|
|
1955
|
+
console.debug(e);
|
|
1896
1956
|
};
|
|
1897
1957
|
|
|
1898
1958
|
pc.createDataChannel('webpeerjs');
|
|
1899
1959
|
pc.createOffer().then(offer => pc.setLocalDescription(offer));
|
|
1900
1960
|
})
|
|
1961
|
+
//console.log(ice)
|
|
1901
1962
|
|
|
1902
1963
|
//create libp2p instance
|
|
1903
1964
|
const libp2p = await createLibp2p({
|
|
@@ -1943,29 +2004,31 @@ class webpeerjs{
|
|
|
1943
2004
|
],
|
|
1944
2005
|
connectionGater: {
|
|
1945
2006
|
filterMultiaddrForPeer: async (peer, multiaddrTest) => {
|
|
1946
|
-
const multiaddrString = multiaddrTest.toString()
|
|
2007
|
+
const multiaddrString = multiaddrTest.toString()
|
|
1947
2008
|
if (
|
|
1948
2009
|
multiaddrString.includes("/ip4/127.0.0.1") ||
|
|
1949
2010
|
multiaddrString.includes("/ip6/")
|
|
1950
2011
|
) {
|
|
1951
|
-
return false
|
|
2012
|
+
return false
|
|
1952
2013
|
}
|
|
1953
|
-
return
|
|
2014
|
+
if(multiaddrString.includes("/ws/") || multiaddrString.includes("/wss/"))return isWebsocket
|
|
2015
|
+
return isDial
|
|
1954
2016
|
},
|
|
1955
2017
|
denyDialMultiaddr: async (multiaddrTest) => {
|
|
1956
|
-
const multiaddrString = multiaddrTest.toString()
|
|
2018
|
+
const multiaddrString = multiaddrTest.toString()
|
|
1957
2019
|
if (
|
|
1958
2020
|
multiaddrString.includes("/ip4/127.0.0.1") ||
|
|
1959
2021
|
multiaddrString.includes("/ip6/")
|
|
1960
2022
|
) {
|
|
1961
|
-
return true
|
|
2023
|
+
return true
|
|
1962
2024
|
}
|
|
1963
|
-
return
|
|
2025
|
+
if(multiaddrString.includes("/ws/") || multiaddrString.includes("/wss/"))return !isWebsocket
|
|
2026
|
+
return !isDial
|
|
1964
2027
|
},
|
|
1965
2028
|
},
|
|
1966
2029
|
peerDiscovery: [
|
|
1967
2030
|
pubsubPeerDiscovery({
|
|
1968
|
-
interval:
|
|
2031
|
+
interval: 5_000,
|
|
1969
2032
|
topics: config.CONFIG_PUBSUB_PEER_DISCOVERY_WEBPEER,
|
|
1970
2033
|
listenOnly: false,
|
|
1971
2034
|
}),
|
|
@@ -2006,7 +2069,7 @@ class webpeerjs{
|
|
|
2006
2069
|
|
|
2007
2070
|
|
|
2008
2071
|
//return webpeerjs class
|
|
2009
|
-
return new webpeerjs(libp2p,dbstore,onMetrics)
|
|
2072
|
+
return new webpeerjs(libp2p,dbstore,onMetrics,onWebsocketFn,onDialFn)
|
|
2010
2073
|
}
|
|
2011
2074
|
}
|
|
2012
2075
|
|