use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
use crate::codec::indexeddb::{
from_wire_count_response, from_wire_cursor_response, from_wire_delete_response,
from_wire_key_response, from_wire_keys_response, from_wire_record_response,
from_wire_records_response, from_wire_transaction_server_message,
to_wire_create_object_store_request, to_wire_cursor_client_message,
to_wire_delete_object_store_request, to_wire_index_query_request,
to_wire_object_store_name_request, to_wire_object_store_range_request,
to_wire_object_store_request, to_wire_record_request, to_wire_transaction_client_message,
};
use crate::generated::v1;
use crate::rpc_support::{GestaltError, RpcStatus};
use tokio_stream::StreamExt;
pub type CursorDirection = i32;
pub mod cursor_direction {
pub const CURSOR_NEXT: i32 = 0;
pub const CURSOR_NEXT_UNIQUE: i32 = 1;
pub const CURSOR_PREV: i32 = 2;
pub const CURSOR_PREV_UNIQUE: i32 = 3;
}
pub type TransactionDurabilityHint = i32;
pub mod transaction_durability_hint {
pub const TRANSACTION_DURABILITY_DEFAULT: i32 = 0;
pub const TRANSACTION_DURABILITY_STRICT: i32 = 1;
pub const TRANSACTION_DURABILITY_RELAXED: i32 = 2;
}
pub type TransactionMode = i32;
pub mod transaction_mode {
pub const TRANSACTION_READONLY: i32 = 0;
pub const TRANSACTION_READWRITE: i32 = 1;
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct BeginTransactionRequest {
pub stores: Vec<String>,
pub mode: TransactionMode,
pub durability_hint: TransactionDurabilityHint,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ColumnDef {
pub name: String,
pub r#type: i32,
pub primary_key: bool,
pub not_null: bool,
pub unique: bool,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CountResponse {
pub count: i64,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CreateObjectStoreRequest {
pub name: String,
pub schema: Option<ObjectStoreSchema>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum CursorClientMessageMsg {
Open(OpenCursorRequest),
Command(CursorCommand),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CursorClientMessage {
pub msg: Option<CursorClientMessageMsg>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum CursorCommandCommand {
Next(bool),
ContinueToKey(CursorKeyTarget),
Advance(i32),
Update(Record),
Delete(bool),
Close(bool),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CursorCommand {
pub command: Option<CursorCommandCommand>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CursorEntry {
pub key: Vec<KeyValue>,
pub primary_key: String,
pub record: Option<Record>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CursorKeyTarget {
pub key: Vec<KeyValue>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum CursorResponseResult {
Entry(CursorEntry),
Done(bool),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct CursorResponse {
pub result: Option<CursorResponseResult>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct DeleteObjectStoreRequest {
pub name: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct DeleteResponse {
pub deleted: i64,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct IndexQueryRequest {
pub store: String,
pub index: String,
pub values: Vec<TypedValue>,
pub range: Option<KeyRange>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct IndexSchema {
pub name: String,
pub key_path: Vec<String>,
pub unique: bool,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct KeyRange {
pub lower: Option<TypedValue>,
pub upper: Option<TypedValue>,
pub lower_open: bool,
pub upper_open: bool,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct KeyResponse {
pub key: String,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum KeyValueKind {
Scalar(TypedValue),
Array(KeyValueArray),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct KeyValue {
pub kind: Option<KeyValueKind>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct KeyValueArray {
pub elements: Vec<KeyValue>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct KeysResponse {
pub keys: Vec<String>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ObjectStoreNameRequest {
pub store: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ObjectStoreRangeRequest {
pub store: String,
pub range: Option<KeyRange>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ObjectStoreRequest {
pub store: String,
pub id: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ObjectStoreSchema {
pub indexes: Vec<IndexSchema>,
pub columns: Vec<ColumnDef>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct OpenCursorRequest {
pub store: String,
pub range: Option<KeyRange>,
pub direction: CursorDirection,
pub keys_only: bool,
pub index: String,
pub values: Vec<TypedValue>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct Record {
pub fields: std::collections::BTreeMap<String, TypedValue>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct RecordRequest {
pub store: String,
pub record: Option<Record>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct RecordResponse {
pub record: Option<Record>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct RecordsResponse {
pub records: Vec<Record>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionAbortRequest {
pub reason: String,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionAbortResponse {
pub error: Option<RpcStatus>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionBeginResponse {}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum TransactionClientMessageMsg {
Begin(BeginTransactionRequest),
Operation(TransactionOperation),
Commit(TransactionCommitRequest),
Abort(TransactionAbortRequest),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionClientMessage {
pub msg: Option<TransactionClientMessageMsg>,
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionCommitRequest {}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionCommitResponse {
pub error: Option<RpcStatus>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum TransactionOperationOperation {
Get(ObjectStoreRequest),
GetKey(ObjectStoreRequest),
Add(RecordRequest),
Put(RecordRequest),
Delete(ObjectStoreRequest),
Clear(ObjectStoreNameRequest),
GetAll(ObjectStoreRangeRequest),
GetAllKeys(ObjectStoreRangeRequest),
Count(ObjectStoreRangeRequest),
DeleteRange(ObjectStoreRangeRequest),
IndexGet(IndexQueryRequest),
IndexGetKey(IndexQueryRequest),
IndexGetAll(IndexQueryRequest),
IndexGetAllKeys(IndexQueryRequest),
IndexCount(IndexQueryRequest),
IndexDelete(IndexQueryRequest),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionOperation {
pub request_id: u64,
pub operation: Option<TransactionOperationOperation>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum TransactionOperationResponseResult {
Empty,
Record(RecordResponse),
Records(RecordsResponse),
Key(KeyResponse),
Keys(KeysResponse),
Count(CountResponse),
Delete(DeleteResponse),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionOperationResponse {
pub request_id: u64,
pub error: Option<RpcStatus>,
pub result: Option<TransactionOperationResponseResult>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum TransactionServerMessageMsg {
Begin(TransactionBeginResponse),
Operation(TransactionOperationResponse),
Commit(TransactionCommitResponse),
Abort(TransactionAbortResponse),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TransactionServerMessage {
pub msg: Option<TransactionServerMessageMsg>,
}
#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
#[derive(Clone, Debug, PartialEq)]
pub enum TypedValueKind {
NullValue,
StringValue(String),
IntValue(i64),
FloatValue(f64),
BoolValue(bool),
TimeValue(std::time::SystemTime),
BytesValue(Vec<u8>),
JsonValue(serde_json::Value),
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct TypedValue {
pub kind: Option<TypedValueKind>,
}
pub struct IndexedDB {
inner: v1::indexed_db_client::IndexedDbClient<HostServiceChannel>,
timeout: Option<std::time::Duration>,
}
impl IndexedDB {
pub fn new(channel: tonic::transport::Channel) -> Self {
Self {
inner: v1::indexed_db_client::IndexedDbClient::new(plain_channel(channel)),
timeout: None,
}
}
pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
self.timeout = Some(timeout);
self
}
pub async fn connect() -> Result<Self, GestaltError> {
Self::connect_named("").await
}
pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
Ok(Self {
inner: v1::indexed_db_client::IndexedDbClient::new(
connect_host_service("indexeddb", name).await?,
),
timeout: None,
})
}
pub async fn create_object_store(
&mut self,
name: String,
schema: Option<ObjectStoreSchema>,
) -> Result<(), GestaltError> {
let request = CreateObjectStoreRequest { name, schema };
let mut tonic_request = tonic::Request::new(to_wire_create_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.create_object_store(tonic_request).await?;
Ok(())
}
pub async fn create_object_store_raw(
&mut self,
request: CreateObjectStoreRequest,
) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_create_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.create_object_store(tonic_request).await?;
Ok(())
}
pub async fn delete_object_store(&mut self, name: String) -> Result<(), GestaltError> {
let request = DeleteObjectStoreRequest { name };
let mut tonic_request = tonic::Request::new(to_wire_delete_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.delete_object_store(tonic_request).await?;
Ok(())
}
pub async fn delete_object_store_raw(
&mut self,
request: DeleteObjectStoreRequest,
) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_delete_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.delete_object_store(tonic_request).await?;
Ok(())
}
pub async fn get(&mut self, store: String, id: String) -> Result<RecordResponse, GestaltError> {
let request = ObjectStoreRequest { store, id };
let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get(tonic_request).await?;
Ok(from_wire_record_response(response.into_inner()))
}
pub async fn get_raw(
&mut self,
request: ObjectStoreRequest,
) -> Result<RecordResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get(tonic_request).await?;
Ok(from_wire_record_response(response.into_inner()))
}
pub async fn get_key(
&mut self,
store: String,
id: String,
) -> Result<KeyResponse, GestaltError> {
let request = ObjectStoreRequest { store, id };
let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_key(tonic_request).await?;
Ok(from_wire_key_response(response.into_inner()))
}
pub async fn get_key_raw(
&mut self,
request: ObjectStoreRequest,
) -> Result<KeyResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_key(tonic_request).await?;
Ok(from_wire_key_response(response.into_inner()))
}
pub async fn add(&mut self, store: String, record: Option<Record>) -> Result<(), GestaltError> {
let request = RecordRequest { store, record };
let mut tonic_request = tonic::Request::new(to_wire_record_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.add(tonic_request).await?;
Ok(())
}
pub async fn add_raw(&mut self, request: RecordRequest) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_record_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.add(tonic_request).await?;
Ok(())
}
pub async fn put(&mut self, store: String, record: Option<Record>) -> Result<(), GestaltError> {
let request = RecordRequest { store, record };
let mut tonic_request = tonic::Request::new(to_wire_record_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.put(tonic_request).await?;
Ok(())
}
pub async fn put_raw(&mut self, request: RecordRequest) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_record_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.put(tonic_request).await?;
Ok(())
}
pub async fn delete(&mut self, store: String, id: String) -> Result<(), GestaltError> {
let request = ObjectStoreRequest { store, id };
let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.delete(tonic_request).await?;
Ok(())
}
pub async fn delete_raw(&mut self, request: ObjectStoreRequest) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.delete(tonic_request).await?;
Ok(())
}
pub async fn clear(&mut self, store: String) -> Result<(), GestaltError> {
let request = ObjectStoreNameRequest { store };
let mut tonic_request = tonic::Request::new(to_wire_object_store_name_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.clear(tonic_request).await?;
Ok(())
}
pub async fn clear_raw(&mut self, request: ObjectStoreNameRequest) -> Result<(), GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_object_store_name_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
self.inner.clear(tonic_request).await?;
Ok(())
}
pub async fn get_all(
&mut self,
store: String,
range: Option<KeyRange>,
) -> Result<RecordsResponse, GestaltError> {
let request = ObjectStoreRangeRequest { store, range };
let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_all(tonic_request).await?;
Ok(from_wire_records_response(response.into_inner()))
}
pub async fn get_all_raw(
&mut self,
request: ObjectStoreRangeRequest,
) -> Result<RecordsResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_all(tonic_request).await?;
Ok(from_wire_records_response(response.into_inner()))
}
pub async fn get_all_keys(
&mut self,
store: String,
range: Option<KeyRange>,
) -> Result<KeysResponse, GestaltError> {
let request = ObjectStoreRangeRequest { store, range };
let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_all_keys(tonic_request).await?;
Ok(from_wire_keys_response(response.into_inner()))
}
pub async fn get_all_keys_raw(
&mut self,
request: ObjectStoreRangeRequest,
) -> Result<KeysResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.get_all_keys(tonic_request).await?;
Ok(from_wire_keys_response(response.into_inner()))
}
pub async fn count(
&mut self,
store: String,
range: Option<KeyRange>,
) -> Result<CountResponse, GestaltError> {
let request = ObjectStoreRangeRequest { store, range };
let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.count(tonic_request).await?;
Ok(from_wire_count_response(response.into_inner()))
}
pub async fn count_raw(
&mut self,
request: ObjectStoreRangeRequest,
) -> Result<CountResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.count(tonic_request).await?;
Ok(from_wire_count_response(response.into_inner()))
}
pub async fn delete_range(
&mut self,
store: String,
range: Option<KeyRange>,
) -> Result<DeleteResponse, GestaltError> {
let request = ObjectStoreRangeRequest { store, range };
let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.delete_range(tonic_request).await?;
Ok(from_wire_delete_response(response.into_inner()))
}
pub async fn delete_range_raw(
&mut self,
request: ObjectStoreRangeRequest,
) -> Result<DeleteResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.delete_range(tonic_request).await?;
Ok(from_wire_delete_response(response.into_inner()))
}
pub async fn index_get(
&mut self,
store: String,
index: String,
values: Vec<TypedValue>,
range: Option<KeyRange>,
) -> Result<RecordResponse, GestaltError> {
let request = IndexQueryRequest {
store,
index,
values,
range,
};
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_get(tonic_request).await?;
Ok(from_wire_record_response(response.into_inner()))
}
pub async fn index_get_raw(
&mut self,
request: IndexQueryRequest,
) -> Result<RecordResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_get(tonic_request).await?;
Ok(from_wire_record_response(response.into_inner()))
}
pub async fn index_get_key(
&mut self,
store: String,
index: String,
values: Vec<TypedValue>,
range: Option<KeyRange>,
) -> Result<KeyResponse, GestaltError> {
let request = IndexQueryRequest {
store,
index,
values,
range,
};
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_get_key(tonic_request).await?;
Ok(from_wire_key_response(response.into_inner()))
}
pub async fn index_get_key_raw(
&mut self,
request: IndexQueryRequest,
) -> Result<KeyResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_get_key(tonic_request).await?;
Ok(from_wire_key_response(response.into_inner()))
}
pub async fn index_get_all(
&mut self,
store: String,
index: String,
values: Vec<TypedValue>,
range: Option<KeyRange>,
) -> Result<RecordsResponse, GestaltError> {
let request = IndexQueryRequest {
store,
index,
values,
range,
};
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_get_all(tonic_request).await?;
Ok(from_wire_records_response(response.into_inner()))
}
pub async fn index_get_all_raw(
&mut self,
request: IndexQueryRequest,
) -> Result<RecordsResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_get_all(tonic_request).await?;
Ok(from_wire_records_response(response.into_inner()))
}
pub async fn index_get_all_keys(
&mut self,
store: String,
index: String,
values: Vec<TypedValue>,
range: Option<KeyRange>,
) -> Result<KeysResponse, GestaltError> {
let request = IndexQueryRequest {
store,
index,
values,
range,
};
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_get_all_keys(tonic_request).await?;
Ok(from_wire_keys_response(response.into_inner()))
}
pub async fn index_get_all_keys_raw(
&mut self,
request: IndexQueryRequest,
) -> Result<KeysResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_get_all_keys(tonic_request).await?;
Ok(from_wire_keys_response(response.into_inner()))
}
pub async fn index_count(
&mut self,
store: String,
index: String,
values: Vec<TypedValue>,
range: Option<KeyRange>,
) -> Result<CountResponse, GestaltError> {
let request = IndexQueryRequest {
store,
index,
values,
range,
};
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_count(tonic_request).await?;
Ok(from_wire_count_response(response.into_inner()))
}
pub async fn index_count_raw(
&mut self,
request: IndexQueryRequest,
) -> Result<CountResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_count(tonic_request).await?;
Ok(from_wire_count_response(response.into_inner()))
}
pub async fn index_delete(
&mut self,
store: String,
index: String,
values: Vec<TypedValue>,
range: Option<KeyRange>,
) -> Result<DeleteResponse, GestaltError> {
let request = IndexQueryRequest {
store,
index,
values,
range,
};
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_delete(tonic_request).await?;
Ok(from_wire_delete_response(response.into_inner()))
}
pub async fn index_delete_raw(
&mut self,
request: IndexQueryRequest,
) -> Result<DeleteResponse, GestaltError> {
let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
if let Some(timeout) = self.timeout {
tonic_request.set_timeout(timeout);
}
let response = self.inner.index_delete(tonic_request).await?;
Ok(from_wire_delete_response(response.into_inner()))
}
pub async fn open_cursor(
&mut self,
requests: impl tokio_stream::Stream<Item = CursorClientMessage> + Send + 'static,
) -> Result<IndexedDBOpenCursorStream, GestaltError> {
let response = self
.inner
.open_cursor(requests.map(to_wire_cursor_client_message))
.await?;
Ok(IndexedDBOpenCursorStream {
inner: response.into_inner(),
})
}
pub async fn transaction(
&mut self,
requests: impl tokio_stream::Stream<Item = TransactionClientMessage> + Send + 'static,
) -> Result<IndexedDBTransactionStream, GestaltError> {
let response = self
.inner
.transaction(requests.map(to_wire_transaction_client_message))
.await?;
Ok(IndexedDBTransactionStream {
inner: response.into_inner(),
})
}
}
pub struct IndexedDBOpenCursorStream {
inner: tonic::Streaming<v1::CursorResponse>,
}
impl IndexedDBOpenCursorStream {
pub async fn recv(&mut self) -> Result<Option<CursorResponse>, GestaltError> {
Ok(self.inner.message().await?.map(from_wire_cursor_response))
}
}
pub struct IndexedDBTransactionStream {
inner: tonic::Streaming<v1::TransactionServerMessage>,
}
impl IndexedDBTransactionStream {
pub async fn recv(&mut self) -> Result<Option<TransactionServerMessage>, GestaltError> {
Ok(self
.inner
.message()
.await?
.map(from_wire_transaction_server_message))
}
}