// Copyright 2024 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
// @ts-check
import { resolve4 as resolve4Cb, resolve6 as resolve6Cb } from 'node:dns';
import { writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import { promisify } from 'node:util';

const resolve4 = promisify(resolve4Cb);
const resolve6 = promisify(resolve6Cb);

const FALLBACK_DOMAINS = [
  'chat.signal.org',
  'storage.signal.org',
  'cdsi.signal.org',
  'cdn.signal.org',
  'cdn2.signal.org',
  'cdn3.signal.org',
  'updates2.signal.org',
  'sfu.voip.signal.org',
];

const config = await Promise.all(
  FALLBACK_DOMAINS.sort().map(async domain => {
    const ipv4endpoints = (await resolve4(domain)).map(a => ({
      family: 'ipv4',
      address: a,
    }));

    const ipv6endpoints = (await resolve6(domain)).map(a => ({
      family: 'ipv6',
      address: a,
    }));

    const endpoints = [...ipv4endpoints, ...ipv6endpoints]
      .filter(value => {
        return value != null;
      })
      .sort((a, b) => {
        if (a.family < b.family) {
          return -1;
        }
        if (a.family > b.family) {
          return 1;
        }

        if (a.address < b.address) {
          return -1;
        }
        if (a.address > b.address) {
          return 1;
        }
        return 0;
      });

    return { domain, endpoints };
  })
);

const outPath = join(import.meta.dirname, '..', 'build', 'dns-fallback.json');

await writeFile(outPath, `${JSON.stringify(config, null, 2)}\n`);
