pub async fn get(&self) -> Result<Option<String>, IdbError> {
        let transaction = self
            .db
            .transaction(&["frozen_state"], TransactionMode::ReadOnly)
            .map_err(|err| IdbError::TransactionError { source: err })?;
        let store = transaction
            .store("frozen_state")
            .map_err(|err| IdbError::TransactionError { source: err })?;

        // Get the last element from the store by working backwards and getting
        // everything, with a limit of 1
        let frozen_states = store
            .get_all(None, Some(1), None, Some(Direction::Prev))
            .await
            .map_err(|err| IdbError::GetError { source: err })?;
        let frozen_state = match frozen_states.get(0) {
            Some((_key, value)) => value,
            None => return Ok(None),
        };
        // TODO Do this without cloning the whole thing into the Wasm table and then
        // moving it into Rust
        let frozen_state = frozen_state.as_string().unwrap();
        transaction
            .commit()
            .await
            .map_err(|err| IdbError::TransactionError { source: err })?;

        Ok(Some(frozen_state))
    }
Gets the stored frozen state. Be warned that the result of this could be
arbitrarily old, or it may have been tampered with by the user (in which
case Perseus will either return an error that you can handle or
it'll fall back to the active state). If no state has been stored yet,
this will return `Ok(None)`.
packages/perseus/src/state/freeze_idb.rs