AI 辅助用 Rust 重写了一个 subconverter 有感 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
laizenan
V2EX    分享创造

AI 辅助用 Rust 重写了一个 subconverter 有感

  •  
  •   laizenan 188 天前 2792 次点击
    这是一个创建于 188 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为换机场需要给 Clash 加 VLESS 支持,折腾了一下用重写一切的 Rust 重写了 subconverter 。

    过程中试了用 AI (Cursor) 辅助 C++ 转 Rust ,感觉不太行,生成的代码错误不少,还是要自己动手改。感觉 AI 对 Rust 这种 native 语言的帮助远不如 JS/Web ,效率差距可能更大了。

    看原版 C++ 代码时,发现里面功能巨多,很多我根本没用过,感觉不完全是写来自用的,有点像给机场用的,但又很全能,要完全测试都很复杂。

    最大的疑惑是,为啥这套功能要做成 Web API 而不是 CLI ?转换订阅文件这种事,感觉 CLI 更自然。 结果就是,为了兼容这些功能,项目比我一开始只想加个 VLESS 时搞得复杂多了。

    目前自用中,核心接口/sub 对齐功能了。

    GitHub: https://github.com/lonelam/subconverter-rs

    欢迎老哥们试用、吐槽。

    第 1 条附言    181 天前
    更新,踩坑了,cloudflare workers 最多支持 3MB ,rust 的 wasm 产物压缩不到那么小
    第 2 条附言    177 天前
    wasm 版本肝出来了,一键 netlify 白嫖自建,无须服务器,不过目前可以部署 node function 而且还没被墙的只有 netlify 一家:

    @tinytoadd
    @oneisall8955
    @tokuwaka

    https://subconverter-rs.netlify.app/
    13 条回复    2025-04-21 11:31:48 +08:00
    joh
        1
    joh  
       188 天前 via Android
    这套做成 Web API 是为了机场使用方便更新订阅吧。
    tokuwaka
        2
    tokuwaka  
       187 天前
    有 demo 可以看看吗
    0d
        3
    0d  
       187 天前
    感谢 op 的工作。感觉可以把 lib 编成 wasm ,然后写一个静态页面挂着。这样比原版 subconverter 更容易自建一点。
    laizenan
        4
    laizenan  
    OP
       187 天前 via Android
    @tinytoadd 这个听起来不错,我试试看
    itechify
        5
    itechify  
    PRO
       187 天前
    Rust 重写万物 ,马上尝试
    itechify
        6
    itechify  
    PRO
       187 天前
    @tinytoadd #3 这样可以挂在 cloudflare 里面,灰常不错的想法
    w568w
        7
    w568w  
       187 天前
    > 最大的疑惑是,为啥这套功能要做成 Web API 而不是 CLI ?转换订阅文件这种事,感觉 CLI 更自然。

    因为大部分代理前端 App ( Mihomo party 、FlClash )都只支持设置一个订阅 URL ,如果要做转换,自然也应该提供一个 URL 。

    > 感觉可以把 lib 编成 wasm ,然后写一个静态页面挂着
    > 这样可以挂在 cloudflare 里面

    @tinytoadd @oneisall8955

    原版有后端需要部署,主要是为了解决跨域问题吧。这种需求应该没法纯前端来做的。

    至于部署 cloudflare worker/pages 的,这种项目也有了: https://github.com/jwyGithub/sub-convert
    itechify
        8
    itechify  
    PRO
       186 天前
    @w568w #7 我的意思是 Cloudflare 的 Worker/Pages Functions 执行 wasm 。

    转换的入口,也是 http 接口,接口里面执行 wasm
    laizenan
        9
    laizenan  
    OP
       186 天前
    @w568w @oneisall8955 感谢建议,做成 webapp 是可能的,但 CORS 必须有服务端转发,否则限制太大,拉取第三方订阅有困难,让 gemini 帮我调研了一下,有几个选择:1. cloudflare worker 2. vercel 3. render
    其中 1 、2 只能跑 wasm ,3 可以执行原生应用,但应用 0 流量 15min 以后就需要冷启动,可能需要忍受一点延迟。目前看编译到 wasm 比较顺利,但限于原来 cpp 版本的架构,还需要做几个改造:1. tokio 改成单线程模型,2. 文件读取,3. 网络请求转发。
    itechify
        10
    itechify  
    PRO
       186 天前
    @laizenan #9 灰常期待,毕竟 all in cloudflare ,白嫖赛博菩萨,少了很多机器及运维负担。
    曾经搭建 https://github.com/7Sageer/sublink-worker 来转换,但是不太好用
    sanquan
        11
    sanquan  
       186 天前
    sub-store 不行吗?
    laizenan
        12
    laizenan  
    OP
       186 天前
    @sanquan 感谢分享,原项目的部署地址 sub.store 已经废弃了,我写之前没调研到这个项目,subconverter 功能上比 sub-store 多了 ruleset 写入,模板能力,js 脚本执行,更多的控制项,如果我先前看到这个项目的话我可能会考虑从这个项目开始进一步开发。

    但既然现在已经 pure rust 了,就一条道走到黑吧,至少从自部署效率来看,rust 代码和 subconverter 一样,可以快速迁移到路由器、wasm 等环境,而且后续要改新的协议和接口时,rust 会比 js 稳定性强一点,sub.store 和 subconverter 的痛点完全一致:需要一个服务器才能长期部署。
    0d
        13
    0d  
       172 天前
    exciting !

    已 star
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2992 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 00:30 PVG 08:30 LAX 17:30 JFK 20:30
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86