logos-messaging-js/src/lib/discovery.ts
Franck Royer bac26ea3da
fixup
2021-08-13 16:18:02 +10:00

61 lines
1.6 KiB
TypeScript

import axios from 'axios';
import debug from 'debug';
const dbg = debug('waku:discovery');
/**
* GET list of nodes from remote HTTP host.
*
* Default behaviour is to return nodes hosted by Status.
*
* @param path The property path to access the node list. The result should be
* a string, a string array or an object. If the result is an object then the
* values of the objects are used as multiaddresses. For example, if the GET
* request returns `{ foo: { bar: [address1, address2] } }` then `path` should be
* `[ "foo", "bar" ]`.
* @param url Remote host containing bootstrap peers in JSON format.
*
* @returns An array of multiaddresses.
* @throws If the remote host is unreachable or the response cannot be parsed
* according to the passed _path_.
*/
export async function getBootstrapNodes(
path: string[] = ['fleets', 'wakuv2.prod', 'waku-websocket'],
url = 'https://fleets.status.im/'
): Promise<string[]> {
const res = await axios.get(url, {
headers: { 'Content-Type': 'application/json' },
});
let nodes = res.data;
for (const prop of path) {
if (nodes[prop] === undefined) {
dbg(
`Failed to retrieve bootstrap nodes: ${prop} does not exist on `,
nodes
);
throw `Failed to retrieve bootstrap nodes: ${prop} does not exist on ${JSON.stringify(
nodes
)}`;
}
nodes = nodes[prop];
}
if (Array.isArray(nodes)) {
return nodes;
}
if (typeof nodes === 'string') {
return [nodes];
}
if (typeof nodes === 'object') {
return Object.values(nodes);
}
throw `Failed to retrieve bootstrap nodes: response format is not supported: ${JSON.stringify(
nodes
)}`;
}