Отложенное сохранение и получение сессии устройства

Для одноразовой инициализации подходит CompletableDeferred<Session>: retrieve ожидает готовность без блокировки потока, save завершает общее ожидание для всех потребителей.

Короткий ответ

Что ответить на собеседовании

Для одноразовой инициализации подходит CompletableDeferred<Session>: retrieve ожидает готовность без блокировки потока, save завершает общее ожидание для всех потребителей.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать систему, которая будет сохранять и предоставлять сессию, полученную из внешней библиотеки, собирающей информацию об устройстве. Эта сессия будет использоваться для идентификации пользователя на серверной стороне.

  1. Запустить инициализацию библиотеки DeviceScrapingLibrary, а после её готовности сохранить полученную сессию.
  2. Обеспечить возможность извлечения сохранённой сессии через слой хранения SessionStorage.
  3. Доступ к сессии должен быть возможен только после успешного завершения инициализации.
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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее