# Cursor 点对点传文件：用 WebRTC DataChannel 分块传输并核对接收文件

两标签页原生WebRTC DataChannel已传输512KiB并核对接收端完整SHA；关闭通道后半份输入不标完成，仅验证本机loopback。

## 环境

- 普通同源本机信令用 ?role=receiver 与发送页。作者VPN环境验证额外启用 ?loopback=1、--allow-loopback-in-peer-connection、--disable-features=WebRtcHideLocalIpsWithMdns；它是仅本机候选改写，不可用于公网。

## 启动

~~~sh
cd reference
python3 -m http.server 8787
~~~

## 七步操作

1. 打开收发标签页

使用同源两个浏览器标签页，分别作为发送端和接收端。输入是固定公式生成的512KiB二进制，不读取私人文件，也不上传外部存储。

2. 交换本机信令

本机教学信令通过 BroadcastChannel 交换 SDP 和 ICE。它只适合同源本地标签页；生产中的跨设备信令服务需要另行设计。

3. 连接DataChannel

创建 ordered RTCDataChannel，并等待真正的 open 事件再发送。作者环境使用本机 loopback 候选与允许loopback的Chromium参数，避免VPN虚拟网卡影响，不连接公网 STUN/TURN。

4. 分块控制背压

每次发送16KiB，检查 bufferedAmount，超过阈值等待 bufferedamountlow。进度表示已交给通道的字节，不能直接代表接收端完整收到。

5. 中途关闭通道

故意在传输前段关闭通道，接收端记录已收字节和预期长度，并保持 interrupted。只有完整结束标记与哈希核验都满足才允许完成。

6. 校验接收哈希

接收端拼接实际 ArrayBuffer，核对总长524288及SHA256，再通过通道回 ACK。发送端与接收端记录的完整哈希必须相等。

7. 明确网络范围

阅读两端原生运行结果与源码。此练习证明本机DataChannel二进制传输和完整性，不代表已经解决公网NAT、TURN、移动设备断网恢复，也未运行Cursor账号。

## 目录身份

- starter：待完成的任务接口与原创输入，TODO不是已完成实现。
- reference：作者原生完成参考和实际产物。records.json/browser-result.json为本地实测记录，不是AI助手回复。
- TASK.md：可交给相应AI助手的原始任务合同。该助手账号生成会话未运行。

## 依赖与许可

原创教学代码以MIT许可提供。第三方项目、模型及浏览器遵循其自身许可。第三方依赖由本地安装获取，不包含node_modules、模型权重、WASM运行时、数据库、缓存或凭据。

## 官方依据

- https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Using_data_channels
