69 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
// Copyright 2024 Signal Messenger, LLC
 | 
						|
// SPDX-License-Identifier: AGPL-3.0-only
 | 
						|
 | 
						|
import { resolve4 as resolve4Cb, resolve6 as resolve6Cb } from 'dns';
 | 
						|
import { writeFile } from 'fs/promises';
 | 
						|
import { join } from 'path';
 | 
						|
import { promisify } from 'util';
 | 
						|
 | 
						|
import { isNotNil } from '../util/isNotNil';
 | 
						|
 | 
						|
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',
 | 
						|
];
 | 
						|
 | 
						|
async function main() {
 | 
						|
  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(isNotNil)
 | 
						|
        .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(__dirname, '../../build/dns-fallback.json');
 | 
						|
 | 
						|
  await writeFile(outPath, `${JSON.stringify(config, null, 2)}\n`);
 | 
						|
}
 | 
						|
 | 
						|
main().catch(error => {
 | 
						|
  console.error(error);
 | 
						|
  process.exit(1);
 | 
						|
});
 |