build-microsoft-cdn.ts 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { task } from './trace';
  2. import { fetchRemoteTextByLine } from './lib/fetch-text-by-line';
  3. import { createTrie } from './lib/trie';
  4. import { SHARED_DESCRIPTION } from './lib/constants';
  5. import { createMemoizedPromise } from './lib/memo-promise';
  6. import { extractDomainsFromFelixDnsmasq } from './lib/parse-dnsmasq';
  7. import { RulesetOutput } from './lib/create-file-new';
  8. const PROBE_DOMAINS = ['.microsoft.com', '.windows.net', '.windows.com', '.windowsupdate.com', '.windowssearch.com', '.office.net'];
  9. const WHITELIST = [
  10. 'DOMAIN-SUFFIX,download.prss.microsoft.com',
  11. 'DOMAIN,res.cdn.office.net'
  12. ];
  13. const BLACKLIST = [
  14. 'www.microsoft.com',
  15. 'learn.microsoft.com',
  16. 'devblogs.microsoft.com',
  17. 'docs.microsoft.com',
  18. 'developer.microsoft.com',
  19. 'windowsupdate.com'
  20. ];
  21. export const getMicrosoftCdnRulesetPromise = createMemoizedPromise(async () => {
  22. // First trie is to find the microsoft domains that matches probe domains
  23. const trie = createTrie(null, false);
  24. for await (const line of await fetchRemoteTextByLine('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf')) {
  25. const domain = extractDomainsFromFelixDnsmasq(line);
  26. if (domain) {
  27. trie.add(domain);
  28. }
  29. }
  30. const foundMicrosoftCdnDomains = PROBE_DOMAINS.flatMap(domain => trie.find(domain));
  31. // Second trie is to remove blacklisted domains
  32. const trie2 = createTrie(foundMicrosoftCdnDomains, true);
  33. BLACKLIST.forEach(trie2.whitelist);
  34. return trie2.dump()
  35. .map(d => `DOMAIN-SUFFIX,${d}`)
  36. .concat(WHITELIST);
  37. });
  38. export const buildMicrosoftCdn = task(require.main === module, __filename)(async (span) => {
  39. const description = [
  40. ...SHARED_DESCRIPTION,
  41. '',
  42. 'This file contains Microsoft\'s domains using their China mainland CDN servers.',
  43. '',
  44. 'Data from:',
  45. ' - https://github.com/felixonmars/dnsmasq-china-list'
  46. ];
  47. const res: string[] = await span.traceChildPromise('get microsoft cdn domains', getMicrosoftCdnRulesetPromise());
  48. return new RulesetOutput(span, 'microsoft_cdn', 'non_ip')
  49. .withTitle('Sukka\'s Ruleset - Microsoft CDN')
  50. .withDescription(description)
  51. .addFromRuleset(res)
  52. .write();
  53. });