mirror of https://gitlab.com/ecentrics/concordia
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
2.0 KiB
51 lines
2.0 KiB
import dns from 'dns';
|
|
import util from 'util';
|
|
import { Multiaddr } from 'multiaddr';
|
|
import { rendezvousHost, rendezvousPort } from 'concordia-shared/src/environment/interpolated/rendezvous';
|
|
import { logger } from './logger';
|
|
|
|
const dnsLookup = util.promisify(dns.lookup);
|
|
|
|
const isMultiaddr = (input) => {
|
|
try {
|
|
// eslint-disable-next-line no-new
|
|
new Multiaddr(input);
|
|
return true;
|
|
} catch (e) {
|
|
logger.error(new Error(`Invalid rendezvous multiaddress ${input}!`));
|
|
return false;
|
|
}
|
|
};
|
|
|
|
// eslint-disable-next-line consistent-return
|
|
const getRendezvousMultiaddress = () => {
|
|
const host = rendezvousHost.startsWith('/docker/') ? rendezvousHost.substring('/docker/'.length) : rendezvousHost;
|
|
|
|
const multiaddress = `${host}/tcp/${rendezvousPort}/wss/p2p-webrtc-star`;
|
|
if (isMultiaddr(multiaddress)) return new Multiaddr(multiaddress);
|
|
throw Error('Invalid multiaddress');
|
|
};
|
|
|
|
export const getResolvedRendezvousMultiaddress = async () => {
|
|
let rendezvousMultiaddress = getRendezvousMultiaddress();
|
|
const { address } = rendezvousMultiaddress.nodeAddress();
|
|
|
|
// Address is a domain to be resolved to IP
|
|
if (rendezvousMultiaddress.toString().includes('/dns4/')) {
|
|
try {
|
|
logger.info(`Multiaddress ${rendezvousMultiaddress.toString()} will be resolved.`);
|
|
const resolvedDomain = await dnsLookup(address);
|
|
rendezvousMultiaddress = new Multiaddr(`/ip4/${resolvedDomain.address}/tcp/${rendezvousPort}/wss/p2p-webrtc-star`);
|
|
} catch (error) {
|
|
throw new Error(`DNS lookup of ${address} failed.\n${error}`);
|
|
}
|
|
}
|
|
logger.info(`Resolved rendezvous multiaddress is: ${rendezvousMultiaddress.toString()}`);
|
|
return Promise.resolve(rendezvousMultiaddress);
|
|
};
|
|
|
|
// TODO: currently this only works for a single rendezvous
|
|
export const getSwarmAddresses = async () => getResolvedRendezvousMultiaddress()
|
|
.then((resolvedRendezvousMultiaddress) => [
|
|
resolvedRendezvousMultiaddress.toString(),
|
|
]).catch((error) => logger.error(new Error(`getSwarmAddresses failed.\n${error}`)));
|
|
|