Для одноразовой инициализации подходит CompletableDeferred<Session>: retrieve ожидает готовность без блокировки потока, save завершает общее ожидание для всех потребителей.
Отложенное сохранение и получение сессии устройства
Для одноразовой инициализации подходит CompletableDeferred<Session>: retrieve ожидает готовность без блокировки потока, save завершает общее ожидание для всех потребителей.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать систему, которая будет сохранять и предоставлять сессию, полученную из внешней библиотеки, собирающей информацию об устройстве. Эта сессия будет использоваться для идентификации пользователя на серверной стороне.
- Запустить инициализацию библиотеки DeviceScrapingLibrary, а после её готовности сохранить полученную сессию.
- Обеспечить возможность извлечения сохранённой сессии через слой хранения SessionStorage.
- Доступ к сессии должен быть возможен только после успешного завершения инициализации.
class DeviceScrapingLibraryInitializer(
private val sessionRepo: DeviceScrapingSessionRepository
) {
fun initialize() {
val builder = DeviceScrapingLibrary.Builder()
.onSessionReady { session ->
sessionRepo.save(session)
}
.build()
DeviceScrapingLibrary.initialize(builder)
}
}
class DeviceScrapingSessionRepository {
fun save(session: Session) {
// TODO store session
}
suspend fun retrieve(): Session {
// TODO suspend until session is available
}
}
Ответ
Для одноразовой инициализации подходит CompletableDeferred<Session>: retrieve ожидает готовность без блокировки потока, save завершает общее ожидание для всех потребителей.
class DeviceScrapingSessionRepository {
private val ready = CompletableDeferred<Session>()
fun save(session: Session) {
ready.complete(session)
}
fun fail(error: Throwable) {
ready.completeExceptionally(error)
}
suspend fun retrieve(): Session = ready.await()
}
Повторный complete не заменяет первую сессию. Отмену одного ожидающего нельзя связывать с отменой общей инициализации; отсутствие callback должно завершаться timeout или ошибкой. Если требуется хранение после перезапуска, сначала запишите сессию в защищённое SessionStorage, затем завершите Deferred. Сведения об устройстве сами по себе не заменяют серверную авторизацию пользователя.
Источник: kotlinlang.org.