mcp-xray-pilot 0.10.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 +502 -0
- package/data/docs/_index.json +533 -0
- package/data/docs/basic__api.md +148 -0
- package/data/docs/basic__dns.md +366 -0
- package/data/docs/basic__fakedns.md +202 -0
- package/data/docs/basic__geodata.md +64 -0
- package/data/docs/basic__inbound.md +159 -0
- package/data/docs/basic__index.md +136 -0
- package/data/docs/basic__log.md +67 -0
- package/data/docs/basic__metrics.md +262 -0
- package/data/docs/basic__observatory.md +115 -0
- package/data/docs/basic__outbound.md +164 -0
- package/data/docs/basic__policy.md +140 -0
- package/data/docs/basic__reverse.md +268 -0
- package/data/docs/basic__routing.md +474 -0
- package/data/docs/basic__stats.md +61 -0
- package/data/docs/basic__transport.md +1283 -0
- package/data/docs/features__features_browser_dialer.md +61 -0
- package/data/docs/features__features_env.md +66 -0
- package/data/docs/features__features_fallback.md +110 -0
- package/data/docs/features__features_index.md +17 -0
- package/data/docs/features__features_multiple.md +144 -0
- package/data/docs/features__features_xtls.md +13 -0
- package/data/docs/inbounds__inbounds_dokodemo.md +11 -0
- package/data/docs/inbounds__inbounds_http.md +80 -0
- package/data/docs/inbounds__inbounds_hysteria.md +60 -0
- package/data/docs/inbounds__inbounds_index.md +22 -0
- package/data/docs/inbounds__inbounds_shadowsocks.md +118 -0
- package/data/docs/inbounds__inbounds_socks.md +87 -0
- package/data/docs/inbounds__inbounds_trojan.md +78 -0
- package/data/docs/inbounds__inbounds_tun.md +47 -0
- package/data/docs/inbounds__inbounds_tunnel.md +86 -0
- package/data/docs/inbounds__inbounds_vless.md +135 -0
- package/data/docs/inbounds__inbounds_vmess.md +95 -0
- package/data/docs/inbounds__inbounds_wireguard.md +78 -0
- package/data/docs/outbounds__outbounds_blackhole.md +42 -0
- package/data/docs/outbounds__outbounds_dns.md +97 -0
- package/data/docs/outbounds__outbounds_freedom.md +170 -0
- package/data/docs/outbounds__outbounds_http.md +70 -0
- package/data/docs/outbounds__outbounds_hysteria.md +39 -0
- package/data/docs/outbounds__outbounds_index.md +24 -0
- package/data/docs/outbounds__outbounds_loopback.md +65 -0
- package/data/docs/outbounds__outbounds_shadowsocks.md +105 -0
- package/data/docs/outbounds__outbounds_socks.md +58 -0
- package/data/docs/outbounds__outbounds_trojan.md +49 -0
- package/data/docs/outbounds__outbounds_vless.md +122 -0
- package/data/docs/outbounds__outbounds_vmess.md +76 -0
- package/data/docs/outbounds__outbounds_wireguard.md +141 -0
- package/data/docs/transports__transports_grpc.md +137 -0
- package/data/docs/transports__transports_h2.md +11 -0
- package/data/docs/transports__transports_http.md +11 -0
- package/data/docs/transports__transports_httpupgrade.md +61 -0
- package/data/docs/transports__transports_hysteria.md +110 -0
- package/data/docs/transports__transports_index.md +19 -0
- package/data/docs/transports__transports_mkcp.md +125 -0
- package/data/docs/transports__transports_quic.md +11 -0
- package/data/docs/transports__transports_raw.md +156 -0
- package/data/docs/transports__transports_splithttp.md +11 -0
- package/data/docs/transports__transports_tcp.md +11 -0
- package/data/docs/transports__transports_websocket.md +75 -0
- package/data/docs/transports__transports_xhttp.md +11 -0
- package/dist/data/compatibility.js +170 -0
- package/dist/data/compatibility.js.map +1 -0
- package/dist/data/geocatalogue.js +191 -0
- package/dist/data/geocatalogue.js.map +1 -0
- package/dist/docs.js +339 -0
- package/dist/docs.js.map +1 -0
- package/dist/handlers.js +217 -0
- package/dist/handlers.js.map +1 -0
- package/dist/index.js +66 -0
- package/dist/index.js.map +1 -0
- package/dist/lint.js +737 -0
- package/dist/lint.js.map +1 -0
- package/dist/schemas/protocols/blackhole.js +16 -0
- package/dist/schemas/protocols/blackhole.js.map +1 -0
- package/dist/schemas/protocols/common.js +32 -0
- package/dist/schemas/protocols/common.js.map +1 -0
- package/dist/schemas/protocols/dns.js +14 -0
- package/dist/schemas/protocols/dns.js.map +1 -0
- package/dist/schemas/protocols/dokodemo.js +17 -0
- package/dist/schemas/protocols/dokodemo.js.map +1 -0
- package/dist/schemas/protocols/freedom.js +45 -0
- package/dist/schemas/protocols/freedom.js.map +1 -0
- package/dist/schemas/protocols/http.js +38 -0
- package/dist/schemas/protocols/http.js.map +1 -0
- package/dist/schemas/protocols/hysteria.js +51 -0
- package/dist/schemas/protocols/hysteria.js.map +1 -0
- package/dist/schemas/protocols/index.js +50 -0
- package/dist/schemas/protocols/index.js.map +1 -0
- package/dist/schemas/protocols/loopback.js +11 -0
- package/dist/schemas/protocols/loopback.js.map +1 -0
- package/dist/schemas/protocols/shadowsocks.js +60 -0
- package/dist/schemas/protocols/shadowsocks.js.map +1 -0
- package/dist/schemas/protocols/socks.js +42 -0
- package/dist/schemas/protocols/socks.js.map +1 -0
- package/dist/schemas/protocols/trojan.js +34 -0
- package/dist/schemas/protocols/trojan.js.map +1 -0
- package/dist/schemas/protocols/tun.js +19 -0
- package/dist/schemas/protocols/tun.js.map +1 -0
- package/dist/schemas/protocols/vless.js +44 -0
- package/dist/schemas/protocols/vless.js.map +1 -0
- package/dist/schemas/protocols/vmess.js +48 -0
- package/dist/schemas/protocols/vmess.js.map +1 -0
- package/dist/schemas/protocols/wireguard.js +34 -0
- package/dist/schemas/protocols/wireguard.js.map +1 -0
- package/dist/schemas/security/index.js +16 -0
- package/dist/schemas/security/index.js.map +1 -0
- package/dist/schemas/security/reality.js +35 -0
- package/dist/schemas/security/reality.js.map +1 -0
- package/dist/schemas/security/tls.js +46 -0
- package/dist/schemas/security/tls.js.map +1 -0
- package/dist/schemas/security/xtls.js +17 -0
- package/dist/schemas/security/xtls.js.map +1 -0
- package/dist/schemas/transports/grpc.js +18 -0
- package/dist/schemas/transports/grpc.js.map +1 -0
- package/dist/schemas/transports/httpupgrade.js +14 -0
- package/dist/schemas/transports/httpupgrade.js.map +1 -0
- package/dist/schemas/transports/hysteria.js +25 -0
- package/dist/schemas/transports/hysteria.js.map +1 -0
- package/dist/schemas/transports/index.js +32 -0
- package/dist/schemas/transports/index.js.map +1 -0
- package/dist/schemas/transports/mkcp.js +34 -0
- package/dist/schemas/transports/mkcp.js.map +1 -0
- package/dist/schemas/transports/raw.js +19 -0
- package/dist/schemas/transports/raw.js.map +1 -0
- package/dist/schemas/transports/websocket.js +15 -0
- package/dist/schemas/transports/websocket.js.map +1 -0
- package/dist/schemas/transports/xhttp.js +34 -0
- package/dist/schemas/transports/xhttp.js.map +1 -0
- package/dist/search.js +78 -0
- package/dist/search.js.map +1 -0
- package/dist/state.js +87 -0
- package/dist/state.js.map +1 -0
- package/dist/tools.js +274 -0
- package/dist/tools.js.map +1 -0
- package/dist/tools_impl/diff.js +55 -0
- package/dist/tools_impl/diff.js.map +1 -0
- package/dist/tools_impl/github.js +416 -0
- package/dist/tools_impl/github.js.map +1 -0
- package/dist/tools_impl/merge.js +181 -0
- package/dist/tools_impl/merge.js.map +1 -0
- package/dist/tools_impl/refresh.js +46 -0
- package/dist/tools_impl/refresh.js.map +1 -0
- package/dist/tools_impl/suggest.js +169 -0
- package/dist/tools_impl/suggest.js.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.js +81 -0
- package/dist/utils.js.map +1 -0
- package/dist/validate.js +408 -0
- package/dist/validate.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* VMess settings schemas.
|
|
3
|
+
* Source: docs/en/config/inbounds/vmess.md, outbounds/vmess.md
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { email, userLevel, uuid } from "./common.js";
|
|
7
|
+
const vmessClient = z
|
|
8
|
+
.object({
|
|
9
|
+
id: uuid,
|
|
10
|
+
level: userLevel.optional(),
|
|
11
|
+
email: email.optional(),
|
|
12
|
+
})
|
|
13
|
+
.passthrough();
|
|
14
|
+
export const vmessInbound = z
|
|
15
|
+
.object({
|
|
16
|
+
clients: z.array(vmessClient).min(1),
|
|
17
|
+
default: z
|
|
18
|
+
.object({
|
|
19
|
+
level: userLevel.optional(),
|
|
20
|
+
})
|
|
21
|
+
.passthrough()
|
|
22
|
+
.optional(),
|
|
23
|
+
detour: z.object({ to: z.string() }).passthrough().optional(),
|
|
24
|
+
})
|
|
25
|
+
.passthrough();
|
|
26
|
+
const vmessUser = z
|
|
27
|
+
.object({
|
|
28
|
+
id: uuid,
|
|
29
|
+
security: z
|
|
30
|
+
.enum(["aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero"])
|
|
31
|
+
.optional(),
|
|
32
|
+
level: userLevel.optional(),
|
|
33
|
+
email: email.optional(),
|
|
34
|
+
})
|
|
35
|
+
.passthrough();
|
|
36
|
+
const vmessServer = z
|
|
37
|
+
.object({
|
|
38
|
+
address: z.string().min(1),
|
|
39
|
+
port: z.number().int().min(1).max(65535),
|
|
40
|
+
users: z.array(vmessUser).min(1),
|
|
41
|
+
})
|
|
42
|
+
.passthrough();
|
|
43
|
+
export const vmessOutbound = z
|
|
44
|
+
.object({
|
|
45
|
+
vnext: z.array(vmessServer).min(1),
|
|
46
|
+
})
|
|
47
|
+
.passthrough();
|
|
48
|
+
//# sourceMappingURL=vmess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vmess.js","sourceRoot":"","sources":["../../../src/schemas/protocols/vmess.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;CACxB,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;KAC5B,CAAC;SACD,WAAW,EAAE;SACb,QAAQ,EAAE;IACb,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CAC9D,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,EAAE,EAAE,IAAI;IACR,QAAQ,EAAE,CAAC;SACR,IAAI,CAAC,CAAC,aAAa,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;SAClE,QAAQ,EAAE;IACb,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;CACxB,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACxC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACjC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;CACnC,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WireGuard settings schemas (inbound and outbound).
|
|
3
|
+
* Source: docs/en/config/inbounds/wireguard.md, outbounds/wireguard.md
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
const peer = z
|
|
7
|
+
.object({
|
|
8
|
+
publicKey: z.string().min(1).optional(),
|
|
9
|
+
endpoint: z.string().optional(),
|
|
10
|
+
allowedIPs: z.array(z.string()).optional(),
|
|
11
|
+
preSharedKey: z.string().optional(),
|
|
12
|
+
keepAlive: z.number().int().nonnegative().optional(),
|
|
13
|
+
})
|
|
14
|
+
.passthrough();
|
|
15
|
+
export const wireguardInbound = z
|
|
16
|
+
.object({
|
|
17
|
+
secretKey: z.string().min(1),
|
|
18
|
+
peers: z.array(peer).min(1),
|
|
19
|
+
mtu: z.number().int().positive().optional(),
|
|
20
|
+
kernelMode: z.boolean().optional(),
|
|
21
|
+
})
|
|
22
|
+
.passthrough();
|
|
23
|
+
export const wireguardOutbound = z
|
|
24
|
+
.object({
|
|
25
|
+
secretKey: z.string().min(1),
|
|
26
|
+
address: z.array(z.string()).optional(),
|
|
27
|
+
peers: z.array(peer).min(1),
|
|
28
|
+
mtu: z.number().int().positive().optional(),
|
|
29
|
+
workers: z.number().int().nonnegative().optional(),
|
|
30
|
+
domainStrategy: z.string().optional(),
|
|
31
|
+
reserved: z.array(z.number().int()).optional(),
|
|
32
|
+
})
|
|
33
|
+
.passthrough();
|
|
34
|
+
//# sourceMappingURL=wireguard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireguard.js","sourceRoot":"","sources":["../../../src/schemas/protocols/wireguard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,IAAI,GAAG,CAAC;KACX,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC1C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CACrD,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAC/B,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACvC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAClD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Security registry.
|
|
3
|
+
*
|
|
4
|
+
* Maps streamSettings.security → schema for the matching settings block.
|
|
5
|
+
*/
|
|
6
|
+
import { tlsSettings } from "./tls.js";
|
|
7
|
+
import { realitySettings } from "./reality.js";
|
|
8
|
+
export const securitySpecs = [
|
|
9
|
+
{ security: "tls", settingsKey: "tlsSettings", schema: tlsSettings },
|
|
10
|
+
{ security: "reality", settingsKey: "realitySettings", schema: realitySettings },
|
|
11
|
+
];
|
|
12
|
+
export const securityByName = Object.fromEntries(securitySpecs.map((s) => [s.security, s]));
|
|
13
|
+
export const allSecuritySettingsKeys = new Set(securitySpecs.map((s) => s.settingsKey));
|
|
14
|
+
export { tlsFingerprints, alpnValues } from "./tls.js";
|
|
15
|
+
export { xtlsFlowValues } from "./xtls.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/security/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQ/C,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE;IACpE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,EAAE;CACjF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAiC,MAAM,CAAC,WAAW,CAC5E,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAC1C,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAExF,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* REALITY streamSettings.realitySettings.
|
|
3
|
+
* Source: docs/en/config/transport.md
|
|
4
|
+
*
|
|
5
|
+
* Validates field shape; semantic checks (key length, hex shortIds, target
|
|
6
|
+
* grammar) are also enforced as separate lint rules so they show up as
|
|
7
|
+
* structured issues with explicit rule ids.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { tlsFingerprints } from "./tls.js";
|
|
11
|
+
const base64url43 = z
|
|
12
|
+
.string()
|
|
13
|
+
.regex(/^[A-Za-z0-9_-]{43}$/, "REALITY key must be 43 base64url chars (no padding)");
|
|
14
|
+
const shortIdHex = z
|
|
15
|
+
.string()
|
|
16
|
+
.regex(/^([0-9a-fA-F]{2}){0,8}$/, "REALITY shortId must be hex, even length 0..16");
|
|
17
|
+
export const realitySettings = z
|
|
18
|
+
.object({
|
|
19
|
+
show: z.boolean().optional(),
|
|
20
|
+
target: z.string().optional(),
|
|
21
|
+
dest: z.string().optional(),
|
|
22
|
+
xver: z.number().int().nonnegative().optional(),
|
|
23
|
+
serverNames: z.array(z.string().min(1)).min(1).optional(),
|
|
24
|
+
privateKey: base64url43.optional(),
|
|
25
|
+
publicKey: base64url43.optional(),
|
|
26
|
+
minClientVer: z.string().optional(),
|
|
27
|
+
maxClientVer: z.string().optional(),
|
|
28
|
+
maxTimeDiff: z.number().int().nonnegative().optional(),
|
|
29
|
+
shortIds: z.array(shortIdHex).optional(),
|
|
30
|
+
spiderX: z.string().optional(),
|
|
31
|
+
fingerprint: z.enum(tlsFingerprints).optional(),
|
|
32
|
+
serverName: z.string().optional(),
|
|
33
|
+
})
|
|
34
|
+
.passthrough();
|
|
35
|
+
//# sourceMappingURL=reality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reality.js","sourceRoot":"","sources":["../../../src/schemas/security/reality.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,EAAE;KACR,KAAK,CAAC,qBAAqB,EAAE,qDAAqD,CAAC,CAAC;AAEvF,MAAM,UAAU,GAAG,CAAC;KACjB,MAAM,EAAE;KACR,KAAK,CACJ,yBAAyB,EACzB,gDAAgD,CACjD,CAAC;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC/C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzD,UAAU,EAAE,WAAW,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,WAAW,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACtD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE;IACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* TLS streamSettings.tlsSettings.
|
|
3
|
+
* Source: docs/en/config/transport.md (security section)
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export const tlsFingerprints = [
|
|
7
|
+
"chrome",
|
|
8
|
+
"firefox",
|
|
9
|
+
"safari",
|
|
10
|
+
"ios",
|
|
11
|
+
"android",
|
|
12
|
+
"edge",
|
|
13
|
+
"360",
|
|
14
|
+
"qq",
|
|
15
|
+
"random",
|
|
16
|
+
"randomized",
|
|
17
|
+
"unsafe",
|
|
18
|
+
];
|
|
19
|
+
export const alpnValues = ["h2", "http/1.1", "h3"];
|
|
20
|
+
const certificate = z
|
|
21
|
+
.object({
|
|
22
|
+
usage: z.enum(["encipherment", "verify", "issue"]).optional(),
|
|
23
|
+
certificateFile: z.string().optional(),
|
|
24
|
+
keyFile: z.string().optional(),
|
|
25
|
+
certificate: z.array(z.string()).optional(),
|
|
26
|
+
key: z.array(z.string()).optional(),
|
|
27
|
+
})
|
|
28
|
+
.passthrough();
|
|
29
|
+
export const tlsSettings = z
|
|
30
|
+
.object({
|
|
31
|
+
serverName: z.string().optional(),
|
|
32
|
+
rejectUnknownSni: z.boolean().optional(),
|
|
33
|
+
allowInsecure: z.boolean().optional(),
|
|
34
|
+
alpn: z.array(z.enum(alpnValues)).optional(),
|
|
35
|
+
minVersion: z.string().optional(),
|
|
36
|
+
maxVersion: z.string().optional(),
|
|
37
|
+
cipherSuites: z.string().optional(),
|
|
38
|
+
fingerprint: z.enum(tlsFingerprints).optional(),
|
|
39
|
+
certificates: z.array(certificate).optional(),
|
|
40
|
+
disableSystemRoot: z.boolean().optional(),
|
|
41
|
+
enableSessionResumption: z.boolean().optional(),
|
|
42
|
+
pinnedPeerCertificateChainSha256: z.array(z.string()).optional(),
|
|
43
|
+
masterKeyLog: z.string().optional(),
|
|
44
|
+
})
|
|
45
|
+
.passthrough();
|
|
46
|
+
//# sourceMappingURL=tls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tls.js","sourceRoot":"","sources":["../../../src/schemas/security/tls.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,KAAK;IACL,SAAS;IACT,MAAM;IACN,KAAK;IACL,IAAI;IACJ,QAAQ;IACR,YAAY;IACZ,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAU,CAAC;AAE5D,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACpC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACxC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACrC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE;IAC/C,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,QAAQ,EAAE;IAC7C,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACzC,uBAAuB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/C,gCAAgC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAChE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* XTLS flow values + helper guards.
|
|
3
|
+
* Source: docs/en/config/features/xtls.md
|
|
4
|
+
*
|
|
5
|
+
* The flow lives on the per-client/user object inside settings, not
|
|
6
|
+
* inside streamSettings. Schema is just the enum; semantic compatibility
|
|
7
|
+
* (vision requires raw + tls/reality) lives in lint rules.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
export const xtlsFlowValues = [
|
|
11
|
+
"",
|
|
12
|
+
"none",
|
|
13
|
+
"xtls-rprx-vision",
|
|
14
|
+
"xtls-rprx-vision-udp443",
|
|
15
|
+
];
|
|
16
|
+
export const xtlsFlow = z.enum(xtlsFlowValues);
|
|
17
|
+
//# sourceMappingURL=xtls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xtls.js","sourceRoot":"","sources":["../../../src/schemas/security/xtls.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,EAAE;IACF,MAAM;IACN,kBAAkB;IAClB,yBAAyB;CACjB,CAAC;AAEX,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* gRPC transport.
|
|
3
|
+
* Source: docs/en/config/transports/grpc.md
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export const grpcSettings = z
|
|
7
|
+
.object({
|
|
8
|
+
serviceName: z.string().min(1),
|
|
9
|
+
multiMode: z.boolean().optional(),
|
|
10
|
+
idle_timeout: z.number().int().nonnegative().optional(),
|
|
11
|
+
health_check_timeout: z.number().int().nonnegative().optional(),
|
|
12
|
+
permit_without_stream: z.boolean().optional(),
|
|
13
|
+
initial_windows_size: z.number().int().nonnegative().optional(),
|
|
14
|
+
user_agent: z.string().optional(),
|
|
15
|
+
authority: z.string().optional(),
|
|
16
|
+
})
|
|
17
|
+
.passthrough();
|
|
18
|
+
//# sourceMappingURL=grpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grpc.js","sourceRoot":"","sources":["../../../src/schemas/transports/grpc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACjC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACvD,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC/D,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7C,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC/D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* HTTPUpgrade transport.
|
|
3
|
+
* Source: docs/en/config/transports/httpupgrade.md
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export const httpUpgradeSettings = z
|
|
7
|
+
.object({
|
|
8
|
+
path: z.string().optional(),
|
|
9
|
+
host: z.string().optional(),
|
|
10
|
+
headers: z.record(z.string()).optional(),
|
|
11
|
+
acceptProxyProtocol: z.boolean().optional(),
|
|
12
|
+
})
|
|
13
|
+
.passthrough();
|
|
14
|
+
//# sourceMappingURL=httpupgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpupgrade.js","sourceRoot":"","sources":["../../../src/schemas/transports/httpupgrade.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC;KACjC,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Hysteria transport (rare — usually used as a protocol).
|
|
3
|
+
* Source: docs/en/config/transports/hysteria.md
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export const hysteriaTransportSettings = z
|
|
7
|
+
.object({
|
|
8
|
+
password: z.string().optional(),
|
|
9
|
+
security: z
|
|
10
|
+
.object({
|
|
11
|
+
type: z.string().optional(),
|
|
12
|
+
})
|
|
13
|
+
.passthrough()
|
|
14
|
+
.optional(),
|
|
15
|
+
congestion: z
|
|
16
|
+
.object({
|
|
17
|
+
type: z.string().optional(),
|
|
18
|
+
up_mbps: z.number().int().nonnegative().optional(),
|
|
19
|
+
down_mbps: z.number().int().nonnegative().optional(),
|
|
20
|
+
})
|
|
21
|
+
.passthrough()
|
|
22
|
+
.optional(),
|
|
23
|
+
})
|
|
24
|
+
.passthrough();
|
|
25
|
+
//# sourceMappingURL=hysteria.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hysteria.js","sourceRoot":"","sources":["../../../src/schemas/transports/hysteria.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC5B,CAAC;SACD,WAAW,EAAE;SACb,QAAQ,EAAE;IACb,UAAU,EAAE,CAAC;SACV,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QAClD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;KACrD,CAAC;SACD,WAAW,EAAE;SACb,QAAQ,EAAE;CACd,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Transport registry.
|
|
3
|
+
*
|
|
4
|
+
* Maps streamSettings.network → schema for the corresponding *Settings block.
|
|
5
|
+
* Tabular form so the validator can both:
|
|
6
|
+
* 1. validate the *Settings shape, and
|
|
7
|
+
* 2. detect a mismatch (network=ws but xhttpSettings present, etc).
|
|
8
|
+
*/
|
|
9
|
+
import { rawSettings } from "./raw.js";
|
|
10
|
+
import { xhttpSettings } from "./xhttp.js";
|
|
11
|
+
import { grpcSettings } from "./grpc.js";
|
|
12
|
+
import { wsSettings } from "./websocket.js";
|
|
13
|
+
import { mkcpSettings } from "./mkcp.js";
|
|
14
|
+
import { httpUpgradeSettings } from "./httpupgrade.js";
|
|
15
|
+
import { hysteriaTransportSettings } from "./hysteria.js";
|
|
16
|
+
export const transportSpecs = [
|
|
17
|
+
{ network: "raw", settingsKey: "rawSettings", schema: rawSettings },
|
|
18
|
+
{ network: "tcp", settingsKey: "tcpSettings", schema: rawSettings },
|
|
19
|
+
{ network: "xhttp", settingsKey: "xhttpSettings", schema: xhttpSettings },
|
|
20
|
+
{ network: "splithttp", settingsKey: "splithttpSettings", schema: xhttpSettings },
|
|
21
|
+
{ network: "grpc", settingsKey: "grpcSettings", schema: grpcSettings },
|
|
22
|
+
{ network: "ws", settingsKey: "wsSettings", schema: wsSettings },
|
|
23
|
+
{ network: "websocket", settingsKey: "wsSettings", schema: wsSettings },
|
|
24
|
+
{ network: "kcp", settingsKey: "kcpSettings", schema: mkcpSettings },
|
|
25
|
+
{ network: "mkcp", settingsKey: "kcpSettings", schema: mkcpSettings },
|
|
26
|
+
{ network: "httpupgrade", settingsKey: "httpupgradeSettings", schema: httpUpgradeSettings },
|
|
27
|
+
{ network: "hysteria", settingsKey: "hysteriaSettings", schema: hysteriaTransportSettings },
|
|
28
|
+
];
|
|
29
|
+
export const transportByNetwork = Object.fromEntries(transportSpecs.map((t) => [t.network, t]));
|
|
30
|
+
/* All known *Settings keys, used to flag cross-network leftovers. */
|
|
31
|
+
export const allSettingsKeys = new Set(transportSpecs.map((t) => t.settingsKey));
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schemas/transports/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAS1D,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE;IACnE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,WAAW,EAAE;IACnE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE;IACzE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,aAAa,EAAE;IACjF,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE;IACtE,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE;IAChE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE;IACvE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE;IACpE,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE;IACrE,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,EAAE,mBAAmB,EAAE;IAC3F,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,EAAE,yBAAyB,EAAE;CAC5F,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAkC,MAAM,CAAC,WAAW,CACjF,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAC1C,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* mKCP transport.
|
|
3
|
+
* Source: docs/en/config/transports/mkcp.md
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
const headerObj = z
|
|
7
|
+
.object({
|
|
8
|
+
type: z
|
|
9
|
+
.enum([
|
|
10
|
+
"none",
|
|
11
|
+
"srtp",
|
|
12
|
+
"utp",
|
|
13
|
+
"wechat-video",
|
|
14
|
+
"dtls",
|
|
15
|
+
"wireguard",
|
|
16
|
+
"dns",
|
|
17
|
+
])
|
|
18
|
+
.optional(),
|
|
19
|
+
})
|
|
20
|
+
.passthrough();
|
|
21
|
+
export const mkcpSettings = z
|
|
22
|
+
.object({
|
|
23
|
+
mtu: z.number().int().min(576).max(1460).optional(),
|
|
24
|
+
tti: z.number().int().min(10).max(100).optional(),
|
|
25
|
+
uplinkCapacity: z.number().int().nonnegative().optional(),
|
|
26
|
+
downlinkCapacity: z.number().int().nonnegative().optional(),
|
|
27
|
+
congestion: z.boolean().optional(),
|
|
28
|
+
readBufferSize: z.number().int().nonnegative().optional(),
|
|
29
|
+
writeBufferSize: z.number().int().nonnegative().optional(),
|
|
30
|
+
header: headerObj.optional(),
|
|
31
|
+
seed: z.string().optional(),
|
|
32
|
+
})
|
|
33
|
+
.passthrough();
|
|
34
|
+
//# sourceMappingURL=mkcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mkcp.js","sourceRoot":"","sources":["../../../src/schemas/transports/mkcp.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC;QACJ,MAAM;QACN,MAAM;QACN,KAAK;QACL,cAAc;QACd,MAAM;QACN,WAAW;QACX,KAAK;KACN,CAAC;SACD,QAAQ,EAAE;CACd,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;IACnD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACjD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACzD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC3D,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAClC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACzD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC1D,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Raw / TCP transport (streamSettings.network = "raw" or "tcp").
|
|
3
|
+
* Source: docs/en/config/transports/raw.md, transports/tcp.md
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
const headerObj = z
|
|
7
|
+
.object({
|
|
8
|
+
type: z.enum(["none", "http"]).optional(),
|
|
9
|
+
request: z.unknown().optional(),
|
|
10
|
+
response: z.unknown().optional(),
|
|
11
|
+
})
|
|
12
|
+
.passthrough();
|
|
13
|
+
export const rawSettings = z
|
|
14
|
+
.object({
|
|
15
|
+
acceptProxyProtocol: z.boolean().optional(),
|
|
16
|
+
header: headerObj.optional(),
|
|
17
|
+
})
|
|
18
|
+
.passthrough();
|
|
19
|
+
//# sourceMappingURL=raw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"raw.js","sourceRoot":"","sources":["../../../src/schemas/transports/raw.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,MAAM,EAAE,SAAS,CAAC,QAAQ,EAAE;CAC7B,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* WebSocket transport.
|
|
3
|
+
* Source: docs/en/config/transports/websocket.md
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
export const wsSettings = z
|
|
7
|
+
.object({
|
|
8
|
+
path: z.string().optional(),
|
|
9
|
+
host: z.string().optional(),
|
|
10
|
+
headers: z.record(z.string()).optional(),
|
|
11
|
+
acceptProxyProtocol: z.boolean().optional(),
|
|
12
|
+
heartbeatPeriod: z.number().int().nonnegative().optional(),
|
|
13
|
+
})
|
|
14
|
+
.passthrough();
|
|
15
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/schemas/transports/websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC;KACxB,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC3C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;CAC3D,CAAC;KACD,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* XHTTP transport.
|
|
3
|
+
* Source: docs/en/config/transports/xhttp.md (stub) + Xray-core/discussions/4113
|
|
4
|
+
*
|
|
5
|
+
* The official .md is a stub linking to the discussion. Field set is encoded
|
|
6
|
+
* here from the discussion + observed configs in the wild.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
const xmux = z
|
|
10
|
+
.object({
|
|
11
|
+
maxConcurrency: z.union([z.number().int(), z.string()]).optional(),
|
|
12
|
+
maxConnections: z.union([z.number().int(), z.string()]).optional(),
|
|
13
|
+
cMaxReuseTimes: z.union([z.number().int(), z.string()]).optional(),
|
|
14
|
+
hMaxRequestTimes: z.union([z.number().int(), z.string()]).optional(),
|
|
15
|
+
hMaxReusableSecs: z.union([z.number().int(), z.string()]).optional(),
|
|
16
|
+
hKeepAlivePeriod: z.union([z.number().int(), z.string()]).optional(),
|
|
17
|
+
})
|
|
18
|
+
.passthrough();
|
|
19
|
+
export const xhttpSettings = z
|
|
20
|
+
.object({
|
|
21
|
+
path: z.string().optional(),
|
|
22
|
+
host: z.string().optional(),
|
|
23
|
+
mode: z.enum(["auto", "packet-up", "stream-up", "stream-one"]).optional(),
|
|
24
|
+
extra: z.unknown().optional(),
|
|
25
|
+
headers: z.record(z.string()).optional(),
|
|
26
|
+
xmux: xmux.optional(),
|
|
27
|
+
noGRPCHeader: z.boolean().optional(),
|
|
28
|
+
xPaddingBytes: z.union([z.number().int(), z.string()]).optional(),
|
|
29
|
+
scMaxEachPostBytes: z.union([z.number().int(), z.string()]).optional(),
|
|
30
|
+
scMinPostsIntervalMs: z.union([z.number().int(), z.string()]).optional(),
|
|
31
|
+
scStreamUpServerSecs: z.union([z.number().int(), z.string()]).optional(),
|
|
32
|
+
})
|
|
33
|
+
.passthrough();
|
|
34
|
+
//# sourceMappingURL=xhttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xhttp.js","sourceRoot":"","sources":["../../../src/schemas/transports/xhttp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,IAAI,GAAG,CAAC;KACX,MAAM,CAAC;IACN,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClE,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClE,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpE,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrE,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;IACrB,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACpC,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjE,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtE,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxE,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;CACzE,CAAC;KACD,WAAW,EAAE,CAAC"}
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tiny full-text search over cached docs.
|
|
3
|
+
*
|
|
4
|
+
* Approach: tokenise both query and docs, score by:
|
|
5
|
+
* - exact phrase hits in body ×10
|
|
6
|
+
* - exact phrase hit in title ×25
|
|
7
|
+
* - per-token frequency in body ×1
|
|
8
|
+
* - per-token hit in title ×5
|
|
9
|
+
* No stemming, no IDF — the corpus is small (~50 docs) and the query is
|
|
10
|
+
* usually 1-3 keywords. Returns top N hits with snippets.
|
|
11
|
+
*/
|
|
12
|
+
import { readAllTopics } from "./state.js";
|
|
13
|
+
import { snippet } from "./utils.js";
|
|
14
|
+
function tokenise(s) {
|
|
15
|
+
return s
|
|
16
|
+
.toLowerCase()
|
|
17
|
+
.split(/[^a-z0-9_]+/)
|
|
18
|
+
.filter((t) => t.length >= 2);
|
|
19
|
+
}
|
|
20
|
+
function scoreTopic(topic, query, tokens) {
|
|
21
|
+
const titleLower = topic.title.toLowerCase();
|
|
22
|
+
const bodyLower = topic.markdown.toLowerCase();
|
|
23
|
+
const phrase = query.trim().toLowerCase();
|
|
24
|
+
let score = 0;
|
|
25
|
+
if (phrase.length >= 2) {
|
|
26
|
+
if (titleLower.includes(phrase))
|
|
27
|
+
score += 25;
|
|
28
|
+
/* count phrase occurrences in body, capped at 5 to avoid runaway. */
|
|
29
|
+
let from = 0;
|
|
30
|
+
let phraseHits = 0;
|
|
31
|
+
while (phraseHits < 5) {
|
|
32
|
+
const i = bodyLower.indexOf(phrase, from);
|
|
33
|
+
if (i < 0)
|
|
34
|
+
break;
|
|
35
|
+
phraseHits++;
|
|
36
|
+
from = i + phrase.length;
|
|
37
|
+
}
|
|
38
|
+
score += phraseHits * 10;
|
|
39
|
+
}
|
|
40
|
+
for (const t of tokens) {
|
|
41
|
+
if (titleLower.includes(t))
|
|
42
|
+
score += 5;
|
|
43
|
+
/* token frequency in body. */
|
|
44
|
+
let from = 0;
|
|
45
|
+
let hits = 0;
|
|
46
|
+
while (hits < 50) {
|
|
47
|
+
const i = bodyLower.indexOf(t, from);
|
|
48
|
+
if (i < 0)
|
|
49
|
+
break;
|
|
50
|
+
hits++;
|
|
51
|
+
from = i + t.length;
|
|
52
|
+
}
|
|
53
|
+
score += hits;
|
|
54
|
+
}
|
|
55
|
+
return score;
|
|
56
|
+
}
|
|
57
|
+
export async function search(query, maxResults = 10) {
|
|
58
|
+
const tokens = tokenise(query);
|
|
59
|
+
if (tokens.length === 0 && query.trim().length < 2)
|
|
60
|
+
return [];
|
|
61
|
+
const topics = await readAllTopics();
|
|
62
|
+
const scored = [];
|
|
63
|
+
for (const t of topics) {
|
|
64
|
+
const s = scoreTopic(t, query, tokens);
|
|
65
|
+
if (s <= 0)
|
|
66
|
+
continue;
|
|
67
|
+
scored.push({
|
|
68
|
+
slug: t.slug,
|
|
69
|
+
title: t.title,
|
|
70
|
+
category: t.category,
|
|
71
|
+
score: s,
|
|
72
|
+
snippet: snippet(t.markdown, query, 240),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
scored.sort((a, b) => b.score - a.score);
|
|
76
|
+
return scored.slice(0, Math.max(1, maxResults));
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
package/dist/state.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Global server state — process-wide, in-memory.
|
|
3
|
+
*
|
|
4
|
+
* Resolves the on-disk docs directory next to the package, lazily loads
|
|
5
|
+
* the bundled `_index.json`, and caches Topic bodies after first read.
|
|
6
|
+
*
|
|
7
|
+
* This is the only module that knows the actual filesystem layout.
|
|
8
|
+
*/
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { promises as fs } from "node:fs";
|
|
12
|
+
import { parseFrontmatter } from "./utils.js";
|
|
13
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
14
|
+
/* dist/state.js → ../data/docs/ (same layout when running from src via tsx). */
|
|
15
|
+
export const DOCS_DIR = path.resolve(here, "..", "data", "docs");
|
|
16
|
+
export const INDEX_FILE = path.join(DOCS_DIR, "_index.json");
|
|
17
|
+
const state = {
|
|
18
|
+
index: null,
|
|
19
|
+
bodyCache: new Map(),
|
|
20
|
+
};
|
|
21
|
+
export async function loadIndex(forceReload = false) {
|
|
22
|
+
if (state.index && !forceReload)
|
|
23
|
+
return state.index;
|
|
24
|
+
try {
|
|
25
|
+
const raw = await fs.readFile(INDEX_FILE, "utf8");
|
|
26
|
+
const parsed = JSON.parse(raw);
|
|
27
|
+
state.index = Array.isArray(parsed) ? parsed : [];
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* Bundle may be absent during first-time dev before fetch-docs ran. */
|
|
31
|
+
state.index = [];
|
|
32
|
+
}
|
|
33
|
+
return state.index;
|
|
34
|
+
}
|
|
35
|
+
export async function saveIndex(index) {
|
|
36
|
+
await fs.mkdir(DOCS_DIR, { recursive: true });
|
|
37
|
+
await fs.writeFile(INDEX_FILE, JSON.stringify(index, null, 2), "utf8");
|
|
38
|
+
state.index = index;
|
|
39
|
+
}
|
|
40
|
+
export async function readTopic(slug) {
|
|
41
|
+
const cached = state.bodyCache.get(slug);
|
|
42
|
+
if (cached)
|
|
43
|
+
return cached;
|
|
44
|
+
const index = await loadIndex();
|
|
45
|
+
const meta = index.find((m) => m.slug === slug);
|
|
46
|
+
if (!meta)
|
|
47
|
+
return null;
|
|
48
|
+
const filePath = path.join(DOCS_DIR, meta.file);
|
|
49
|
+
let raw;
|
|
50
|
+
try {
|
|
51
|
+
raw = await fs.readFile(filePath, "utf8");
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
const { meta: fm, body } = parseFrontmatter(raw);
|
|
57
|
+
const topic = {
|
|
58
|
+
...meta,
|
|
59
|
+
title: fm.title || meta.title,
|
|
60
|
+
markdown: body,
|
|
61
|
+
};
|
|
62
|
+
state.bodyCache.set(slug, topic);
|
|
63
|
+
return topic;
|
|
64
|
+
}
|
|
65
|
+
export async function writeTopic(topic, frontmatter) {
|
|
66
|
+
await fs.mkdir(DOCS_DIR, { recursive: true });
|
|
67
|
+
const filePath = path.join(DOCS_DIR, topic.file);
|
|
68
|
+
await fs.writeFile(filePath, frontmatter + topic.markdown + "\n", "utf8");
|
|
69
|
+
state.bodyCache.set(topic.slug, topic);
|
|
70
|
+
}
|
|
71
|
+
export function dropCache(slug) {
|
|
72
|
+
if (slug)
|
|
73
|
+
state.bodyCache.delete(slug);
|
|
74
|
+
else
|
|
75
|
+
state.bodyCache.clear();
|
|
76
|
+
}
|
|
77
|
+
export async function readAllTopics() {
|
|
78
|
+
const index = await loadIndex();
|
|
79
|
+
const topics = [];
|
|
80
|
+
for (const m of index) {
|
|
81
|
+
const t = await readTopic(m.slug);
|
|
82
|
+
if (t)
|
|
83
|
+
topics.push(t);
|
|
84
|
+
}
|
|
85
|
+
return topics;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=state.js.map
|