Handle interrupted pairing, artwork retries and revoked access reliably

This commit is contained in:
2026-09-12 21:41:37 +03:00
parent afa771198d
commit c461c26f7f
9 changed files with 411 additions and 46 deletions
+9 -5
View File
@@ -86,14 +86,18 @@ final class BridgeClient {
let (bytes, response) = try await session.bytes(for: request)
guard let response = response as? HTTPURLResponse else { throw BridgeError.message("Нет ответа от ПК.") }
if response.statusCode == 401 { throw BridgeError.unauthorized }
guard (200...299).contains(response.statusCode) else {
throw BridgeError.message("ПК отклонил запрос (HTTP \(response.statusCode)). Проверьте код и состояние агента.")
}
let success = (200...299).contains(response.statusCode)
let bodyLimit = success ? limit : min(limit, 16 * 1024)
var result = Data()
for try await byte in bytes {
guard result.count < limit else { throw BridgeError.message("Ответ ПК слишком большой.") }
guard result.count < bodyLimit else { throw BridgeError.message("Ответ ПК слишком большой.") }
result.append(byte)
}
guard success else {
struct Failure: Decodable { let code: String? }
let code = (try? JSONDecoder().decode(Failure.self, from: result))?.code
throw BridgeError.http(status: response.statusCode, code: code)
}
return result
}
@@ -101,7 +105,7 @@ final class BridgeClient {
let body = try JSONSerialization.data(withJSONObject: ["code": code, "deviceName": "MusicBridge iPhone"])
let response = try JSONDecoder().decode(PairResponse.self, from: await data(request("v1/pair", body: body, authenticated: false)))
guard response.success, let token = response.token, Connection.isFingerprint(token) else {
throw BridgeError.message("Сопряжение отклонено: \(response.code)")
throw BridgeError.http(status: 403, code: response.code)
}
return token
}