build-microsoft-cdn.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import path from 'path';
  2. import { task, traceAsync } from './lib/trace-runner';
  3. import { createRuleset } from './lib/create-file';
  4. import { fetchRemoteTextByLine } from './lib/fetch-text-by-line';
  5. import { createTrie } from './lib/trie';
  6. import { SHARED_DESCRIPTION } from './lib/constants';
  7. import { createMemoizedPromise } from './lib/memo-promise';
  8. const WHITELIST = [
  9. 'DOMAIN-SUFFIX,download.prss.microsoft.com',
  10. 'DOMAIN,res.cdn.office.net'
  11. ];
  12. const BLACKLIST = [
  13. 'www.microsoft.com',
  14. 'learn.microsoft.com',
  15. 'devblogs.microsoft.com',
  16. 'docs.microsoft.com',
  17. 'developer.microsoft.com'
  18. ];
  19. export const getMicrosoftCdnRulesetPromise = createMemoizedPromise(async () => {
  20. const set = await traceAsync('fetch accelerated-domains.china.conf', async () => {
  21. const trie = createTrie();
  22. for await (const line of await fetchRemoteTextByLine('https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf')) {
  23. if (line.startsWith('server=/') && line.endsWith('/114.114.114.114')) {
  24. const domain = line.slice(8, -16);
  25. trie.add(domain);
  26. }
  27. }
  28. return new Set(['.microsoft.com', '.windows.net', '.windows.com', '.windowsupdate.com', '.windowssearch.com', '.office.net'].flatMap(domain => trie.find(domain, false)));
  29. });
  30. const trie2 = createTrie(set);
  31. const black = BLACKLIST.flatMap(domain => trie2.find(domain, true));
  32. for (let i = 0, len = black.length; i < len; i++) {
  33. set.delete(black[i]);
  34. }
  35. return Array.from(set).map(d => `DOMAIN-SUFFIX,${d}`).concat(WHITELIST);
  36. });
  37. export const buildMicrosoftCdn = task(import.meta.path, async () => {
  38. const description = [
  39. ...SHARED_DESCRIPTION,
  40. '',
  41. 'This file contains Microsoft\'s domains using their China mainland CDN servers.',
  42. '',
  43. 'Data from:',
  44. ' - https://github.com/felixonmars/dnsmasq-china-list'
  45. ];
  46. return Promise.all(createRuleset(
  47. 'Sukka\'s Ruleset - Microsoft CDN',
  48. description,
  49. new Date(),
  50. await getMicrosoftCdnRulesetPromise(),
  51. 'ruleset',
  52. path.resolve(import.meta.dir, '../List/non_ip/microsoft_cdn.conf'),
  53. path.resolve(import.meta.dir, '../Clash/non_ip/microsoft_cdn.txt')
  54. ));
  55. });
  56. if (import.meta.main) {
  57. buildMicrosoftCdn();
  58. }