feat(overlay): 内容块级寻址 + 实例逐步拉起 + 骨干选路 + 组密钥加密(序24–㉛ 累积同步)
代码
- 内容分发块级寻址:新增 src/net/relay/content/{chunker,store,runtime,source,peer,crypto}.ts
- 组密钥(C 档)确定性加密:AES-256-GCM,块 id β′ = sha256(密文) 前 32 hex;双 epoch 过渡窗口
- 实例生命周期:三处 teardown() 不再杀实例(local/remote/leased-spawner);启动认领 + TCP 探活判孤儿
- 骨干选路:jitter 选路 + endpoint-target;relay client/server/wire/identity/directory/rendezvous/switcher 调整
- 工作台 src/web/server.ts、src/worker/relay-tunnel.ts 装配与候选链观测
脚本与测试
- scripts/overlay-{probe,keyring,jitter}.cjs 更新
- 探针新增 OBS-21(每连接候选数)/ OBS-22(teardown 静态守卫 + 认领面)/ OBS-23(组密钥加密)
- 新增 test/{orchestrator-teardown,orchestrator-rehydrate,overlay-content,overlay-jitter}.test.mjs;relay 两例更新
文档
- 新增交接单:覆盖网络-序24-内容分发块级寻址 / 序25-实例逐步拉起 / 序26-骨干稳定选路与加密
- INDEX.md、交接单/README.md、skills/dsh-auto-handoff-chain/SKILL.md 同步
验收(零回归,2026-09-18 08:0x 复核)
- npm test 201 tests / 200 pass / 0 fail / 1 skipped
- overlay-failover-drill --scene all --table 12 PASS / 0 SKIP / 0 FAIL
- overlay-probe --table 23 PASS / 0 SKIP / 0 FAIL (rc=0)
This commit is contained in:
1 parent
04776af4b1
commit
09ce76f3af
38 files changed
+9133
-211
No files matched your search
@@ -36,6 +36,18 @@ export interface RelayRendezvousOptions {
|
||||
* 入参同样**逻辑名**(relay 的端点视图按 `network/hostId:port` 建键)。
|
||||
*/
|
||||
online?: (name: string) => boolean
|
||||
/**
|
||||
* **订阅推送**的在线判定(**主路径**,序⑲ presence)。
|
||||
*
|
||||
* 语义与 {@link RelayRendezvousOptions.online} 的关系(D5,"主路径 + 兜底":
|
||||
* * 返回 `true` / `false` ⇒ **以它为准**(订阅新鲜,`/status` 的快照**不再被读**);
|
||||
* * 返回 `undefined` ⇒ **这条不知道** ⇒ 回落到 `online`(= `/status` 快照 / 拨号自判)。
|
||||
*
|
||||
* 🔑 为什么不把两者合成一个:两者的**失败语义不同** —— `online` 的 `false` 可能只是
|
||||
* "快照陈旧",而订阅的 `false` 是 relay 亲口说的"它现在不在"。混在一起会退化成
|
||||
* "一旦订阅可用就再也回不去",回滚链(§7-②)就断了。
|
||||
*/
|
||||
presence?: (name: string) => boolean | undefined
|
||||
}
|
||||
|
||||
export class RelayRendezvous implements Rendezvous {
|
||||
@@ -48,7 +60,13 @@ export class RelayRendezvous implements Rendezvous {
|
||||
}
|
||||
|
||||
async resolve(name: string): Promise<Reachability | undefined> {
|
||||
if (this.opts.online !== undefined && !this.opts.online(name)) return undefined
|
||||
/**
|
||||
* **主路径 = 订阅推送**(序⑲):订阅新鲜时它的答案就是权威答案(relay 亲口说的在线态)。
|
||||
* `undefined` = 订阅没生效 / 这条不在推送范围 ⇒ 才轮到下面的兜底。
|
||||
*/
|
||||
const pushed = this.opts.presence?.(name)
|
||||
const online = pushed !== undefined ? pushed : this.opts.online?.(name)
|
||||
if (online === false) return undefined
|
||||
const address = this.opts.addressOf(name)
|
||||
if (address === undefined) return undefined
|
||||
const { network, hostId } = parseLogicalName(name)
|
||||
|
||||
Reference in new issue
Block a user