При попытке восстановить сессию прокторинга после перезагрузки страницы, например, нажатием F5, возникает ошибка. Пользователь видит модальное окно с текстом "Упс! Что-то пошло не так...", а в консоли разработчика отображается ошибка SDK: "Unable to get session params."
Сценарий воспроизведения.
Экзамен успешно запущен.
Через 10 минут или более длительный промежуток времени пользователь нажимает F5 для перезагрузки страницы.
Приложение пытается восстановить сессию с помощью await proctoringInstance.resume(). SDK возвращает пустой объект sdkSession или null.
В ответ на это приложение вызывает proctoringInstance.start() с тем же JWT, который использовался изначально.
SDK возвращает ошибку "Unable to get session params." Важно отметить, что если перезагрузить страницу через 1-2 минуты после старта, восстановление проходит успешно.
Причины возникновения ошибки.
Проблема возникает из-за неверной логики обработки восстановления сессии в клиентском приложении.
Первая причина — асинхронность метода resume. Метод resume является асинхронным. Внутреннее состояние SDK, то есть переменная sdkSession, заполняется с задержкой через callback onAppStart, который вызывается только после полного завершения всех внутренних операций SDK.
Вторая причина — неверный способ проверки сессии. Проверка значения sdkSession сразу после вызова resume или внутри onAppStart не является надежным индикатором успешности восстановления. Если sdkSession равен null в onAppStart, это не всегда означает отсутствие сессии. Напротив, если onAppStart был вызван, это уже гарантирует, что SDK успешно запустился и сессия как минимум существует.
Третья причина — повторное использование JWT. JWT, переданный в start, является одноразовым маркером для создания сессии. Если сессия уже была создана ранее, даже если она не восстановилась на клиенте, сервер не может создать новую сессию по тому же токену. Попытка вызвать start с уже использованным JWT приводит к ошибке "Unable to get session params."
Четвертая причина — тайм-ауты и срок действия сессии. Через 10 минут после начала экзамена серверная сессия может перейти в состояние, не позволяющее простое возобновление стандартным методом. Восстановление должно происходить строго через механизм, предусмотренный SDK.
Правильное решение.
Для корректного восстановления сессии необходимо изменить логику работы с SDK.
Главное правило: решение о том, восстановилась ли сессия или нет, принимается по тому, как отработал промис resume, а не по значению в onAppStart.
Используйте конструкцию try catch или обработайте then catch для метода resume.
Объявите асинхронную функцию restoreSession. Внутри неё поместите вызов await proctoringInstance.resume в блок try. Если промис зарезолвился без ошибок, значит сессия восстановлена успешно, и можно переходить к экзамену. Никаких дополнительных проверок sdkSession не требуется. Если же промис упал в reject, то есть выполнение перешло в блок catch, восстановление невозможно. Это означает, что сессия устарела, не найдена или не может быть возобновлена. В этом случае покажите пользователю сообщение о необходимости связаться с поддержкой или завершить экзамен. И самое важное — ни в коем случае не вызывайте proctoringInstance.start с тем же JWT.
Также рекомендуется отказаться от использования onAppStart для ветвления логики. Используйте onAppStart только для инициализации пользовательского интерфейса после того, как SDK полностью готов к работе. Не пытайтесь анализировать значение sdkSession внутри этого callback для принятия решения о восстановлении.
Правильная обработка ошибок заключается в следующем. Если метод resume завершился с ошибкой, это следует интерпретировать как невозможность восстановления. В этом случае вы должны показать пользователю интерфейс завершения экзамена или предложить обратиться в поддержку, но ни в коем случае не вызывать повторно proctoringInstance.start с тем же JWT.
Что касается работы с таймаутами, если в процессе восстановления требуется тайм-аут, используйте его только для ожидания ответа от resume, а не для попыток повторного запуска старой сессии.
Итоговый алгоритм работы должен быть таким.
При перезагрузке страницы приложение обнаруживает перезагрузку. Затем приложение вызывает await proctoringInstance.resume. Далее происходит ожидание результата. Если промис resume разрешается, это означает успех, сессия восстановлена, и запускается основной интерфейс экзамена. Если промис resume отклоняется, это означает ошибку, сессия не подлежит восстановлению, и показывается экран ошибки или завершения экзамена. После этого все попытки вызова start прекращаются.