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

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}`)));