@herbertgao/surgio
Version:
Generating rules for Surge, Clash, Quantumult like a PRO
106 lines • 4.24 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.MultiplexValidator = exports.TlsNodeConfigValidator = exports.SimpleNodeConfigValidator = exports.IntegersVersionValidator = exports.AlterIdValiator = exports.PortValidator = exports.getPositiveIntegersNumberValidatior = void 0;
const zod_1 = require("zod");
const types_1 = require("../types");
const surgio_config_1 = require("./surgio-config");
const getPositiveIntegersNumberValidatior = (validator, message) => zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).transform((v, ctx) => {
const num = Number(v);
const isInputString = typeof v === 'string';
if (validator(num) && Number.isInteger(num)) {
return isInputString ? `${num}` : num;
}
else {
ctx.addIssue({
code: zod_1.z.ZodIssueCode.custom,
message,
});
return zod_1.z.NEVER;
}
});
exports.getPositiveIntegersNumberValidatior = getPositiveIntegersNumberValidatior;
exports.PortValidator = zod_1.z
.union([zod_1.z.string(), zod_1.z.number()])
.transform((v, ctx) => {
const port = Number(v);
const isInputString = typeof v === 'string';
if (port > 0 && port < 65536 && Number.isInteger(port)) {
return isInputString ? `${port}` : port;
}
else {
ctx.addIssue({
code: zod_1.z.ZodIssueCode.custom,
message: '端口号必须为 0 ~ 65535 之间的整数',
});
return zod_1.z.NEVER;
}
});
exports.AlterIdValiator = (0, exports.getPositiveIntegersNumberValidatior)((n) => n >= 0, 'alterId 必须为大于等于 0 的整数').default('0');
exports.IntegersVersionValidator = (0, exports.getPositiveIntegersNumberValidatior)((n) => n > 0, '版本号必须为大于 0 的整数');
exports.SimpleNodeConfigValidator = zod_1.z.object({
type: zod_1.z.nativeEnum(types_1.NodeTypeEnum),
nodeName: zod_1.z.string(),
enable: zod_1.z.boolean().optional(),
// TCP features
tfo: zod_1.z.oboolean(),
mptcp: zod_1.z.oboolean(),
ecn: zod_1.z.oboolean(),
shadowTls: zod_1.z
.object({
version: exports.IntegersVersionValidator.optional(),
password: zod_1.z.string(),
sni: zod_1.z.string(),
})
.optional(),
// UDP features
blockQuic: zod_1.z
.union([zod_1.z.literal('auto'), zod_1.z.literal('on'), zod_1.z.literal('off')])
.optional(),
// Misc
portHopping: zod_1.z
.string()
.transform((val) => {
if (val.includes(',')) {
return val.replaceAll(',', ';');
}
return val;
})
.optional(),
portHoppingInterval: zod_1.z.number().optional(),
underlyingProxy: zod_1.z.string().optional(),
testUrl: zod_1.z.string().optional(),
testTimeout: zod_1.z.number().optional(),
surgeConfig: surgio_config_1.SurgeConfigValidator.optional(),
surfboardConfig: surgio_config_1.SurfboardConfigValidator.optional(),
quantumultXConfig: surgio_config_1.QuantumultXConfigValidator.optional(),
clashConfig: surgio_config_1.ClashConfigValidator.optional(),
hostnameIp: zod_1.z.array(zod_1.z.string()).readonly().optional(),
binPath: zod_1.z.string().optional(),
localPort: zod_1.z.number().optional(),
interfaceName: zod_1.z.string().optional(),
ipVersion: zod_1.z.string().optional(),
});
exports.TlsNodeConfigValidator = exports.SimpleNodeConfigValidator.extend({
hostname: zod_1.z.string(),
port: exports.PortValidator,
tls13: zod_1.z.oboolean(),
skipCertVerify: zod_1.z.oboolean(),
sni: zod_1.z.ostring(),
alpn: zod_1.z.array(zod_1.z.string()).nonempty().optional(),
serverCertFingerprintSha256: zod_1.z.ostring(),
clientFingerprint: zod_1.z.ostring(),
});
exports.MultiplexValidator = zod_1.z.object({
protocol: zod_1.z.enum(['smux', 'yamux', 'h2mux']),
maxConnections: zod_1.z.number().optional(),
minStreams: zod_1.z.number().optional(),
maxStreams: zod_1.z.number().optional(),
padding: zod_1.z.boolean().optional(),
brutal: zod_1.z
.object({
upMbps: zod_1.z.number(),
downMbps: zod_1.z.number(),
})
.optional(),
});
//# sourceMappingURL=common.js.map