频道 文档
版本v0.4.1.0 API1.0.0 测试199 通过

文档

下面每一页都是仓库里的一个文件,官网与 GitHub 读的是同一份源 —— 所以两边不会各说各话。每页都留了原文入口,想拿原始文件随时可以拿。

这里的每一页都是一个文件

下表就是全部文档:左边是仓库里的路径,右边是它变成的页面。重建站点时两边由同一个源渲染,改任何一边都会反映到另一边。

docs/ → 网站

docs/i18n/README_zh-CN.md项目说明
docs/i18n/plugins/README_zh-CN.md插件开发指南
docs/i18n/plugins/CONVENTION_zh-CN.md开发规范
docs/i18n/plugins/MARKET_zh-CN.md发布与发现
turbo-plugin-js/README.md用 JavaScript 写插件
turbo-plugin-js/ARCHITECTURE.mdJS 加载器架构
—清单字段参考
LICENSE开源协议(MIT)
docs/i18n/legal/THIRD-PARTY_zh-CN.md第三方组件与致谢
docs/i18n/legal/PRIVACY_zh-CN.md隐私说明
docs/i18n/legal/TERMS_zh-CN.md使用条款

没有对应语言版本的那几页会退回另一种语言的原文,并在页首说明。

从这三页开始

全部通过三样东西完成:一个依赖、一个配置对象、一次提交。暂停、继续、取消、批量与诊断都在同一个 client 上。

Kotlin
// build.gradle.kts
dependencies {
    implementation("dev.turbodl:turbodl-core:0.4.1.0")
}

// Kotlin
val client = TurboClient(TurboConfig(maxConnectionsPerTask = 16))
val id = client.submit(DownloadRequest(url, File("out.bin")))
val result = client.await(id)
shell
java -jar turbodl-cli-all.jar <url> -o out.bin -c 64
java -jar turbodl-cli-all.jar <url> --json       # NDJSON
java -jar turbodl-cli-all.jar --batch tasks.txt  # one URL per line
turbodl --json · 标准输出
{"type":"start","url":"<url>","output":"out.bin"}
{"type":"timing","stage":"metadata","t_ms":184,"probe_ms":96,"resume":""}
{"type":"progress","state":"downloading","downloaded":222732288,"total":358411469,"percent":62,"speed":19503514,"connections":16,"eta_ms":7020}
{"type":"completed","url":"<url>","file":"out.bin","bytes":358411469,"sha256":"0f3a…"}
{"type":"summary","total":1,"failed":0}

全部配置面

九个字段,全部公开、全部有明确取值域。运行时没有别的可调项 —— 引擎没有隐藏旋钮,也没有打电话回家的默认值。

TurboConfig 的字段

maxConnectionsPerTask16 · 1..256
maxConcurrentTasks3 · 1..64
globalSpeedLimitBytesPerSec0 = unlimited
maxRetries5 · 0..50, per segment
dynamicSegmentationtrue
tailAssist / tailAssistMinBytestrue · 2 MiB
overlapMerge / bufferedSegmentWritefalse · false
minSegmentSize / blockSize64 KiB · 16 MiB
proxy / dns / trustAllCertsDirect · System · Manual · PAC / System · StaticHosts · DoH

取值是 TurboConfig.kt 里的默认值;每一个都能按 client 单独设置。

一份插件清单长什么样

一个插件 = 一个 JAR + 这个文件。参考页列了每个字段的类型、是否必填、以及允许的取值。

turbodl-plugin.json

{
  "manifestVersion": "1.0",
  "id": "parser.example",
  "name": "Example parser",
  "description": "Turns example:// links into download requests.",
  "version": "0.1.0",
  "author": "you",
  "homepage": "https://github.com/you/turbodl-plugin-example",
  "license": "MIT",
  "category": "turbodl-parser",
  "capabilities": [
    "dev.turbodl.cap.parser"
  ],
  "protocols": [
    "example"
  ],
  "turbodl": {
    "apiMajor": 1,
    "requiredApiVersion": "1.0.0"
  },
  "entry": {
    "language": "kotlin",
    "pluginClass": "com.example.ExamplePlugin"
  },
  "extensionPoints": [
    "turbo.linkParser"
  ]
}

与「清单字段参考」那一页用同一个常量渲染,两页不会各说各话。

文档

项目说明

TurboDL 是什么、能做什么、怎么加进项目、API 有哪些 —— 就是仓库里的那篇 README。

插件开发指南

怎么写出一个插件、怎么被加载进来:接口、分类,以及你必须遵守的生命周期。

开发规范

兼容性规则:什么算稳定 API、版本怎么协商、命名怎么定,以及插件不能弯的安全底线。

发布与发现

没有需要注册的中心仓库。插件靠 GitHub topic 加一份清单被发现 —— 这套约定就是全部。

用 JavaScript 写插件

`host`/`plugin` ABI、构成一切的那三个原语,以及脚本被有意禁止做的事情。

JS 加载器架构

加载器为什么长这样:runtime 与 context 的归属、卸载顺序,以及宿主一侧的边界。

清单字段参考

turbodl-plugin.json 的每一个字段 —— 由校验它的那份 JSON Schema 生成。

协议与说明

开源协议(MIT)

MIT 协议,附四条澄清插件是独立作品的追加条款。原文照录,不做概括。

第三方组件与致谢

TurboDL 会连带引入哪些库、各自什么协议,以及哪些项目提供了思路(但没有提供代码)。

隐私说明

用 TurboDL 的时候,哪些数据会离开你的机器;以及那些永远不会离开的东西。

使用条款

责任、担保、第三方插件与名称使用 —— 协议本身不会展开讲的那部分。

架构

这个项目的每个设计问题都由三条规则决定:

  1. core 能独立工作。turbodl-core 是完整引擎、零插件依赖;插件是纯粹的增量。
  2. 内核只是机制。它不认识任何协议 —— 只有生命周期、清理、事件总线、服务注册表、扩展点、版本握手、诊断。
  3. 依赖方向是硬的。runtime → core,绝不反向。