Skip to content

Commit 480c06d

Browse files
committed
fix(onramp): prevent timing events from resuming watchdog during payment auth
Add watchdogPaused flag so that events arriving after pending_payment_auth (e.g. timing.gpay_button_clicked) continue to pause the watchdog instead of firing a heartbeat that restarts the 15s inter-event timer. Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent e3ceab2 commit 480c06d

2 files changed

Lines changed: 30 additions & 6 deletions

File tree

apps/flipcash/shared/onramp/coinbase/src/main/kotlin/com/flipcash/app/onramp/internal/CoinbaseOnRampEventHandler.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,11 @@ internal class CoinbaseOnRampEventHandler(
141141
private val onPauseWatchdog: () -> Unit = {},
142142
) {
143143
private var errorReported = false
144+
private var watchdogPaused = false
144145
fun handleEvent(eventJson: String) {
145146
trace(tag = "CoinbaseOnRamp", message = eventJson)
146147
try {
147148
val obj = JSONObject(eventJson)
148-
var pauseWatchdog = false
149149
when (val eventName = obj.optString("eventName")) {
150150
"onramp_api.load_success" -> {
151151
trace(
@@ -156,7 +156,10 @@ internal class CoinbaseOnRampEventHandler(
156156
onAutoClickGPay()
157157
}
158158
"onramp_api.commit_success" -> Unit // explicitly skipped to only dispatch one onPaymentSuccess
159-
"onramp_api.polling_success" -> onPaymentSuccess()
159+
"onramp_api.polling_success" -> {
160+
watchdogPaused = false
161+
onPaymentSuccess()
162+
}
160163

161164
"onramp_api.commit_error",
162165
"onramp_api.load_error",
@@ -174,6 +177,7 @@ internal class CoinbaseOnRampEventHandler(
174177
// triggering a duplicate Bugsnag report.
175178
val isFirstError = !errorReported
176179
errorReported = true
180+
watchdogPaused = false
177181

178182
trace(
179183
tag = "CoinbaseOnRamp",
@@ -200,13 +204,20 @@ internal class CoinbaseOnRampEventHandler(
200204
onPaymentFailure(error)
201205
}
202206
// cancel: no-op per spec — GPay button re-shows automatically
203-
"onramp_api.cancel" -> onCancel()
207+
"onramp_api.cancel" -> {
208+
watchdogPaused = false
209+
onCancel()
210+
}
204211

205212
// User is authenticating (bank login, 2FA, etc.) — pause the
206213
// watchdog so the inter-event timeout doesn't false-fire while
207214
// the user is interacting with the payment sheet.
208215
"onramp_api.pending_payment_auth" -> {
209-
pauseWatchdog = true
216+
watchdogPaused = true
217+
}
218+
219+
"onramp_api.payment_authorized" -> {
220+
watchdogPaused = false
210221
}
211222

212223
"timing.gpay_button_clicked" -> {
@@ -243,7 +254,7 @@ internal class CoinbaseOnRampEventHandler(
243254
}
244255
}
245256

246-
if (pauseWatchdog) {
257+
if (watchdogPaused) {
247258
onPauseWatchdog()
248259
} else {
249260
onHeartbeat()

apps/flipcash/shared/onramp/coinbase/src/test/kotlin/com/flipcash/app/onramp/internal/CoinbaseOnRampEventHandlerTest.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,22 @@ class CoinbaseOnRampEventHandlerTest {
179179
assertEquals(1, pauseWatchdogCount)
180180
assertEquals(0, heartbeatCount)
181181

182+
// Timing event arrives while paused — should stay paused
183+
handler.handleEvent("""{"eventName":"timing.gpay_button_clicked"}""")
184+
assertEquals(2, pauseWatchdogCount)
185+
assertEquals(0, heartbeatCount)
186+
182187
handler.handleEvent("""{"eventName":"onramp_api.payment_authorized"}""")
183188
assertEquals(1, heartbeatCount)
184-
assertEquals(1, pauseWatchdogCount)
189+
assertEquals(2, pauseWatchdogCount)
190+
}
191+
192+
@Test
193+
fun timingEventsStayPausedDuringAuth() {
194+
handler.handleEvent("""{"eventName":"onramp_api.pending_payment_auth"}""")
195+
handler.handleEvent("""{"eventName":"timing.gpay_button_clicked"}""")
196+
assertEquals(0, heartbeatCount)
197+
assertEquals(2, pauseWatchdogCount)
185198
}
186199
}
187200

0 commit comments

Comments
 (0)