Skip to content

Commit 64aa66f

Browse files
committed
fix: recover rejected SABR attestations
1 parent 0b4efe5 commit 64aa66f

2 files changed

Lines changed: 17 additions & 1 deletion

File tree

src/main/kotlin/dev/typetype/server/routes/SabrPlaybackRecovery.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ internal class SabrPlaybackRecovery(private val sessionStore: SabrSessionStore)
1717
sessionStore.invalidatePlaybackInfo(holder.key.videoId)
1818
return RETRY_FRESH_SESSION
1919
}
20-
if (failure.contains("protected no-media")) {
20+
if (
21+
failure.contains("protected no-media") ||
22+
failure.contains("attestation required", ignoreCase = true)
23+
) {
2124
sessionStore.recoverProtectedPlaybackInfo(holder)
2225
return RETRY_FRESH_SESSION
2326
}

src/test/kotlin/dev/typetype/server/routes/SabrPlaybackRecoveryTest.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,17 @@ class SabrPlaybackRecoveryTest {
102102
assertEquals(emptyList<Int>(), recovery.retryVideoItags())
103103
coVerify(exactly = 1) { store.recoverProtectedPlaybackInfo(holder) }
104104
}
105+
106+
@Test
107+
fun `attestation rejection refreshes context and requests fresh session`() = runTest {
108+
val holder = mockk<SabrSessionHolder>()
109+
val store = mockk<SabrSessionStore>()
110+
every { holder.terminalFailure() } returns
111+
"SABR error: SABR attestation required: status=3, policy=true"
112+
every { holder.key } returns SabrSessionKey("video", "user", 140, null, 137, 900_000L)
113+
coEvery { store.recoverProtectedPlaybackInfo(holder) } returns Unit
114+
115+
assertEquals("retry_fresh_session", SabrPlaybackRecovery(store).action(holder))
116+
coVerify(exactly = 1) { store.recoverProtectedPlaybackInfo(holder) }
117+
}
105118
}

0 commit comments

Comments
 (0)