Refactor: rework tracer

This commit is contained in:
SukkaW 2024-06-08 18:02:39 +08:00
parent f5863d82d1
commit 9a0113bf69
23 changed files with 51 additions and 142 deletions

View File

@ -17,7 +17,7 @@ export const getAppleCdnDomainsPromise = createMemoizedPromise(() => fsFetchCach
}
));
export const buildAppleCdn = task(import.meta.path, async (span) => {
export const buildAppleCdn = task(import.meta.main, import.meta.path)(async (span) => {
const promise = getAppleCdnDomainsPromise();
const res: string[] = await span.traceChildPromise('get apple cdn domains', promise);
@ -56,7 +56,3 @@ export const buildAppleCdn = task(import.meta.path, async (span) => {
)
]);
});
if (import.meta.main) {
buildAppleCdn();
}

View File

@ -48,7 +48,7 @@ const getS3OSSDomainsPromise = (async (): Promise<Set<string>> => {
return S3OSSDomains;
})();
export const buildCdnDownloadConf = task(import.meta.path, async (span) => {
export const buildCdnDownloadConf = task(import.meta.main, import.meta.path)(async (span) => {
const [
S3OSSDomains,
@ -98,7 +98,3 @@ export const buildCdnDownloadConf = task(import.meta.path, async (span) => {
)
]);
});
if (import.meta.main) {
buildCdnDownloadConf();
}

View File

@ -13,7 +13,7 @@ export const getChnCidrPromise = createMemoizedPromise(async () => {
return exclude([...cidr, ...CN_CIDR_NOT_INCLUDED_IN_CHNROUTE], NON_CN_CIDR_INCLUDED_IN_CHNROUTE, true);
});
export const buildChnCidr = task(import.meta.path, async (span) => {
export const buildChnCidr = task(import.meta.main, import.meta.path)(async (span) => {
const filteredCidr = await span.traceChildAsync('download chnroutes2', getChnCidrPromise);
// Can not use SHARED_DESCRIPTION here as different license
@ -49,7 +49,3 @@ export const buildChnCidr = task(import.meta.path, async (span) => {
)
]);
});
if (import.meta.main) {
buildChnCidr();
}

View File

@ -7,7 +7,7 @@ import { task } from './trace';
const outputSurgeDir = path.resolve(import.meta.dir, '../List');
const outputClashDir = path.resolve(import.meta.dir, '../Clash');
export const buildCloudMounterRules = task(import.meta.path, async (span) => {
export const buildCloudMounterRules = task(import.meta.main, import.meta.path)(async (span) => {
// AND,((SRC-IP,192.168.1.110), (DOMAIN, example.com))
const results = DOMAINS.flatMap(domain => {
@ -29,7 +29,3 @@ export const buildCloudMounterRules = task(import.meta.path, async (span) => {
path.resolve(outputClashDir, 'non_ip', 'cloudmounter.txt')
);
});
if (import.meta.main) {
buildCloudMounterRules();
}

View File

@ -19,7 +19,7 @@ const sourceDir = path.resolve(import.meta.dir, '../Source');
const outputSurgeDir = path.resolve(import.meta.dir, '../List');
const outputClashDir = path.resolve(import.meta.dir, '../Clash');
export const buildCommon = task(import.meta.path, async (span) => {
export const buildCommon = task(import.meta.main, import.meta.path)(async (span) => {
const promises: Array<Promise<unknown>> = [];
const paths = await new Fdir()
@ -54,10 +54,6 @@ export const buildCommon = task(import.meta.path, async (span) => {
return Promise.all(promises);
});
if (import.meta.main) {
buildCommon();
}
const processFile = (span: Span, sourcePath: string) => {
// console.log('Processing', sourcePath);
return span.traceChildAsync(`process file: ${sourcePath}`, async () => {

View File

@ -11,7 +11,7 @@ const DEPRECATED_FILES = [
const outputSurgeDir = path.resolve(import.meta.dir, '../List');
const outputClashDir = path.resolve(import.meta.dir, '../Clash');
export const buildDeprecateFiles = task(import.meta.path, (span) => span.traceChildAsync('create deprecated files', async (childSpan) => {
export const buildDeprecateFiles = task(import.meta.main, import.meta.path)((span) => span.traceChildAsync('create deprecated files', async (childSpan) => {
const promises: Array<Promise<unknown>> = [];
for (const [filePath, description] of DEPRECATED_FILES) {
@ -33,7 +33,3 @@ export const buildDeprecateFiles = task(import.meta.path, (span) => span.traceCh
return Promise.all(promises);
}));
if (import.meta.main) {
buildDeprecateFiles();
}

View File

@ -20,7 +20,7 @@ export const getDomesticDomainsRulesetPromise = createMemoizedPromise(async () =
return results;
});
export const buildDomesticRuleset = task(import.meta.path, async (span) => {
export const buildDomesticRuleset = task(import.meta.main, import.meta.path)(async (span) => {
const rulesetDescription = [
...SHARED_DESCRIPTION,
'',
@ -66,7 +66,3 @@ export const buildDomesticRuleset = task(import.meta.path, async (span) => {
)
]);
});
if (import.meta.main) {
buildDomesticRuleset();
}

View File

@ -5,7 +5,7 @@ import { exclude, merge } from 'fast-cidr-tools';
import { getChnCidrPromise } from './build-chn-cidr';
import { NON_CN_CIDR_INCLUDED_IN_CHNROUTE, RESERVED_IPV4_CIDR } from './constants/cidr';
export const buildInternalReverseChnCIDR = task(import.meta.path, async () => {
export const buildInternalReverseChnCIDR = task(import.meta.main, import.meta.path)(async () => {
const cidrPromise = getChnCidrPromise();
const peeked = Bun.peek(cidrPromise);
const cidr: string[] = peeked === cidrPromise
@ -25,7 +25,3 @@ export const buildInternalReverseChnCIDR = task(import.meta.path, async () => {
return Bun.write(path.resolve(import.meta.dir, '../Internal/reversed-chn-cidr.txt'), `${reversedCidr.join('\n')}\n`);
});
if (import.meta.main) {
buildInternalReverseChnCIDR();
}

View File

@ -44,7 +44,7 @@ export const getMicrosoftCdnRulesetPromise = createMemoizedPromise(async () => {
.concat(WHITELIST);
});
export const buildMicrosoftCdn = task(import.meta.path, async (span) => {
export const buildMicrosoftCdn = task(import.meta.main, import.meta.path)(async (span) => {
const description = [
...SHARED_DESCRIPTION,
'',
@ -67,7 +67,3 @@ export const buildMicrosoftCdn = task(import.meta.path, async (span) => {
path.resolve(import.meta.dir, '../Clash/non_ip/microsoft_cdn.txt')
);
});
if (import.meta.main) {
buildMicrosoftCdn();
}

View File

@ -18,7 +18,7 @@ const folderAndFilesToBeDeployed = [
'LICENSE'
];
export const buildPublic = task(import.meta.path, async (span) => {
export const buildPublic = task(import.meta.main, import.meta.path)(async (span) => {
await span
.traceChild('copy public files')
.traceAsyncFn(async () => {
@ -45,10 +45,6 @@ export const buildPublic = task(import.meta.path, async (span) => {
return Bun.write(path.join(publicPath, 'index.html'), html);
});
if (import.meta.main) {
buildPublic();
}
const priorityOrder: Record<'default' | string & {}, number> = {
domainset: 1,
non_ip: 2,

View File

@ -22,7 +22,7 @@ import { sort } from './lib/timsort';
const getRejectSukkaConfPromise = readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/domainset/reject_sukka.conf'));
export const buildRejectDomainSet = task(import.meta.path, async (span) => {
export const buildRejectDomainSet = task(import.meta.main, import.meta.path)(async (span) => {
/** Whitelists */
const filterRuleWhitelistDomainSets = new Set(PREDEFINED_WHITELIST);
@ -167,7 +167,3 @@ export const buildRejectDomainSet = task(import.meta.path, async (span) => {
)
]);
});
if (import.meta.main) {
buildRejectDomainSet();
}

View File

@ -67,7 +67,7 @@ const getBotNetFilterIPsPromise = fsFetchCache.apply(
const localRejectIPSourcesPromise = readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/ip/reject.conf'));
export const buildRejectIPList = task(import.meta.path, async (span) => {
export const buildRejectIPList = task(import.meta.main, import.meta.path)(async (span) => {
const result = await localRejectIPSourcesPromise;
const bogusNxDomainIPs = await span.traceChildPromise('get bogus nxdomain ips', getBogusNxDomainIPsPromise);
@ -97,7 +97,3 @@ export const buildRejectIPList = task(import.meta.path, async (span) => {
path.resolve(import.meta.dir, '../Clash/ip/reject.txt')
);
});
if (import.meta.main) {
buildRejectIPList();
}

View File

@ -49,7 +49,7 @@ const HOSTNAMES = [
'*.battlenet.com'
] as const;
export const buildAlwaysRealIPModule = task(import.meta.path, async (span) => {
export const buildAlwaysRealIPModule = task(import.meta.main, import.meta.path)(async (span) => {
return compareAndWriteFile(
span,
[
@ -62,7 +62,3 @@ export const buildAlwaysRealIPModule = task(import.meta.path, async (span) => {
path.resolve(import.meta.dir, '../Modules/sukka_common_always_realip.sgmodule')
);
});
if (import.meta.main) {
buildAlwaysRealIPModule();
}

View File

@ -118,7 +118,7 @@ const REDIRECT_FAKEWEBSITES = [
['zbrushcn.com', 'https://www.maxon.net/en/zbrush']
] as const;
export const buildRedirectModule = task(import.meta.path, async (span) => {
export const buildRedirectModule = task(import.meta.main, import.meta.path)(async (span) => {
const domains = Array.from(
new Set(
[
@ -144,7 +144,3 @@ export const buildRedirectModule = task(import.meta.path, async (span) => {
path.resolve(import.meta.dir, '../Modules/sukka_url_redirect.sgmodule')
);
});
if (import.meta.main) {
buildRedirectModule();
}

View File

@ -93,7 +93,7 @@ const getPreviousSpeedtestDomainsPromise = createMemoizedPromise(async () => {
return domains;
});
export const buildSpeedtestDomainSet = task(import.meta.path, async (span) => {
export const buildSpeedtestDomainSet = task(import.meta.main, import.meta.path)(async (span) => {
// Predefined domainset
/** @type {Set<string>} */
const domains = new Set<string>([
@ -267,7 +267,3 @@ export const buildSpeedtestDomainSet = task(import.meta.path, async (span) => {
path.resolve(import.meta.dir, '../Clash/domainset/speedtest.txt')
);
});
if (import.meta.main) {
buildSpeedtestDomainSet();
}

View File

@ -26,7 +26,7 @@ const removeNoResolved = (line: string) => line.replace(',no-resolve', '');
/**
* This only generates a simplified version, for under-used users only.
*/
export const buildSSPanelUIMAppProfile = task(import.meta.path, async (span) => {
export const buildSSPanelUIMAppProfile = task(import.meta.main, import.meta.path)(async (span) => {
const [
domesticDomains,
appleCdnDomains,
@ -115,10 +115,6 @@ export const buildSSPanelUIMAppProfile = task(import.meta.path, async (span) =>
);
});
if (import.meta.main) {
buildSSPanelUIMAppProfile();
}
const isTruthy = <T>(i: T | 0 | '' | false | null | undefined): i is T => !!i;
function generateAppProfile(

View File

@ -50,7 +50,7 @@ export const createRulesetForStreamService = (span: Span, fileId: string, title:
]));
};
export const buildStreamService = task(import.meta.path, async (span) => {
export const buildStreamService = task(import.meta.main, import.meta.path)(async (span) => {
return Promise.all([
createRulesetForStreamService(span, 'stream', 'All', ALL),
createRulesetForStreamService(span, 'stream_us', 'North America', NORTH_AMERICA),
@ -63,7 +63,3 @@ export const buildStreamService = task(import.meta.path, async (span) => {
// createRulesetForStreamService('stream_south_east_asia', 'South East Asia', SOUTH_EAST_ASIA)
]);
});
if (import.meta.main) {
buildStreamService();
}

View File

@ -32,7 +32,7 @@ export const getTelegramCIDRPromise = createMemoizedPromise(async () => {
return { date, results };
});
export const buildTelegramCIDR = task(import.meta.path, async (span) => {
export const buildTelegramCIDR = task(import.meta.main, import.meta.path)(async (span) => {
const { date, results } = await span.traceChildAsync('get telegram cidr', getTelegramCIDRPromise);
if (results.length === 0) {
@ -56,7 +56,3 @@ export const buildTelegramCIDR = task(import.meta.path, async (span) => {
path.resolve(import.meta.dir, '../Clash/ip/telegram.txt')
);
});
if (import.meta.main) {
buildTelegramCIDR();
}

View File

@ -12,12 +12,8 @@ const ASSETS_LIST = {
const mockDir = path.resolve(import.meta.dir, '../Mock');
export const downloadMockAssets = task(import.meta.path, (span) => Promise.all(Object.entries(ASSETS_LIST).map(
export const downloadMockAssets = task(import.meta.main, import.meta.path)((span) => Promise.all(Object.entries(ASSETS_LIST).map(
([filename, url]) => span
.traceChild(url)
.traceAsyncFn(() => fetchWithRetry(url).then(res => Bun.write(path.join(mockDir, filename), res)))
)));
if (import.meta.main) {
downloadMockAssets();
}

View File

@ -13,7 +13,7 @@ import { Readable } from 'stream';
const IS_READING_BUILD_OUTPUT = 1 << 2;
const ALL_FILES_EXISTS = 1 << 3;
export const downloadPreviousBuild = task(import.meta.path, async (span) => {
export const downloadPreviousBuild = task(import.meta.main, import.meta.path)(async (span) => {
const buildOutputList: string[] = [];
let flag = 1 | ALL_FILES_EXISTS;
@ -91,7 +91,3 @@ export const downloadPreviousBuild = task(import.meta.path, async (span) => {
}
});
});
if (import.meta.main) {
downloadPreviousBuild();
}

View File

@ -30,7 +30,7 @@ export interface Span {
readonly traceAsyncFn: <T>(fn: (span: Span) => T | Promise<T>) => Promise<T>,
readonly tracePromise: <T>(promise: Promise<T>) => Promise<T>,
readonly traceChildSync: <T>(name: string, fn: (span: Span) => T) => T,
readonly traceChildAsync: <T>(name: string, fn: (span: Span) => T | Promise<T>) => Promise<T>,
readonly traceChildAsync: <T>(name: string, fn: (span: Span) => Promise<T>) => Promise<T>,
readonly traceChildPromise: <T>(name: string, promise: Promise<T>) => Promise<T>,
readonly traceResult: TraceResult
}
@ -85,9 +85,7 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span
span.stop();
}
},
get traceResult() {
return curTraceResult;
},
traceResult: curTraceResult,
async tracePromise<T>(promise: Promise<T>): Promise<T> {
try {
return await promise;
@ -95,44 +93,44 @@ export const createSpan = (name: string, parentTraceResult?: TraceResult): Span
span.stop();
}
},
traceChildSync<T>(name: string, fn: (span: Span) => T): T {
return traceChild(name).traceSyncFn(fn);
},
traceChildAsync<T>(name: string, fn: (span: Span) => T | Promise<T>): Promise<T> {
return traceChild(name).traceAsyncFn(fn);
},
traceChildPromise<T>(name: string, promise: Promise<T>): Promise<T> {
return traceChild(name).tracePromise(promise);
}
traceChildSync: <T>(name: string, fn: (span: Span) => T): T => traceChild(name).traceSyncFn(fn),
traceChildAsync: <T>(name: string, fn: (span: Span) => T | Promise<T>): Promise<T> => traceChild(name).traceAsyncFn(fn),
traceChildPromise: <T>(name: string, promise: Promise<T>): Promise<T> => traceChild(name).tracePromise(promise)
};
// eslint-disable-next-line sukka/no-redundant-variable -- self reference
return span;
};
export const task = <T>(importMetaPath: string, fn: (span: Span) => T, customname?: string) => {
const taskName = customname ?? path.basename(importMetaPath, path.extname(importMetaPath));
export const task = (importMetaMain: boolean, importMetaPath: string) => <T>(fn: (span: Span) => Promise<T>, customName?: string) => {
const taskName = customName ?? path.basename(importMetaPath, path.extname(importMetaPath));
const dummySpan = createSpan(taskName);
if (importMetaMain) {
fn(dummySpan);
}
return async (span?: Span) => {
if (span) {
return span.traceChildAsync(taskName, fn);
}
return fn(createSpan(taskName));
return fn(dummySpan);
};
};
const isSpan = (obj: any): obj is Span => {
return typeof obj === 'object' && obj && spanTag in obj;
};
export const universalify = <A extends any[], R>(taskname: string, fn: (this: void, ...args: A) => R) => {
return (...args: A) => {
const lastArg = args[args.length - 1];
if (isSpan(lastArg)) {
return lastArg.traceChild(taskname).traceSyncFn(() => fn(...args));
}
return fn(...args);
};
};
// const isSpan = (obj: any): obj is Span => {
// return typeof obj === 'object' && obj && spanTag in obj;
// };
// export const universalify = <A extends any[], R>(taskname: string, fn: (this: void, ...args: A) => R) => {
// return (...args: A) => {
// const lastArg = args[args.length - 1];
// if (isSpan(lastArg)) {
// return lastArg.traceChild(taskname).traceSyncFn(() => fn(...args));
// }
// return fn(...args);
// };
// };
export const printTraceResult = (traceResult: TraceResult = rootTraceResult) => {
printStats(traceResult.children);
@ -140,8 +138,7 @@ export const printTraceResult = (traceResult: TraceResult = rootTraceResult) =>
};
function printTree(initialTree: TraceResult, printNode: (node: TraceResult, branch: string) => string) {
function printBranch(tree: TraceResult, branch: string) {
const isGraphHead = branch.length === 0;
function printBranch(tree: TraceResult, branch: string, isGraphHead: boolean, isChildOfLastBranch: boolean) {
const children = tree.children;
let branchHead = '';
@ -159,7 +156,6 @@ function printTree(initialTree: TraceResult, printNode: (node: TraceResult, bran
let baseBranch = branch;
if (!isGraphHead) {
const isChildOfLastBranch = branch.endsWith('└─');
baseBranch = branch.slice(0, -2) + (isChildOfLastBranch ? ' ' : '│ ');
}
@ -167,11 +163,12 @@ function printTree(initialTree: TraceResult, printNode: (node: TraceResult, bran
const lastBranch = `${baseBranch}└─`;
children.forEach((child, index) => {
printBranch(child, children.length - 1 === index ? lastBranch : nextBranch);
const last = children.length - 1 === index;
printBranch(child, last ? lastBranch : nextBranch, false, last);
});
}
printBranch(initialTree, '');
printBranch(initialTree, '', true, false);
}
function printStats(stats: TraceResult[]): void {

View File

@ -67,7 +67,3 @@ export const parseDomesticList = async () => {
console.log(notIncludedDomestic.size, notIncludedDomestic);
};
if (import.meta.main) {
parseDomesticList();
}

View File

@ -119,7 +119,3 @@ export const parseGfwList = async () => {
top500Gfwed
] as const;
};
if (import.meta.main) {
parseGfwList();
}