TimeoutController accepts onExpire callback