Skip to content

Commit

Permalink
feat(rosenet-node): announce public ip
Browse files Browse the repository at this point in the history
  • Loading branch information
mkermani144 committed Apr 28, 2024
1 parent 8c2ce80 commit 1a6fb51
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 4 deletions.
29 changes: 29 additions & 0 deletions packages/rosenet-node/lib/address/address-service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { isIP } from 'node:net';

import { fromNodeAddress } from '@multiformats/multiaddr';
import { publicIp } from 'public-ip';

/**
* identify public ip (v4 or v6) of current node
*/
const identifyPublicIP = () => publicIp();

/**
* get multiaddr containing public ip of current node, to be used as announce
* address
*/
const getAnnounceMultiaddr = async (port: number) => {
const ip = await identifyPublicIP();
const ipVersion = isIP(ip);

const multiaddr = fromNodeAddress(
{ address: ip, family: ipVersion as 4 | 6, port },
'tcp',
);

return multiaddr.toString();
};

export default {
getAnnounceMultiaddr,
};
1 change: 1 addition & 0 deletions packages/rosenet-node/lib/constants.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export const RELAYS_COUNT_TO_CONNECT = 3;
export const ROSENET_DIRECT_PROTOCOL_V1 = '/rosenet/direct/1';
export const DEFAULT_NODE_PORT = 55123;
21 changes: 18 additions & 3 deletions packages/rosenet-node/lib/createRoseNetNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,17 @@ import {
privateKeyToPeerId,
} from '@rosen-bridge/rosenet-utils';

import { decode, encode } from './utils/codec';
import streamService from './stream/stream-service';
import RoseNetNodeContext from './context/RoseNetNodeContext';

import addressService from './address/address-service';
import streamService from './stream/stream-service';

import { decode, encode } from './utils/codec';

import RoseNetNodeError from './errors/RoseNetNodeError';

import {
DEFAULT_NODE_PORT,
RELAYS_COUNT_TO_CONNECT,
ROSENET_DIRECT_PROTOCOL_V1,
} from './constants';
Expand All @@ -31,7 +35,11 @@ import packageJson from '../package.json' with { type: 'json' };

import { RoseNetNodeConfig } from './types';

const createRoseNetNode = async ({ logger, ...config }: RoseNetNodeConfig) => {
const createRoseNetNode = async ({
logger,
port = DEFAULT_NODE_PORT,
...config
}: RoseNetNodeConfig) => {
if (!config.relayMultiaddrs.length) {
throw new RoseNetNodeError('Cannot start a RoseNet node without a relay');
}
Expand All @@ -49,6 +57,9 @@ const createRoseNetNode = async ({ logger, ...config }: RoseNetNodeConfig) => {

RoseNetNodeContext.logger.debug(`PeerId ${peerId.toString()} generated`);

const announceMultiaddr = await addressService.getAnnounceMultiaddr(port);
logger.info(`${announceMultiaddr} set as announce multiaddr`);

const node = await createLibp2p({
peerId,
transports: [
Expand All @@ -57,6 +68,10 @@ const createRoseNetNode = async ({ logger, ...config }: RoseNetNodeConfig) => {
}),
tcp(),
],
addresses: {
listen: [`/ip4/0.0.0.0/tcp/${port}`],
announce: [announceMultiaddr],
},
connectionEncryption: [noise()],
connectionGater: {
...(config.whitelist && {
Expand Down
1 change: 1 addition & 0 deletions packages/rosenet-node/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ export interface RoseNetNodeConfig {
relayMultiaddrs: string[];
logger: AbstractLogger;
privateKey: string;
port?: number;
whitelist?: string[];
}
4 changes: 3 additions & 1 deletion packages/rosenet-node/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,14 @@
"@libp2p/peer-id": "^4.0.6",
"@libp2p/pubsub-peer-discovery": "^10.0.2",
"@libp2p/tcp": "^9.0.15",
"@multiformats/multiaddr": "^12.2.1",
"@rosen-bridge/rosenet-utils": "^0.0.0",
"fast-shuffle": "^6.1.0",
"it-first": "^3.0.4",
"it-length-prefixed": "^9.0.4",
"it-map": "^3.0.5",
"it-pipe": "^3.0.1",
"libp2p": "^1.2.3"
"libp2p": "^1.2.3",
"public-ip": "^6.0.2"
}
}
29 changes: 29 additions & 0 deletions packages/rosenet-node/tests/address/address-service.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { describe, expect, it, vi } from 'vitest';

import addressService from '../../lib/address/address-service';

const fakePublicIP = vi.hoisted(() => '172.20.20.20');
const fakePort = 12345;

vi.mock('public-ip', () => ({
publicIp: vi.fn().mockResolvedValue(fakePublicIP),
}));

describe('getAnnounceMultiaddr', () => {
/**
* @target
* getAnnounceMultiaddr should get announce multiaddr
* @dependencies
* - `public-ip` package
* @scenario
* - call the function
* @expected
* - announceMultiaddr should be the correct one
*/
it('should get announce multiaddr', async () => {
const announceMultiaddr =
await addressService.getAnnounceMultiaddr(fakePort);

expect(announceMultiaddr).toEqual(`/ip4/${fakePublicIP}/tcp/${fakePort}`);
});
});

0 comments on commit 1a6fb51

Please sign in to comment.