feat: 统一 Commilitia Drop 全客户端命名与分发

This commit is contained in:
2026-07-31 22:56:10 +08:00
parent f7b0f04c9c
commit c480f0d1c2
77 changed files with 861 additions and 263 deletions
+13 -13
View File
@@ -193,7 +193,7 @@ final class EngineController: NSObject
private var webView: WKWebView?
private let downloads = DownloadManager()
// 待发文件暂存:id → 安全作用域 URL(文件选择器选中的文件)。引擎经 cdrop-file://<id>
// 待发文件暂存:id → 安全作用域 URL。引擎经 commilitia-drop-file://<id>
// 回取字节(下方 WKURLSchemeHandler 供给)。
private var outgoing: [String: URL] = [:]
@@ -271,7 +271,7 @@ final class EngineController: NSObject
}
// makeWebView:构建离屏 WebView——注入 __CDROP_BOOT__(device_type:"ios")、注册消息
// 处理器、注册 cdrop-file 自定义 scheme(发送侧给 JS 喂文件字节)。幂等。
// 处理器、注册 commilitia-drop-file 自定义 scheme(发送侧给 JS 喂文件字节)。幂等。
func makeWebView() -> WKWebView
{
if let existing = webView { return existing }
@@ -297,7 +297,7 @@ final class EngineController: NSObject
let cfg = WKWebViewConfiguration()
cfg.userContentController = ucc
cfg.setURLSchemeHandler(self, forURLScheme: "cdrop-file")
cfg.setURLSchemeHandler(self, forURLScheme: "commilitia-drop-file")
// 迁移到 Auth Broker 后引擎自刷走注入的 refresh_token(POST /api/auth/refresh 代理
// broker),不再依赖 cdrop_session cookie,故无需把 URLSession 的 cookie 同步进 WebView。
@@ -672,7 +672,7 @@ final class EngineController: NSObject
webView?.evaluateJavaScript("window.__cdropEngineEvent(\(jsString(name)), \(json));")
}
// sendFile:暂存选中文件、把 cdrop-file://<id> 引用 + 目标设备交给引擎发起传输。
// sendFile:暂存选中文件、把 commilitia-drop-file://<id> 引用 + 目标设备交给引擎发起传输。
func sendFile(to target: String, fileURL: URL)
{
let ref = stageOutgoingFile(fileURL)
@@ -687,7 +687,7 @@ final class EngineController: NSObject
])
}
// Share Extension 经 App Group 收件箱交接来的待发文件(经 cdrop://share 唤起后导入)。
// Share Extension 经 App Group 收件箱交接来的待发文件(经 commilitia-drop://share 唤起后导入)。
// 非空即触发主界面的「选设备发送」弹窗。
var pendingShareFiles: [URL] = []
@@ -730,7 +730,7 @@ final class EngineController: NSObject
}
// 图库选择(#14):PhotosPicker 给的是 PhotosPickerItem,须先 loadTransferable 取字节,再落
// 一个临时文件,才能复用既有 cdrop-file scheme 发送链路(按 Range 读盘、整文件不入内存)。
// 一个临时文件,才能复用既有 commilitia-drop-file scheme 发送链路。
// 返回临时文件 URL(在 temporaryDirectory,系统回收);写盘失败回 nil。
func stagePhotoData(_ data: Data, suggestedName: String) -> URL?
{
@@ -743,18 +743,18 @@ final class EngineController: NSObject
catch { return nil }
}
// 暂存待发文件,返回引擎用的 cdrop-file://<id> 引用。文件选择器给的 URL 是安全作用域
// 暂存待发文件,返回引擎用的 commilitia-drop-file://<id> 引用。
// 资源,需 start...Access 才能读。
private func stageOutgoingFile(_ url: URL) -> String
{
let id = UUID().uuidString
_ = url.startAccessingSecurityScopedResource()
outgoing[id] = url
return "cdrop-file://\(id)"
return "commilitia-drop-file://\(id)"
}
// 发送侧按 [start,end) seek 读暂存的待发文件、回 base64(供 bridgeFileSource 经桥取片)。
// url 形如 cdrop-file://<id>,id 即 stageOutgoingFile 的暂存键。无该文件 / 读失败抛错。
// url 形如 commilitia-drop-file://<id>,id 即 stageOutgoingFile 的暂存键。
fileprivate func readOutgoingSlice(url: String, start: Int, end: Int) throws -> String
{
guard let id = URL(string: url)?.host, let fileURL = outgoing[id]
@@ -787,7 +787,7 @@ final class EngineController: NSObject
return e
}
// 把 cdrop-file://<id> 引用解析回暂存文件的沙盒绝对路径(Go 据此直接读盘发送)。安全作用域
// 把 commilitia-drop-file://<id> 引用解析回暂存文件的沙盒绝对路径。
// 访问已在 stageOutgoingFile 开启、持续到 reset,故同进程的 Go 可直接 os.Open 该路径。无对应
// 暂存项返回空串。
private func resolveOutgoingPath(_ ref: String) -> String
@@ -871,7 +871,7 @@ extension EngineController: WKScriptMessageHandler
end: Self.intOf(payload["end"]))
resolve(id: id, ok: true, value: b64)
case "p2pStartOutgoing":
// 发起原生发送:filePath 为 cdrop-file://<id>,解析回沙盒绝对路径交引擎直接读盘。引擎
// 发起原生发送:filePath 为 commilitia-drop-file://<id>,解析回沙盒绝对路径。
// 调用立即返回(libwebrtc 异步),completion 在 offer 已铸+发出后回,经 resolveOnMain 回交。
let engine = nativeTransferEngine()
let path = resolveOutgoingPath(payload["filePath"] as? String ?? "")
@@ -1133,11 +1133,11 @@ extension EngineController: WKScriptMessageHandler
}
}
// MARK: - 发送侧自定义 scheme(cdrop-file)
// MARK: - 发送侧自定义 scheme(commilitia-drop-file)
extension EngineController: WKURLSchemeHandler
{
// 发送侧:原生把暂存的待发文件经 cdrop-file://<id> 喂给引擎(JS fetch 它得到字节,
// 发送侧:原生把暂存文件经 commilitia-drop-file://<id> 喂给引擎。
// 见 PLAN §2 / R-iOS-4)。引擎(rangeSource)按块带 `Range` 头拉取——这里 seek 文件
// 仅读该区间、回 206 Partial Content,整文件永不入内存,避大文件 jetsam。无 Range
// 头时回退整文件(防御路径;引擎正常总带 Range)。
@@ -6,7 +6,7 @@ import WebRTC
// 集成(WebKit/libwebrtc 才集成),真机确证架构性不可靠(见 desktop/NATIVE-TRANSFER.md §7)。
//
// 线协议与 desktop/engine(pion)及 web/src/features/transfer/p2p.ts 逐字节一致,故可与桌面 pion
// 引擎、浏览器 / 旧 iOS 的 JS 引擎互通:DataChannel "cdrop-file"(ordered),控制帧 meta/done/ack 走
// 引擎、浏览器 / 旧 iOS 的 JS 引擎互通:DataChannel "commilitia-drop-file"(ordered),控制帧
// 文本帧、文件分片走二进制帧(64KB),信令 payload 形如 {type, sdp?, candidate?}。本类是 session.go +
// engine.go 的忠实 Swift 端口——逻辑、水位、ack 语义、收尾顺序一一对应。
//
@@ -39,7 +39,7 @@ protocol P2PEngineDelegate: AnyObject
private enum Wire
{
static let channelName = "cdrop-file"
static let channelName = "commilitia-drop-file"
static let chunkSize = 64 * 1024
static let highWatermark: UInt64 = 16 * 1024 * 1024
static let lowWatermark: UInt64 = 4 * 1024 * 1024
@@ -94,7 +94,7 @@ final class LibWebRtcEngine
}
// StartOutgoing:建 PeerConnection + DataChannel,发 offer,通道就绪后流式发出 filePath。
// filePath 为本机绝对路径(原生从 cdrop-file://<id> 解析得到)。completion 在 offer 已铸并
// filePath 为本机绝对路径(原生从 commilitia-drop-file://<id> 解析得到)。completion 在 offer 已铸并
// setLocalDescription 完成后回(或出错时回错误),对齐 JS 侧信令链 seed 语义(见 p2pIos.ts chain)。
func startOutgoing(sessionId: String, peerName: String, filePath: String,
iceServersJSON: String, completion: @escaping (Error?) -> Void)