Skip to content

Commit 114daeb

Browse files
committed
feat(brave): listen on TCP port
- discovers free TCP port for incoming connections - discovers network IPs via WebRTC APIs provided by the browser
1 parent 2728436 commit 114daeb

File tree

3 files changed

+40
-7
lines changed

3 files changed

+40
-7
lines changed

add-on/src/lib/ipfs-client/embedded-chromesockets/config.js

+26-6
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ const { optionDefaults } = require('../../options')
77
const chromeSocketsBundle = require('./libp2p-bundle')
88
const mergeOptions = require('merge-options')
99
const getPort = require('get-port')
10+
const { getIPv4, getIPv6 } = require('webrtc-ips')
1011

1112
const multiaddr = require('multiaddr')
1213
const maToUri = require('multiaddr-to-uri')
1314
const multiaddr2httpUrl = (ma) => maToUri(ma.includes('/http') ? ma : multiaddr(ma).encapsulate('/http'))
1415

15-
const chromeSocketsOpts = {
16+
// additional default js-ipfs config specific to runtime with chrome.sockets APIs
17+
const chromeDefaultOpts = {
1618
config: {
1719
Addresses: {
1820
API: '/ip4/127.0.0.1/tcp/5003',
@@ -22,10 +24,10 @@ const chromeSocketsOpts = {
2224
but Web UI needs API (can't use window.ipfs due to sandboxing)
2325
*/
2426
Swarm: [
25-
// TODO: listening on TCP (override IP and port at runtime in buildConfig()?)
26-
'/ip4/0.0.0.0/tcp/0',
27-
// optional ws-star signaling provides a backup non-LAN peer discovery
28-
'/dns4/ws-star1.par.dwebops.pub.com/tcp/443/wss/p2p-websocket-star'
27+
// optional ws-star signaling provides a backup for non-LAN peer discovery
28+
// (this will be removed when autorelay and DHT are stable in js-ipfs)
29+
'/dns4/ws-star1.par.dwebops.pub.com/tcp/443/wss/p2p-websocket-star',
30+
'/dns4/ws-star.discovery.libp2p.io/tcp/443/wss/p2p-websocket-star'
2931
],
3032
// Delegated Content and Peer Routing: https://github.com/ipfs/js-ipfs/pull/2195
3133
Delegates: // [] // TODO: enable delegates
@@ -93,7 +95,25 @@ const chromeSocketsOpts = {
9395
async function buildConfig (opts, log) {
9496
const defaultOpts = JSON.parse(optionDefaults.ipfsNodeConfig)
9597
const userOpts = JSON.parse(opts.ipfsNodeConfig)
96-
const ipfsNodeConfig = mergeOptions(defaultOpts, userOpts, chromeSocketsOpts, { start: false, libp2p: chromeSocketsBundle })
98+
const chromeOpts = JSON.parse(JSON.stringify(chromeDefaultOpts))
99+
100+
// find a free TCP port for incoming connections
101+
const freeTcpPort = await getPort({ port: getPort.makeRange(4042, 4100) })
102+
// find out local network IPs
103+
const ipv4 = await getIPv4()
104+
const ipv6 = await getIPv6()
105+
// add TCP multiaddrs
106+
if (ipv4) {
107+
chromeOpts.config.Addresses.Swarm.unshift(`/ip4/${ipv4}/tcp/${freeTcpPort}`)
108+
}
109+
if (ipv6) {
110+
chromeOpts.config.Addresses.Swarm.unshift(`/ip6/${ipv6}/tcp/${freeTcpPort}`)
111+
}
112+
// append user-provided multiaddrs
113+
chromeOpts.config.Addresses.Swarm = chromeOpts.config.Addresses.Swarm.concat(userOpts.config.Addresses.Swarm)
114+
115+
// merge configs
116+
const ipfsNodeConfig = mergeOptions(defaultOpts, userOpts, chromeOpts, { start: false, libp2p: chromeSocketsBundle })
97117

98118
// Detect when API or Gateway port is not available (taken by something else)
99119
// We find the next free port and update configuration to use it instead

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@
146146
"tachyons": "4.11.1",
147147
"timers-browserify-full": "0.0.1",
148148
"uri-to-multiaddr": "3.0.1",
149-
"webextension-polyfill": "0.4.0"
149+
"webextension-polyfill": "0.4.0",
150+
"webrtc-ips": "0.1.4"
150151
},
151152
"engines": {
152153
"node": ">=10.0.0",

yarn.lock

+12
Original file line numberDiff line numberDiff line change
@@ -12148,6 +12148,11 @@ prometheus-gc-stats@~0.6.0:
1214812148
optionalDependencies:
1214912149
gc-stats "^1.2.1"
1215012150

12151+
promise-controller@^0.3.0:
12152+
version "0.3.0"
12153+
resolved "https://registry.yarnpkg.com/promise-controller/-/promise-controller-0.3.0.tgz#e512a5059075a0c2dedd1488695412f0650c33f7"
12154+
integrity sha512-w1RTaOwD5bNtYjIj5L8+ruDtMgnKC0pLtOogA3kcS4LRtiwLOpAdokjYbkjJMa6AGV0oasHa8RRNa8qEpG1qyw==
12155+
1215112156
promise-inflight@^1.0.1:
1215212157
version "1.0.1"
1215312158
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
@@ -15703,6 +15708,13 @@ [email protected]:
1570315708
watchpack "^1.6.0"
1570415709
webpack-sources "^1.4.1"
1570515710

15711+
15712+
version "0.1.4"
15713+
resolved "https://registry.yarnpkg.com/webrtc-ips/-/webrtc-ips-0.1.4.tgz#c1806a1dd0a91ca01eeb44997ef2133c2a865e53"
15714+
integrity sha512-zjpkAmPDxkllbjprCa14s9bpqlb+pqe17T0+uF/SfJTM5XcgUdMP1RDwFcgANIYvZgYbkK075Ok+82YPodvm+A==
15715+
dependencies:
15716+
promise-controller "^0.3.0"
15717+
1570615718
"webrtcsupport@github:ipfs/webrtcsupport":
1570715719
version "2.2.0"
1570815720
resolved "https://codeload.github.com/ipfs/webrtcsupport/tar.gz/0669f576582c53a3a42aa5ac014fcc5966809615"

0 commit comments

Comments
 (0)