sui_indexer_alt_jsonrpc/
data.rsuse std::time::Duration;
use anyhow::Context as _;
use serde::de::DeserializeOwned;
use sui_indexer_alt_reader::object_versions::LatestObjectVersionKey;
use sui_types::base_types::ObjectID;
use sui_types::object::Object;
use crate::context::Context;
pub(crate) async fn load_live(
ctx: &Context,
object_id: ObjectID,
) -> Result<Option<Object>, anyhow::Error> {
let Some(latest_version) = ctx
.pg_loader()
.load_one(LatestObjectVersionKey(object_id))
.await
.context("Failed to load latest version")?
else {
return Ok(None);
};
if latest_version.object_digest.is_none() {
return Ok(None);
}
let mut object = None;
let config = &ctx.config().objects;
let mut interval = tokio::time::interval(Duration::from_millis(config.obj_retry_interval_ms));
for _ in 0..=config.obj_retry_count {
interval.tick().await;
object = ctx
.kv_loader()
.load_one_object(object_id, latest_version.object_version as u64)
.await
.context("Failed to load latest object")?;
if object.is_some() {
break;
}
ctx.metrics()
.read_retries
.with_label_values(&["kv_object"])
.inc();
}
Ok(object)
}
pub(crate) async fn load_live_deserialized<T: DeserializeOwned>(
ctx: &Context,
object_id: ObjectID,
) -> Result<T, anyhow::Error> {
let object = load_live(ctx, object_id).await?.context("No data found")?;
let move_object = object.data.try_as_move().context("Not a Move object")?;
bcs::from_bytes(move_object.contents()).context("Failed to deserialize Move value")
}