@singbox-iac/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +265 -0
- package/dist/cli/command-helpers.d.ts +6 -0
- package/dist/cli/command-helpers.js +34 -0
- package/dist/cli/command-helpers.js.map +1 -0
- package/dist/cli/commands/apply.d.ts +2 -0
- package/dist/cli/commands/apply.js +32 -0
- package/dist/cli/commands/apply.js.map +1 -0
- package/dist/cli/commands/author.d.ts +2 -0
- package/dist/cli/commands/author.js +194 -0
- package/dist/cli/commands/author.js.map +1 -0
- package/dist/cli/commands/build.d.ts +2 -0
- package/dist/cli/commands/build.js +198 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/check.d.ts +2 -0
- package/dist/cli/commands/check.js +23 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +35 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.js +23 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/reload.d.ts +2 -0
- package/dist/cli/commands/reload.js +21 -0
- package/dist/cli/commands/reload.js.map +1 -0
- package/dist/cli/commands/run.d.ts +2 -0
- package/dist/cli/commands/run.js +25 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/schedule.d.ts +2 -0
- package/dist/cli/commands/schedule.js +77 -0
- package/dist/cli/commands/schedule.js.map +1 -0
- package/dist/cli/commands/templates.d.ts +2 -0
- package/dist/cli/commands/templates.js +34 -0
- package/dist/cli/commands/templates.js.map +1 -0
- package/dist/cli/commands/update.d.ts +2 -0
- package/dist/cli/commands/update.js +52 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +2 -0
- package/dist/cli/commands/verify.js +49 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.js +55 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/load-config.d.ts +2 -0
- package/dist/config/load-config.js +29 -0
- package/dist/config/load-config.js.map +1 -0
- package/dist/config/schema.d.ts +548 -0
- package/dist/config/schema.js +92 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/domain/config.d.ts +8 -0
- package/dist/domain/config.js +2 -0
- package/dist/domain/config.js.map +1 -0
- package/dist/domain/node.d.ts +11 -0
- package/dist/domain/node.js +2 -0
- package/dist/domain/node.js.map +1 -0
- package/dist/domain/outbound.d.ts +15 -0
- package/dist/domain/outbound.js +2 -0
- package/dist/domain/outbound.js.map +1 -0
- package/dist/domain/subscription.d.ts +6 -0
- package/dist/domain/subscription.js +2 -0
- package/dist/domain/subscription.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/authoring/index.d.ts +41 -0
- package/dist/modules/authoring/index.js +596 -0
- package/dist/modules/authoring/index.js.map +1 -0
- package/dist/modules/build/index.d.ts +13 -0
- package/dist/modules/build/index.js +39 -0
- package/dist/modules/build/index.js.map +1 -0
- package/dist/modules/compiler/index.d.ts +10 -0
- package/dist/modules/compiler/index.js +305 -0
- package/dist/modules/compiler/index.js.map +1 -0
- package/dist/modules/doctor/index.d.ts +17 -0
- package/dist/modules/doctor/index.js +89 -0
- package/dist/modules/doctor/index.js.map +1 -0
- package/dist/modules/fetcher/index.d.ts +4 -0
- package/dist/modules/fetcher/index.js +42 -0
- package/dist/modules/fetcher/index.js.map +1 -0
- package/dist/modules/init/index.d.ts +12 -0
- package/dist/modules/init/index.js +41 -0
- package/dist/modules/init/index.js.map +1 -0
- package/dist/modules/manager/index.d.ts +29 -0
- package/dist/modules/manager/index.js +133 -0
- package/dist/modules/manager/index.js.map +1 -0
- package/dist/modules/natural-language/index.d.ts +54 -0
- package/dist/modules/natural-language/index.js +458 -0
- package/dist/modules/natural-language/index.js.map +1 -0
- package/dist/modules/parser/index.d.ts +10 -0
- package/dist/modules/parser/index.js +113 -0
- package/dist/modules/parser/index.js.map +1 -0
- package/dist/modules/preview/index.d.ts +22 -0
- package/dist/modules/preview/index.js +141 -0
- package/dist/modules/preview/index.js.map +1 -0
- package/dist/modules/rule-templates/index.d.ts +15 -0
- package/dist/modules/rule-templates/index.js +200 -0
- package/dist/modules/rule-templates/index.js.map +1 -0
- package/dist/modules/schedule/index.d.ts +32 -0
- package/dist/modules/schedule/index.js +155 -0
- package/dist/modules/schedule/index.js.map +1 -0
- package/dist/modules/update/index.d.ts +22 -0
- package/dist/modules/update/index.js +38 -0
- package/dist/modules/update/index.js.map +1 -0
- package/dist/modules/user-rules/index.d.ts +18 -0
- package/dist/modules/user-rules/index.js +98 -0
- package/dist/modules/user-rules/index.js.map +1 -0
- package/dist/modules/verification/index.d.ts +49 -0
- package/dist/modules/verification/index.js +432 -0
- package/dist/modules/verification/index.js.map +1 -0
- package/dist/shared/errors.d.ts +3 -0
- package/dist/shared/errors.js +7 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/logger.d.ts +2 -0
- package/dist/shared/logger.js +5 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/result.d.ts +11 -0
- package/dist/shared/result.js +7 -0
- package/dist/shared/result.js.map +1 -0
- package/docs/antigravity-endpoints.md +77 -0
- package/docs/competitive-landscape.md +45 -0
- package/docs/development-workflow.md +80 -0
- package/docs/natural-language-authoring.md +376 -0
- package/docs/positioning.md +42 -0
- package/docs/releasing.md +72 -0
- package/docs/rule-templates.md +122 -0
- package/docs/rules-dsl.md +107 -0
- package/docs/runtime-on-macos.md +42 -0
- package/docs/sing-box-config-primer.md +39 -0
- package/docs/subscription-format.md +38 -0
- package/examples/builder.config.yaml +220 -0
- package/examples/custom.rules.yaml +18 -0
- package/package.json +51 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access, readFile } from "node:fs/promises";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
const nonEmptyString = z.string().min(1);
|
|
6
|
+
const stringOrStringArray = z.union([nonEmptyString, z.array(nonEmptyString).min(1)]);
|
|
7
|
+
const dslRuleSchema = z
|
|
8
|
+
.object({
|
|
9
|
+
name: nonEmptyString.optional(),
|
|
10
|
+
inbound: stringOrStringArray.optional(),
|
|
11
|
+
protocol: nonEmptyString.optional(),
|
|
12
|
+
network: z.enum(["tcp", "udp"]).optional(),
|
|
13
|
+
port: z.number().int().positive().optional(),
|
|
14
|
+
domain: stringOrStringArray.optional(),
|
|
15
|
+
domainSuffix: stringOrStringArray.optional(),
|
|
16
|
+
ruleSet: stringOrStringArray.optional(),
|
|
17
|
+
route: nonEmptyString.optional(),
|
|
18
|
+
action: z.literal("reject").optional(),
|
|
19
|
+
})
|
|
20
|
+
.superRefine((rule, ctx) => {
|
|
21
|
+
const hasMatch = rule.inbound !== undefined ||
|
|
22
|
+
rule.protocol !== undefined ||
|
|
23
|
+
rule.network !== undefined ||
|
|
24
|
+
rule.port !== undefined ||
|
|
25
|
+
rule.domain !== undefined ||
|
|
26
|
+
rule.domainSuffix !== undefined ||
|
|
27
|
+
rule.ruleSet !== undefined;
|
|
28
|
+
if (!hasMatch) {
|
|
29
|
+
ctx.addIssue({
|
|
30
|
+
code: z.ZodIssueCode.custom,
|
|
31
|
+
message: "Each rule must define at least one matcher.",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
const actionCount = Number(rule.route !== undefined) + Number(rule.action !== undefined);
|
|
35
|
+
if (actionCount !== 1) {
|
|
36
|
+
ctx.addIssue({
|
|
37
|
+
code: z.ZodIssueCode.custom,
|
|
38
|
+
message: 'Each rule must define exactly one action via "route" or action="reject".',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
const userRulesFileSchema = z.object({
|
|
43
|
+
version: z.literal(1).default(1),
|
|
44
|
+
beforeBuiltins: z.array(dslRuleSchema).default([]),
|
|
45
|
+
afterBuiltins: z.array(dslRuleSchema).default([]),
|
|
46
|
+
});
|
|
47
|
+
export async function loadUserRules(filePath) {
|
|
48
|
+
if (!filePath) {
|
|
49
|
+
return emptyUserRules();
|
|
50
|
+
}
|
|
51
|
+
if (!(await fileExists(filePath))) {
|
|
52
|
+
return {
|
|
53
|
+
...emptyUserRules(),
|
|
54
|
+
warnings: [`User rules file was not found at ${filePath}; continuing without custom rules.`],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const raw = await readFile(filePath, "utf8");
|
|
58
|
+
const parsed = userRulesFileSchema.parse(YAML.parse(raw) ?? {});
|
|
59
|
+
return {
|
|
60
|
+
beforeBuiltins: parsed.beforeBuiltins.map(normalizeRule),
|
|
61
|
+
afterBuiltins: parsed.afterBuiltins.map(normalizeRule),
|
|
62
|
+
warnings: [],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function normalizeRule(rule) {
|
|
66
|
+
return {
|
|
67
|
+
...(rule.name ? { name: rule.name } : {}),
|
|
68
|
+
...(rule.inbound ? { inbound: toArray(rule.inbound) } : {}),
|
|
69
|
+
...(rule.protocol ? { protocol: rule.protocol } : {}),
|
|
70
|
+
...(rule.network ? { network: rule.network } : {}),
|
|
71
|
+
...(rule.port ? { port: rule.port } : {}),
|
|
72
|
+
...(rule.domain ? { domain: toArray(rule.domain) } : {}),
|
|
73
|
+
...(rule.domainSuffix ? { domainSuffix: toArray(rule.domainSuffix) } : {}),
|
|
74
|
+
...(rule.ruleSet ? { ruleSet: toArray(rule.ruleSet) } : {}),
|
|
75
|
+
...(rule.route ? { route: rule.route } : {}),
|
|
76
|
+
...(rule.action ? { action: rule.action } : {}),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function toArray(value) {
|
|
80
|
+
return Array.isArray(value) ? value : [value];
|
|
81
|
+
}
|
|
82
|
+
async function fileExists(filePath) {
|
|
83
|
+
try {
|
|
84
|
+
await access(filePath, constants.F_OK);
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function emptyUserRules() {
|
|
92
|
+
return {
|
|
93
|
+
beforeBuiltins: [],
|
|
94
|
+
afterBuiltins: [],
|
|
95
|
+
warnings: [],
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/user-rules/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { BuilderConfig } from "../../config/schema.js";
|
|
2
|
+
type JsonObject = Record<string, unknown>;
|
|
3
|
+
export interface VerifyConfigRoutesInput {
|
|
4
|
+
readonly configPath: string;
|
|
5
|
+
readonly singBoxBinary?: string;
|
|
6
|
+
readonly chromeBinary?: string;
|
|
7
|
+
readonly configuredScenarios?: readonly ConfiguredVerificationScenario[];
|
|
8
|
+
}
|
|
9
|
+
export interface VerificationCheckResult {
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly passed: boolean;
|
|
12
|
+
readonly details: string;
|
|
13
|
+
}
|
|
14
|
+
export interface VerificationScenarioResult {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly passed: boolean;
|
|
17
|
+
readonly details: string;
|
|
18
|
+
readonly url: string;
|
|
19
|
+
readonly inboundTag: string;
|
|
20
|
+
readonly expectedOutboundTag: string;
|
|
21
|
+
}
|
|
22
|
+
export interface VerificationReport {
|
|
23
|
+
readonly configPath: string;
|
|
24
|
+
readonly verifyConfigPath: string;
|
|
25
|
+
readonly logPath: string;
|
|
26
|
+
readonly singBoxBinary: string;
|
|
27
|
+
readonly chromeBinary: string;
|
|
28
|
+
readonly checks: readonly VerificationCheckResult[];
|
|
29
|
+
readonly scenarios: readonly VerificationScenarioResult[];
|
|
30
|
+
}
|
|
31
|
+
export declare function assertVerificationReportPassed(report: VerificationReport): void;
|
|
32
|
+
interface PreparedVerificationConfig {
|
|
33
|
+
readonly config: JsonObject;
|
|
34
|
+
readonly mixedPort: number;
|
|
35
|
+
readonly proxifierPort: number;
|
|
36
|
+
}
|
|
37
|
+
export interface ConfiguredVerificationScenario {
|
|
38
|
+
readonly id: BuilderConfig["verification"]["scenarios"][number]["id"];
|
|
39
|
+
readonly name: BuilderConfig["verification"]["scenarios"][number]["name"];
|
|
40
|
+
readonly url: BuilderConfig["verification"]["scenarios"][number]["url"];
|
|
41
|
+
readonly inbound: BuilderConfig["verification"]["scenarios"][number]["inbound"];
|
|
42
|
+
readonly expectedOutbound: BuilderConfig["verification"]["scenarios"][number]["expectedOutbound"];
|
|
43
|
+
}
|
|
44
|
+
export declare function verifyConfigRoutes(input: VerifyConfigRoutesInput): Promise<VerificationReport>;
|
|
45
|
+
export declare function resolveChromeBinary(explicitPath?: string): Promise<string>;
|
|
46
|
+
export declare function prepareVerificationConfig(config: JsonObject): Promise<PreparedVerificationConfig>;
|
|
47
|
+
export declare function validateConfigInvariants(config: JsonObject): VerificationCheckResult[];
|
|
48
|
+
export declare function resolveDefaultLeafOutboundTag(config: JsonObject, tag: string): string;
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access } from "node:fs/promises";
|
|
4
|
+
import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
|
|
5
|
+
import net from "node:net";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { checkConfig, resolveSingBoxBinary } from "../manager/index.js";
|
|
9
|
+
export function assertVerificationReportPassed(report) {
|
|
10
|
+
const failures = report.scenarios.filter((scenario) => !scenario.passed);
|
|
11
|
+
if (failures.length === 0) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
throw new Error(`Runtime verification failed:\n${failures
|
|
15
|
+
.map((scenario) => `- ${scenario.name}\n url: ${scenario.url}\n details: ${scenario.details}`)
|
|
16
|
+
.join("\n")}`);
|
|
17
|
+
}
|
|
18
|
+
export async function verifyConfigRoutes(input) {
|
|
19
|
+
const singBoxBinary = await resolveSingBoxBinary(input.singBoxBinary);
|
|
20
|
+
const chromeBinary = await resolveChromeBinary(input.chromeBinary);
|
|
21
|
+
const rawConfig = JSON.parse(await readFile(input.configPath, "utf8"));
|
|
22
|
+
const checks = validateConfigInvariants(rawConfig);
|
|
23
|
+
const failedChecks = checks.filter((check) => !check.passed);
|
|
24
|
+
if (failedChecks.length > 0) {
|
|
25
|
+
throw new Error(`Static verification failed:\n${failedChecks
|
|
26
|
+
.map((check) => `- ${check.name}: ${check.details}`)
|
|
27
|
+
.join("\n")}`);
|
|
28
|
+
}
|
|
29
|
+
const runDir = await mkdtemp(path.join(tmpdir(), "singbox-iac-verify-"));
|
|
30
|
+
const logPath = path.join(runDir, "sing-box.log");
|
|
31
|
+
const verifyConfigPath = path.join(runDir, "verify.config.json");
|
|
32
|
+
const prepared = await prepareVerificationConfig(rawConfig);
|
|
33
|
+
await mkdir(path.dirname(verifyConfigPath), { recursive: true });
|
|
34
|
+
await writeFile(verifyConfigPath, `${JSON.stringify(prepared.config, null, 2)}\n`, "utf8");
|
|
35
|
+
await checkConfig({
|
|
36
|
+
configPath: verifyConfigPath,
|
|
37
|
+
singBoxBinary,
|
|
38
|
+
});
|
|
39
|
+
const scenarios = buildRuntimeScenarios(prepared.config, prepared.mixedPort, prepared.proxifierPort, input.configuredScenarios);
|
|
40
|
+
const logBuffer = { text: "" };
|
|
41
|
+
const logAppender = async (chunk) => {
|
|
42
|
+
const text = chunk.toString();
|
|
43
|
+
logBuffer.text += text;
|
|
44
|
+
await writeFile(logPath, text, { encoding: "utf8", flag: "a" });
|
|
45
|
+
};
|
|
46
|
+
const singBoxProcess = spawn(singBoxBinary, ["run", "-c", verifyConfigPath], {
|
|
47
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
48
|
+
});
|
|
49
|
+
singBoxProcess.stdout.on("data", (chunk) => {
|
|
50
|
+
void logAppender(chunk);
|
|
51
|
+
});
|
|
52
|
+
singBoxProcess.stderr.on("data", (chunk) => {
|
|
53
|
+
void logAppender(chunk);
|
|
54
|
+
});
|
|
55
|
+
const exitPromise = new Promise((resolve, reject) => {
|
|
56
|
+
singBoxProcess.on("error", reject);
|
|
57
|
+
singBoxProcess.on("close", (code) => resolve(code ?? 0));
|
|
58
|
+
});
|
|
59
|
+
try {
|
|
60
|
+
await waitForLog(logBuffer, /sing-box started/, 15_000, "Timed out waiting for sing-box startup during verification.");
|
|
61
|
+
const results = [];
|
|
62
|
+
for (const scenario of scenarios) {
|
|
63
|
+
const offset = logBuffer.text.length;
|
|
64
|
+
const chromeResult = await runChromeScenario({
|
|
65
|
+
chromeBinary,
|
|
66
|
+
proxyPort: scenario.proxyPort,
|
|
67
|
+
url: scenario.url,
|
|
68
|
+
workdir: runDir,
|
|
69
|
+
});
|
|
70
|
+
const expectedLog = scenario.expectedOutboundTag === "direct"
|
|
71
|
+
? new RegExp(`outbound/direct\\[direct\\]: outbound connection to ${escapeRegExp(new URL(scenario.url).hostname)}:443`)
|
|
72
|
+
: new RegExp(`outbound/trojan\\[${escapeRegExp(scenario.expectedOutboundTag)}\\]: outbound connection to ${escapeRegExp(new URL(scenario.url).hostname)}:443`);
|
|
73
|
+
const inboundLog = new RegExp(`inbound/mixed\\[${escapeRegExp(scenario.inboundTag)}\\]: inbound connection to ${escapeRegExp(new URL(scenario.url).hostname)}:443`);
|
|
74
|
+
const excerpt = await waitForScenarioLogs(logBuffer, offset, [inboundLog, expectedLog], 20_000);
|
|
75
|
+
const chromeFailure = detectChromeFailure(chromeResult);
|
|
76
|
+
results.push({
|
|
77
|
+
name: scenario.name,
|
|
78
|
+
passed: excerpt !== undefined && chromeFailure === undefined,
|
|
79
|
+
details: excerpt !== undefined && chromeFailure === undefined
|
|
80
|
+
? excerpt.trim()
|
|
81
|
+
: (chromeFailure ??
|
|
82
|
+
`Expected logs were not observed for ${new URL(scenario.url).hostname} within the timeout.`),
|
|
83
|
+
url: scenario.url,
|
|
84
|
+
inboundTag: scenario.inboundTag,
|
|
85
|
+
expectedOutboundTag: scenario.expectedOutboundTag,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
configPath: input.configPath,
|
|
90
|
+
verifyConfigPath,
|
|
91
|
+
logPath,
|
|
92
|
+
singBoxBinary,
|
|
93
|
+
chromeBinary,
|
|
94
|
+
checks,
|
|
95
|
+
scenarios: results,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
singBoxProcess.kill("SIGINT");
|
|
100
|
+
await Promise.race([exitPromise, new Promise((resolve) => setTimeout(resolve, 2_000))]);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export async function resolveChromeBinary(explicitPath) {
|
|
104
|
+
const candidates = [
|
|
105
|
+
explicitPath,
|
|
106
|
+
process.env.CHROME_BIN,
|
|
107
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
|
108
|
+
"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary",
|
|
109
|
+
].filter((candidate) => typeof candidate === "string" && candidate.length > 0);
|
|
110
|
+
for (const candidate of candidates) {
|
|
111
|
+
if (await isExecutable(candidate)) {
|
|
112
|
+
return candidate;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw new Error("Unable to find a usable Chrome binary. Set CHROME_BIN or install Google Chrome.");
|
|
116
|
+
}
|
|
117
|
+
export async function prepareVerificationConfig(config) {
|
|
118
|
+
const cloned = structuredClone(config);
|
|
119
|
+
const mixedPort = await findAvailablePort();
|
|
120
|
+
const proxifierPort = await findAvailablePort();
|
|
121
|
+
const inbounds = ensureArray(cloned.inbounds, "Config is missing inbounds.");
|
|
122
|
+
for (const inbound of inbounds) {
|
|
123
|
+
if (inbound.tag === "in-mixed") {
|
|
124
|
+
inbound.listen_port = mixedPort;
|
|
125
|
+
}
|
|
126
|
+
if (inbound.tag === "in-proxifier") {
|
|
127
|
+
inbound.listen_port = proxifierPort;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
cloned.log = { level: "debug" };
|
|
131
|
+
const outbounds = ensureArray(cloned.outbounds, "Config is missing outbounds.");
|
|
132
|
+
const globalIndex = outbounds.findIndex((outbound) => outbound.tag === "Global");
|
|
133
|
+
if (globalIndex >= 0) {
|
|
134
|
+
const current = outbounds[globalIndex];
|
|
135
|
+
if (!current) {
|
|
136
|
+
throw new Error('Unable to resolve the "Global" outbound for verification.');
|
|
137
|
+
}
|
|
138
|
+
const targets = ensureArray(current.outbounds, "Global outbound is missing outbounds for verification.");
|
|
139
|
+
outbounds[globalIndex] = {
|
|
140
|
+
type: "selector",
|
|
141
|
+
tag: "Global",
|
|
142
|
+
outbounds: targets,
|
|
143
|
+
default: targets[0],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
config: cloned,
|
|
148
|
+
mixedPort,
|
|
149
|
+
proxifierPort,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export function validateConfigInvariants(config) {
|
|
153
|
+
const route = asObject(config.route, "Config is missing route.");
|
|
154
|
+
const rules = ensureArray(route.rules, "Route is missing rules.");
|
|
155
|
+
const dns = asObject(config.dns, "Config is missing dns.");
|
|
156
|
+
const dnsServers = ensureArray(dns.servers, "DNS servers are missing.");
|
|
157
|
+
const checks = [];
|
|
158
|
+
const quicIndex = rules.findIndex((rule) => rule.network === "udp" && rule.port === 443 && rule.action === "reject");
|
|
159
|
+
const dnsIndex = rules.findIndex((rule) => rule.protocol === "dns" && rule.action === "hijack-dns");
|
|
160
|
+
const proxifierIndex = rules.findIndex((rule) => Array.isArray(rule.inbound) &&
|
|
161
|
+
rule.inbound.includes("in-proxifier") &&
|
|
162
|
+
rule.outbound === "Process-Proxy");
|
|
163
|
+
const stitchIndex = rules.findIndex((rule) => Array.isArray(rule.domain_suffix) &&
|
|
164
|
+
rule.domain_suffix.includes("stitch.withgoogle.com") &&
|
|
165
|
+
rule.outbound === "Stitch-Out");
|
|
166
|
+
const explicitAiIndex = rules.findIndex((rule) => Array.isArray(rule.domain_suffix) &&
|
|
167
|
+
rule.domain_suffix.includes("chatgpt.com") &&
|
|
168
|
+
rule.outbound === "AI-Out");
|
|
169
|
+
const aiRuleSetIndex = rules.findIndex((rule) => Array.isArray(rule.rule_set) &&
|
|
170
|
+
rule.rule_set.includes("geosite-google-gemini") &&
|
|
171
|
+
rule.outbound === "AI-Out");
|
|
172
|
+
const devRuleSetIndex = rules.findIndex((rule) => Array.isArray(rule.rule_set) &&
|
|
173
|
+
rule.rule_set.includes("geosite-github") &&
|
|
174
|
+
rule.outbound === "Dev-Common-Out");
|
|
175
|
+
const chinaIndex = rules.findIndex((rule) => Array.isArray(rule.rule_set) &&
|
|
176
|
+
rule.rule_set.includes("geosite-cn") &&
|
|
177
|
+
rule.outbound === "direct");
|
|
178
|
+
checks.push(makeCheck("route-priority", [
|
|
179
|
+
quicIndex,
|
|
180
|
+
dnsIndex,
|
|
181
|
+
proxifierIndex,
|
|
182
|
+
stitchIndex,
|
|
183
|
+
explicitAiIndex,
|
|
184
|
+
aiRuleSetIndex,
|
|
185
|
+
devRuleSetIndex,
|
|
186
|
+
chinaIndex,
|
|
187
|
+
].every((index) => index >= 0) &&
|
|
188
|
+
quicIndex < dnsIndex &&
|
|
189
|
+
dnsIndex < proxifierIndex &&
|
|
190
|
+
proxifierIndex < stitchIndex &&
|
|
191
|
+
stitchIndex < explicitAiIndex &&
|
|
192
|
+
explicitAiIndex < aiRuleSetIndex &&
|
|
193
|
+
aiRuleSetIndex < devRuleSetIndex &&
|
|
194
|
+
devRuleSetIndex < chinaIndex, `Rule order indices: quic=${quicIndex}, dns=${dnsIndex}, proxifier=${proxifierIndex}, stitch=${stitchIndex}, explicitAi=${explicitAiIndex}, aiRuleSet=${aiRuleSetIndex}, devRuleSet=${devRuleSetIndex}, china=${chinaIndex}`));
|
|
195
|
+
checks.push(makeCheck("default-domain-resolver", typeof route.default_domain_resolver === "string" &&
|
|
196
|
+
dnsServers.some((server) => server.tag === route.default_domain_resolver), `default_domain_resolver=${String(route.default_domain_resolver)}`));
|
|
197
|
+
checks.push(makeCheck("dns-shape", dnsServers.some((server) => server.type === "udp" && server.server === "1.1.1.1") &&
|
|
198
|
+
dnsServers.some((server) => server.type === "udp" && server.server === "223.5.5.5"), `dns servers=${dnsServers
|
|
199
|
+
.map((server) => `${String(server.tag)}:${String(server.server)}`)
|
|
200
|
+
.join(", ")}`));
|
|
201
|
+
return checks;
|
|
202
|
+
}
|
|
203
|
+
export function resolveDefaultLeafOutboundTag(config, tag) {
|
|
204
|
+
const outbounds = ensureArray(config.outbounds, "Config is missing outbounds.");
|
|
205
|
+
const byTag = new Map();
|
|
206
|
+
for (const outbound of outbounds) {
|
|
207
|
+
if (typeof outbound.tag === "string") {
|
|
208
|
+
byTag.set(outbound.tag, outbound);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const visited = new Set();
|
|
212
|
+
let currentTag = tag;
|
|
213
|
+
while (true) {
|
|
214
|
+
if (currentTag === "direct" || currentTag === "block") {
|
|
215
|
+
return currentTag;
|
|
216
|
+
}
|
|
217
|
+
if (visited.has(currentTag)) {
|
|
218
|
+
throw new Error(`Detected selector cycle while resolving outbound tag "${tag}".`);
|
|
219
|
+
}
|
|
220
|
+
visited.add(currentTag);
|
|
221
|
+
const current = byTag.get(currentTag);
|
|
222
|
+
if (!current) {
|
|
223
|
+
return currentTag;
|
|
224
|
+
}
|
|
225
|
+
if (current.type === "selector" || current.type === "urltest") {
|
|
226
|
+
const next = typeof current.default === "string"
|
|
227
|
+
? current.default
|
|
228
|
+
: ensureArray(current.outbounds, `Selector/urltest "${currentTag}" is missing outbounds.`)[0];
|
|
229
|
+
if (!next) {
|
|
230
|
+
throw new Error(`Selector/urltest "${currentTag}" has no default outbound target.`);
|
|
231
|
+
}
|
|
232
|
+
currentTag = next;
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
return currentTag;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function buildRuntimeScenarios(config, mixedPort, proxifierPort, configuredScenarios) {
|
|
239
|
+
const sourceScenarios = configuredScenarios && configuredScenarios.length > 0
|
|
240
|
+
? configuredScenarios
|
|
241
|
+
: defaultConfiguredScenarios;
|
|
242
|
+
return sourceScenarios.map((scenario) => ({
|
|
243
|
+
id: scenario.id,
|
|
244
|
+
name: scenario.name,
|
|
245
|
+
url: scenario.url,
|
|
246
|
+
inboundTag: scenario.inbound,
|
|
247
|
+
proxyPort: scenario.inbound === "in-proxifier" ? proxifierPort : mixedPort,
|
|
248
|
+
expectedOutboundTag: scenario.expectedOutbound === "direct" || scenario.expectedOutbound === "block"
|
|
249
|
+
? scenario.expectedOutbound
|
|
250
|
+
: resolveDefaultLeafOutboundTag(config, scenario.expectedOutbound),
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
const defaultConfiguredScenarios = [
|
|
254
|
+
{
|
|
255
|
+
id: "stitch",
|
|
256
|
+
name: "Google Stitch routes via Stitch-Out default",
|
|
257
|
+
url: "https://stitch.withgoogle.com/favicon.ico",
|
|
258
|
+
inbound: "in-mixed",
|
|
259
|
+
expectedOutbound: "Stitch-Out",
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
id: "chatgpt",
|
|
263
|
+
name: "ChatGPT routes via AI-Out explicit domain rule",
|
|
264
|
+
url: "https://chatgpt.com/favicon.ico",
|
|
265
|
+
inbound: "in-mixed",
|
|
266
|
+
expectedOutbound: "AI-Out",
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
id: "gemini",
|
|
270
|
+
name: "Gemini routes via AI-Out ruleset",
|
|
271
|
+
url: "https://gemini.google.com/favicon.ico",
|
|
272
|
+
inbound: "in-mixed",
|
|
273
|
+
expectedOutbound: "AI-Out",
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
id: "github",
|
|
277
|
+
name: "GitHub routes via Dev-Common-Out",
|
|
278
|
+
url: "https://github.com/favicon.ico",
|
|
279
|
+
inbound: "in-mixed",
|
|
280
|
+
expectedOutbound: "Dev-Common-Out",
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
id: "cn-direct",
|
|
284
|
+
name: "China traffic routes direct on mixed inbound",
|
|
285
|
+
url: "https://www.baidu.com/favicon.ico",
|
|
286
|
+
inbound: "in-mixed",
|
|
287
|
+
expectedOutbound: "direct",
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
id: "proxifier-precedence",
|
|
291
|
+
name: "Proxifier inbound overrides CN direct rule",
|
|
292
|
+
url: "https://www.baidu.com/favicon.ico",
|
|
293
|
+
inbound: "in-proxifier",
|
|
294
|
+
expectedOutbound: "Process-Proxy",
|
|
295
|
+
},
|
|
296
|
+
];
|
|
297
|
+
async function runChromeScenario(input) {
|
|
298
|
+
const scenarioDir = await mkdtemp(path.join(input.workdir, "chrome-"));
|
|
299
|
+
const args = [
|
|
300
|
+
"--headless=new",
|
|
301
|
+
"--disable-gpu",
|
|
302
|
+
"--disable-background-networking",
|
|
303
|
+
"--disable-default-apps",
|
|
304
|
+
"--disable-extensions",
|
|
305
|
+
"--disable-sync",
|
|
306
|
+
"--disable-component-update",
|
|
307
|
+
"--metrics-recording-only",
|
|
308
|
+
"--mute-audio",
|
|
309
|
+
"--no-first-run",
|
|
310
|
+
"--no-default-browser-check",
|
|
311
|
+
"--virtual-time-budget=6000",
|
|
312
|
+
`--user-data-dir=${scenarioDir}`,
|
|
313
|
+
`--proxy-server=http://127.0.0.1:${input.proxyPort}`,
|
|
314
|
+
"--dump-dom",
|
|
315
|
+
input.url,
|
|
316
|
+
];
|
|
317
|
+
return new Promise((resolve, reject) => {
|
|
318
|
+
const child = spawn(input.chromeBinary, args, {
|
|
319
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
320
|
+
});
|
|
321
|
+
let stdout = "";
|
|
322
|
+
let stderr = "";
|
|
323
|
+
let timedOut = false;
|
|
324
|
+
const timeout = setTimeout(() => {
|
|
325
|
+
timedOut = true;
|
|
326
|
+
child.kill("SIGKILL");
|
|
327
|
+
}, 8_000);
|
|
328
|
+
child.stdout.on("data", (chunk) => {
|
|
329
|
+
stdout += chunk.toString();
|
|
330
|
+
});
|
|
331
|
+
child.stderr.on("data", (chunk) => {
|
|
332
|
+
stderr += chunk.toString();
|
|
333
|
+
});
|
|
334
|
+
child.on("error", (error) => {
|
|
335
|
+
clearTimeout(timeout);
|
|
336
|
+
reject(error);
|
|
337
|
+
});
|
|
338
|
+
child.on("close", (code) => {
|
|
339
|
+
clearTimeout(timeout);
|
|
340
|
+
resolve({
|
|
341
|
+
exitCode: code ?? 0,
|
|
342
|
+
stdout,
|
|
343
|
+
stderr,
|
|
344
|
+
timedOut,
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
function detectChromeFailure(result) {
|
|
350
|
+
if (result.exitCode !== 0 && !result.timedOut) {
|
|
351
|
+
return `Chrome exited with code ${result.exitCode}.`;
|
|
352
|
+
}
|
|
353
|
+
const output = `${result.stdout}\n${result.stderr}`;
|
|
354
|
+
if (/ERR_[A-Z_]+/.test(output) || /This site can.t be reached/i.test(output)) {
|
|
355
|
+
return output.trim();
|
|
356
|
+
}
|
|
357
|
+
return undefined;
|
|
358
|
+
}
|
|
359
|
+
async function waitForScenarioLogs(buffer, offset, patterns, timeoutMs) {
|
|
360
|
+
const startedAt = Date.now();
|
|
361
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
362
|
+
const excerpt = buffer.text.slice(offset);
|
|
363
|
+
if (patterns.every((pattern) => pattern.test(excerpt))) {
|
|
364
|
+
return excerpt;
|
|
365
|
+
}
|
|
366
|
+
await sleep(250);
|
|
367
|
+
}
|
|
368
|
+
return undefined;
|
|
369
|
+
}
|
|
370
|
+
async function waitForLog(buffer, pattern, timeoutMs, errorMessage) {
|
|
371
|
+
const startedAt = Date.now();
|
|
372
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
373
|
+
if (pattern.test(buffer.text)) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
await sleep(250);
|
|
377
|
+
}
|
|
378
|
+
throw new Error(`${errorMessage}\nRecent log output:\n${buffer.text.slice(-2000)}`);
|
|
379
|
+
}
|
|
380
|
+
async function findAvailablePort() {
|
|
381
|
+
return new Promise((resolve, reject) => {
|
|
382
|
+
const server = net.createServer();
|
|
383
|
+
server.unref();
|
|
384
|
+
server.on("error", reject);
|
|
385
|
+
server.listen(0, "127.0.0.1", () => {
|
|
386
|
+
const address = server.address();
|
|
387
|
+
if (!address || typeof address === "string") {
|
|
388
|
+
reject(new Error("Failed to allocate a local port for verification."));
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const { port } = address;
|
|
392
|
+
server.close((error) => {
|
|
393
|
+
if (error) {
|
|
394
|
+
reject(error);
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
resolve(port);
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
function ensureArray(value, message) {
|
|
403
|
+
if (!Array.isArray(value)) {
|
|
404
|
+
throw new Error(message);
|
|
405
|
+
}
|
|
406
|
+
return value;
|
|
407
|
+
}
|
|
408
|
+
function asObject(value, message) {
|
|
409
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
410
|
+
throw new Error(message);
|
|
411
|
+
}
|
|
412
|
+
return value;
|
|
413
|
+
}
|
|
414
|
+
function makeCheck(name, passed, details) {
|
|
415
|
+
return { name, passed, details };
|
|
416
|
+
}
|
|
417
|
+
function escapeRegExp(input) {
|
|
418
|
+
return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
419
|
+
}
|
|
420
|
+
async function isExecutable(filePath) {
|
|
421
|
+
try {
|
|
422
|
+
await access(filePath, constants.X_OK);
|
|
423
|
+
return true;
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
async function sleep(ms) {
|
|
430
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/verification/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/shared/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAmB,OAAO,GAAG,qCAAqC;QAChE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/shared/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,aAAa;CACpB,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface Ok<T> {
|
|
2
|
+
readonly ok: true;
|
|
3
|
+
readonly value: T;
|
|
4
|
+
}
|
|
5
|
+
export interface Err<E> {
|
|
6
|
+
readonly ok: false;
|
|
7
|
+
readonly error: E;
|
|
8
|
+
}
|
|
9
|
+
export type Result<T, E> = Ok<T> | Err<E>;
|
|
10
|
+
export declare function ok<T>(value: T): Ok<T>;
|
|
11
|
+
export declare function err<E>(error: E): Err<E>;
|