1use crate::codec::host_service::{HostServiceChannel, connect_host_service, plain_channel};
6use crate::codec::indexeddb::{
7 from_wire_count_response, from_wire_cursor_response, from_wire_delete_response,
8 from_wire_key_response, from_wire_keys_response, from_wire_record_response,
9 from_wire_records_response, from_wire_transaction_server_message, to_wire_create_index_request,
10 to_wire_create_object_store_request, to_wire_cursor_client_message,
11 to_wire_delete_index_request, to_wire_delete_object_store_request, to_wire_index_query_request,
12 to_wire_object_store_name_request, to_wire_object_store_range_request,
13 to_wire_object_store_request, to_wire_record_request, to_wire_transaction_client_message,
14};
15use crate::generated::v1;
16use crate::rpc_support::{GestaltError, RpcStatus};
17use tokio_stream::StreamExt;
18
19pub type CursorDirection = i32;
21
22pub mod cursor_direction {
26 pub const CURSOR_NEXT: i32 = 0;
28 pub const CURSOR_NEXT_UNIQUE: i32 = 1;
30 pub const CURSOR_PREV: i32 = 2;
32 pub const CURSOR_PREV_UNIQUE: i32 = 3;
34}
35
36pub type TransactionDurabilityHint = i32;
38
39pub mod transaction_durability_hint {
44 pub const TRANSACTION_DURABILITY_DEFAULT: i32 = 0;
46 pub const TRANSACTION_DURABILITY_STRICT: i32 = 1;
48 pub const TRANSACTION_DURABILITY_RELAXED: i32 = 2;
50}
51
52pub type TransactionMode = i32;
54
55pub mod transaction_mode {
59 pub const TRANSACTION_READONLY: i32 = 0;
61 pub const TRANSACTION_READWRITE: i32 = 1;
63}
64
65#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
69#[serde(rename_all = "camelCase")]
70pub struct BeginTransactionRequest {
71 pub stores: Vec<String>,
73 pub mode: TransactionMode,
75 pub durability_hint: TransactionDurabilityHint,
77}
78
79#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
83#[serde(rename_all = "camelCase")]
84pub struct ColumnDef {
85 pub name: String,
87 pub r#type: i32,
89 pub primary_key: bool,
91 pub not_null: bool,
93 pub unique: bool,
95}
96
97#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
101#[serde(rename_all = "camelCase")]
102pub struct CountResponse {
103 pub count: i64,
105}
106
107#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
111#[serde(rename_all = "camelCase")]
112pub struct CreateIndexRequest {
113 pub store: String,
115 pub name: String,
117 pub key_path: Vec<String>,
119 pub unique: bool,
121}
122
123#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
127#[serde(rename_all = "camelCase")]
128pub struct CreateObjectStoreRequest {
129 pub name: String,
131 pub schema: Option<ObjectStoreSchema>,
133}
134
135#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
137#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
138pub enum CursorClientMessageMsg {
139 Open(OpenCursorRequest),
141 Command(CursorCommand),
143}
144
145#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
149#[serde(rename_all = "camelCase")]
150pub struct CursorClientMessage {
151 pub msg: Option<CursorClientMessageMsg>,
153}
154
155#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
157#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
158pub enum CursorCommandCommand {
159 Next(bool),
161 ContinueToKey(CursorKeyTarget),
163 Advance(i32),
165 Update(Record),
167 Delete(bool),
169 Close(bool),
171}
172
173#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
177#[serde(rename_all = "camelCase")]
178pub struct CursorCommand {
179 pub command: Option<CursorCommandCommand>,
181}
182
183#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
187#[serde(rename_all = "camelCase")]
188pub struct CursorEntry {
189 pub key: Option<KeyValue>,
194 pub primary_key: String,
196 pub record: Option<Record>,
198}
199
200#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
204#[serde(rename_all = "camelCase")]
205pub struct CursorKeyTarget {
206 pub key: Option<KeyValue>,
208}
209
210#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
212#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
213pub enum CursorResponseResult {
214 Entry(CursorEntry),
216 Done(bool),
218}
219
220#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
224#[serde(rename_all = "camelCase")]
225pub struct CursorResponse {
226 pub result: Option<CursorResponseResult>,
228}
229
230#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
234#[serde(rename_all = "camelCase")]
235pub struct DeleteIndexRequest {
236 pub store: String,
238 pub name: String,
240}
241
242#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
246#[serde(rename_all = "camelCase")]
247pub struct DeleteObjectStoreRequest {
248 pub name: String,
250}
251
252#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
256#[serde(rename_all = "camelCase")]
257pub struct DeleteResponse {
258 pub deleted: i64,
260}
261
262#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
266#[serde(rename_all = "camelCase")]
267pub struct IndexQueryRequest {
268 pub store: String,
270 pub index: String,
272 pub query: Option<IndexedDBQuery>,
274 pub count: Option<u32>,
276}
277
278#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
282#[serde(rename_all = "camelCase")]
283pub struct IndexSchema {
284 pub name: String,
286 pub key_path: Vec<String>,
288 pub unique: bool,
290}
291
292#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
294#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
295pub enum IndexedDBQueryQuery {
296 Key(KeyValue),
298 Range(KeyRange),
300}
301
302#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
308#[serde(rename_all = "camelCase")]
309pub struct IndexedDBQuery {
310 pub query: Option<IndexedDBQueryQuery>,
312}
313
314#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
321#[serde(rename_all = "camelCase")]
322pub struct KeyRange {
323 pub lower: Option<KeyValue>,
325 pub upper: Option<KeyValue>,
327 pub lower_open: bool,
329 pub upper_open: bool,
331}
332
333#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
337#[serde(rename_all = "camelCase")]
338pub struct KeyResponse {
339 pub key: String,
341}
342
343#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
345#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
346pub enum KeyValueKind {
347 Scalar(TypedValue),
349 Array(KeyValueArray),
351}
352
353#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
359#[serde(rename_all = "camelCase")]
360pub struct KeyValue {
361 pub kind: Option<KeyValueKind>,
363}
364
365#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
367#[serde(rename_all = "camelCase")]
368pub struct KeyValueArray {
369 pub elements: Vec<KeyValue>,
371}
372
373#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
377#[serde(rename_all = "camelCase")]
378pub struct KeysResponse {
379 pub keys: Vec<String>,
381}
382
383#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
387#[serde(rename_all = "camelCase")]
388pub struct ObjectStoreNameRequest {
389 pub store: String,
391}
392
393#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
397#[serde(rename_all = "camelCase")]
398pub struct ObjectStoreRangeRequest {
399 pub store: String,
401 pub query: Option<IndexedDBQuery>,
403 pub count: Option<u32>,
405}
406
407#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
411#[serde(rename_all = "camelCase")]
412pub struct ObjectStoreRequest {
413 pub store: String,
415 pub id: String,
417}
418
419#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
424#[serde(rename_all = "camelCase")]
425pub struct ObjectStoreSchema {
426 pub indexes: Vec<IndexSchema>,
428 pub columns: Vec<ColumnDef>,
430}
431
432#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
436#[serde(rename_all = "camelCase")]
437pub struct OpenCursorRequest {
438 pub store: String,
440 pub index: String,
442 pub query: Option<IndexedDBQuery>,
444 pub direction: CursorDirection,
446 pub keys_only: bool,
450}
451
452#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
456#[serde(rename_all = "camelCase")]
457pub struct Record {
458 pub fields: std::collections::BTreeMap<String, TypedValue>,
460}
461
462#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
466#[serde(rename_all = "camelCase")]
467pub struct RecordRequest {
468 pub store: String,
470 pub record: Option<Record>,
472}
473
474#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
478#[serde(rename_all = "camelCase")]
479pub struct RecordResponse {
480 pub record: Option<Record>,
482}
483
484#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
488#[serde(rename_all = "camelCase")]
489pub struct RecordsResponse {
490 pub records: Vec<Record>,
492}
493
494#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
496#[serde(rename_all = "camelCase")]
497pub struct TransactionAbortRequest {
498 pub reason: String,
500}
501
502#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
506#[serde(rename_all = "camelCase")]
507pub struct TransactionAbortResponse {
508 pub error: Option<RpcStatus>,
510}
511
512#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
514#[serde(rename_all = "camelCase")]
515pub struct TransactionBeginResponse {}
516
517#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
519#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
520pub enum TransactionClientMessageMsg {
521 Begin(BeginTransactionRequest),
523 Operation(TransactionOperation),
525 Commit(TransactionCommitRequest),
527 Abort(TransactionAbortRequest),
529}
530
531#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
536#[serde(rename_all = "camelCase")]
537pub struct TransactionClientMessage {
538 pub msg: Option<TransactionClientMessageMsg>,
540}
541
542#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
544#[serde(rename_all = "camelCase")]
545pub struct TransactionCommitRequest {}
546
547#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
552#[serde(rename_all = "camelCase")]
553pub struct TransactionCommitResponse {
554 pub error: Option<RpcStatus>,
556}
557
558#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
560#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
561pub enum TransactionOperationOperation {
562 Get(ObjectStoreRequest),
564 GetKey(ObjectStoreRequest),
566 Add(RecordRequest),
568 Put(RecordRequest),
570 Delete(ObjectStoreRequest),
572 Clear(ObjectStoreNameRequest),
574 GetAll(ObjectStoreRangeRequest),
576 GetAllKeys(ObjectStoreRangeRequest),
578 Count(ObjectStoreRangeRequest),
580 DeleteRange(ObjectStoreRangeRequest),
582 IndexGet(IndexQueryRequest),
584 IndexGetKey(IndexQueryRequest),
586 IndexGetAll(IndexQueryRequest),
588 IndexGetAllKeys(IndexQueryRequest),
590 IndexCount(IndexQueryRequest),
592 IndexDelete(IndexQueryRequest),
594}
595
596#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
602#[serde(rename_all = "camelCase")]
603pub struct TransactionOperation {
604 pub request_id: u64,
606 pub operation: Option<TransactionOperationOperation>,
608}
609
610#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
612#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
613pub enum TransactionOperationResponseResult {
614 Empty,
616 Record(RecordResponse),
618 Records(RecordsResponse),
620 Key(KeyResponse),
622 Keys(KeysResponse),
624 Count(CountResponse),
626 Delete(DeleteResponse),
628}
629
630#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
635#[serde(rename_all = "camelCase")]
636pub struct TransactionOperationResponse {
637 pub request_id: u64,
639 pub error: Option<RpcStatus>,
641 pub result: Option<TransactionOperationResponseResult>,
643}
644
645#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
647#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
648pub enum TransactionServerMessageMsg {
649 Begin(TransactionBeginResponse),
651 Operation(TransactionOperationResponse),
653 Commit(TransactionCommitResponse),
655 Abort(TransactionAbortResponse),
657}
658
659#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
661#[serde(rename_all = "camelCase")]
662pub struct TransactionServerMessage {
663 pub msg: Option<TransactionServerMessageMsg>,
665}
666
667#[allow(clippy::enum_variant_names, clippy::large_enum_variant)]
669#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
670pub enum TypedValueKind {
671 NullValue,
673 StringValue(String),
675 IntValue(i64),
677 FloatValue(f64),
679 BoolValue(bool),
681 TimeValue(std::time::SystemTime),
683 BytesValue(Vec<u8>),
685 JsonValue(serde_json::Value),
687}
688
689#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)]
693#[serde(rename_all = "camelCase")]
694pub struct TypedValue {
695 pub kind: Option<TypedValueKind>,
697}
698
699pub struct IndexedDB {
703 inner: v1::indexed_db_client::IndexedDbClient<HostServiceChannel>,
704 timeout: Option<std::time::Duration>,
705}
706
707impl IndexedDB {
708 pub fn new(channel: tonic::transport::Channel) -> Self {
710 Self {
711 inner: v1::indexed_db_client::IndexedDbClient::new(plain_channel(channel)),
712 timeout: None,
713 }
714 }
715
716 pub fn with_timeout(mut self, timeout: std::time::Duration) -> Self {
719 self.timeout = Some(timeout);
720 self
721 }
722
723 pub async fn connect() -> Result<Self, GestaltError> {
725 Self::connect_named("").await
726 }
727
728 pub async fn connect_named(name: &str) -> Result<Self, GestaltError> {
730 Ok(Self {
731 inner: v1::indexed_db_client::IndexedDbClient::new(
732 connect_host_service("indexeddb", name).await?,
733 ),
734 timeout: None,
735 })
736 }
737
738 pub async fn create_object_store(
742 &mut self,
743 name: String,
744 schema: Option<ObjectStoreSchema>,
745 ) -> Result<(), GestaltError> {
746 let request = CreateObjectStoreRequest { name, schema };
747 let mut tonic_request = tonic::Request::new(to_wire_create_object_store_request(request));
748 if let Some(timeout) = self.timeout {
749 tonic_request.set_timeout(timeout);
750 }
751 self.inner.create_object_store(tonic_request).await?;
752 Ok(())
753 }
754
755 pub async fn create_object_store_raw(
759 &mut self,
760 request: CreateObjectStoreRequest,
761 ) -> Result<(), GestaltError> {
762 let mut tonic_request = tonic::Request::new(to_wire_create_object_store_request(request));
763 if let Some(timeout) = self.timeout {
764 tonic_request.set_timeout(timeout);
765 }
766 self.inner.create_object_store(tonic_request).await?;
767 Ok(())
768 }
769
770 pub async fn delete_object_store(&mut self, name: String) -> Result<(), GestaltError> {
772 let request = DeleteObjectStoreRequest { name };
773 let mut tonic_request = tonic::Request::new(to_wire_delete_object_store_request(request));
774 if let Some(timeout) = self.timeout {
775 tonic_request.set_timeout(timeout);
776 }
777 self.inner.delete_object_store(tonic_request).await?;
778 Ok(())
779 }
780
781 pub async fn delete_object_store_raw(
783 &mut self,
784 request: DeleteObjectStoreRequest,
785 ) -> Result<(), GestaltError> {
786 let mut tonic_request = tonic::Request::new(to_wire_delete_object_store_request(request));
787 if let Some(timeout) = self.timeout {
788 tonic_request.set_timeout(timeout);
789 }
790 self.inner.delete_object_store(tonic_request).await?;
791 Ok(())
792 }
793
794 pub async fn create_index(
796 &mut self,
797 store: String,
798 name: String,
799 key_path: Vec<String>,
800 unique: bool,
801 ) -> Result<(), GestaltError> {
802 let request = CreateIndexRequest {
803 store,
804 name,
805 key_path,
806 unique,
807 };
808 let mut tonic_request = tonic::Request::new(to_wire_create_index_request(request));
809 if let Some(timeout) = self.timeout {
810 tonic_request.set_timeout(timeout);
811 }
812 self.inner.create_index(tonic_request).await?;
813 Ok(())
814 }
815
816 pub async fn create_index_raw(
818 &mut self,
819 request: CreateIndexRequest,
820 ) -> Result<(), GestaltError> {
821 let mut tonic_request = tonic::Request::new(to_wire_create_index_request(request));
822 if let Some(timeout) = self.timeout {
823 tonic_request.set_timeout(timeout);
824 }
825 self.inner.create_index(tonic_request).await?;
826 Ok(())
827 }
828
829 pub async fn delete_index(&mut self, store: String, name: String) -> Result<(), GestaltError> {
831 let request = DeleteIndexRequest { store, name };
832 let mut tonic_request = tonic::Request::new(to_wire_delete_index_request(request));
833 if let Some(timeout) = self.timeout {
834 tonic_request.set_timeout(timeout);
835 }
836 self.inner.delete_index(tonic_request).await?;
837 Ok(())
838 }
839
840 pub async fn delete_index_raw(
842 &mut self,
843 request: DeleteIndexRequest,
844 ) -> Result<(), GestaltError> {
845 let mut tonic_request = tonic::Request::new(to_wire_delete_index_request(request));
846 if let Some(timeout) = self.timeout {
847 tonic_request.set_timeout(timeout);
848 }
849 self.inner.delete_index(tonic_request).await?;
850 Ok(())
851 }
852
853 pub async fn get(&mut self, store: String, id: String) -> Result<RecordResponse, GestaltError> {
857 let request = ObjectStoreRequest { store, id };
858 let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
859 if let Some(timeout) = self.timeout {
860 tonic_request.set_timeout(timeout);
861 }
862 let response = self.inner.get(tonic_request).await?;
863 Ok(from_wire_record_response(response.into_inner()))
864 }
865
866 pub async fn get_raw(
870 &mut self,
871 request: ObjectStoreRequest,
872 ) -> Result<RecordResponse, GestaltError> {
873 let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
874 if let Some(timeout) = self.timeout {
875 tonic_request.set_timeout(timeout);
876 }
877 let response = self.inner.get(tonic_request).await?;
878 Ok(from_wire_record_response(response.into_inner()))
879 }
880
881 pub async fn get_key(
883 &mut self,
884 store: String,
885 id: String,
886 ) -> Result<KeyResponse, GestaltError> {
887 let request = ObjectStoreRequest { store, id };
888 let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
889 if let Some(timeout) = self.timeout {
890 tonic_request.set_timeout(timeout);
891 }
892 let response = self.inner.get_key(tonic_request).await?;
893 Ok(from_wire_key_response(response.into_inner()))
894 }
895
896 pub async fn get_key_raw(
898 &mut self,
899 request: ObjectStoreRequest,
900 ) -> Result<KeyResponse, GestaltError> {
901 let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
902 if let Some(timeout) = self.timeout {
903 tonic_request.set_timeout(timeout);
904 }
905 let response = self.inner.get_key(tonic_request).await?;
906 Ok(from_wire_key_response(response.into_inner()))
907 }
908
909 pub async fn add(&mut self, store: String, record: Option<Record>) -> Result<(), GestaltError> {
911 let request = RecordRequest { store, record };
912 let mut tonic_request = tonic::Request::new(to_wire_record_request(request));
913 if let Some(timeout) = self.timeout {
914 tonic_request.set_timeout(timeout);
915 }
916 self.inner.add(tonic_request).await?;
917 Ok(())
918 }
919
920 pub async fn add_raw(&mut self, request: RecordRequest) -> Result<(), GestaltError> {
922 let mut tonic_request = tonic::Request::new(to_wire_record_request(request));
923 if let Some(timeout) = self.timeout {
924 tonic_request.set_timeout(timeout);
925 }
926 self.inner.add(tonic_request).await?;
927 Ok(())
928 }
929
930 pub async fn put(&mut self, store: String, record: Option<Record>) -> Result<(), GestaltError> {
932 let request = RecordRequest { store, record };
933 let mut tonic_request = tonic::Request::new(to_wire_record_request(request));
934 if let Some(timeout) = self.timeout {
935 tonic_request.set_timeout(timeout);
936 }
937 self.inner.put(tonic_request).await?;
938 Ok(())
939 }
940
941 pub async fn put_raw(&mut self, request: RecordRequest) -> Result<(), GestaltError> {
943 let mut tonic_request = tonic::Request::new(to_wire_record_request(request));
944 if let Some(timeout) = self.timeout {
945 tonic_request.set_timeout(timeout);
946 }
947 self.inner.put(tonic_request).await?;
948 Ok(())
949 }
950
951 pub async fn delete(&mut self, store: String, id: String) -> Result<(), GestaltError> {
953 let request = ObjectStoreRequest { store, id };
954 let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
955 if let Some(timeout) = self.timeout {
956 tonic_request.set_timeout(timeout);
957 }
958 self.inner.delete(tonic_request).await?;
959 Ok(())
960 }
961
962 pub async fn delete_raw(&mut self, request: ObjectStoreRequest) -> Result<(), GestaltError> {
964 let mut tonic_request = tonic::Request::new(to_wire_object_store_request(request));
965 if let Some(timeout) = self.timeout {
966 tonic_request.set_timeout(timeout);
967 }
968 self.inner.delete(tonic_request).await?;
969 Ok(())
970 }
971
972 pub async fn clear(&mut self, store: String) -> Result<(), GestaltError> {
976 let request = ObjectStoreNameRequest { store };
977 let mut tonic_request = tonic::Request::new(to_wire_object_store_name_request(request));
978 if let Some(timeout) = self.timeout {
979 tonic_request.set_timeout(timeout);
980 }
981 self.inner.clear(tonic_request).await?;
982 Ok(())
983 }
984
985 pub async fn clear_raw(&mut self, request: ObjectStoreNameRequest) -> Result<(), GestaltError> {
989 let mut tonic_request = tonic::Request::new(to_wire_object_store_name_request(request));
990 if let Some(timeout) = self.timeout {
991 tonic_request.set_timeout(timeout);
992 }
993 self.inner.clear(tonic_request).await?;
994 Ok(())
995 }
996
997 pub async fn get_all(
999 &mut self,
1000 store: String,
1001 query: Option<IndexedDBQuery>,
1002 options: IndexedDBGetAllOptions,
1003 ) -> Result<RecordsResponse, GestaltError> {
1004 let request = ObjectStoreRangeRequest {
1005 store,
1006 query,
1007 count: options.count,
1008 };
1009 let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
1010 if let Some(timeout) = self.timeout {
1011 tonic_request.set_timeout(timeout);
1012 }
1013 let response = self.inner.get_all(tonic_request).await?;
1014 Ok(from_wire_records_response(response.into_inner()))
1015 }
1016
1017 pub async fn get_all_raw(
1019 &mut self,
1020 request: ObjectStoreRangeRequest,
1021 ) -> Result<RecordsResponse, GestaltError> {
1022 let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
1023 if let Some(timeout) = self.timeout {
1024 tonic_request.set_timeout(timeout);
1025 }
1026 let response = self.inner.get_all(tonic_request).await?;
1027 Ok(from_wire_records_response(response.into_inner()))
1028 }
1029
1030 pub async fn get_all_keys(
1032 &mut self,
1033 store: String,
1034 query: Option<IndexedDBQuery>,
1035 options: IndexedDBGetAllKeysOptions,
1036 ) -> Result<KeysResponse, GestaltError> {
1037 let request = ObjectStoreRangeRequest {
1038 store,
1039 query,
1040 count: options.count,
1041 };
1042 let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
1043 if let Some(timeout) = self.timeout {
1044 tonic_request.set_timeout(timeout);
1045 }
1046 let response = self.inner.get_all_keys(tonic_request).await?;
1047 Ok(from_wire_keys_response(response.into_inner()))
1048 }
1049
1050 pub async fn get_all_keys_raw(
1052 &mut self,
1053 request: ObjectStoreRangeRequest,
1054 ) -> Result<KeysResponse, GestaltError> {
1055 let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
1056 if let Some(timeout) = self.timeout {
1057 tonic_request.set_timeout(timeout);
1058 }
1059 let response = self.inner.get_all_keys(tonic_request).await?;
1060 Ok(from_wire_keys_response(response.into_inner()))
1061 }
1062
1063 pub async fn count(
1065 &mut self,
1066 store: String,
1067 query: Option<IndexedDBQuery>,
1068 ) -> Result<i64, GestaltError> {
1069 let request = ObjectStoreRangeRequest {
1070 store,
1071 query,
1072 ..Default::default()
1073 };
1074 let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
1075 if let Some(timeout) = self.timeout {
1076 tonic_request.set_timeout(timeout);
1077 }
1078 let response =
1079 from_wire_count_response(self.inner.count(tonic_request).await?.into_inner());
1080 Ok(response.count)
1081 }
1082
1083 pub async fn count_raw(
1085 &mut self,
1086 request: ObjectStoreRangeRequest,
1087 ) -> Result<CountResponse, GestaltError> {
1088 let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
1089 if let Some(timeout) = self.timeout {
1090 tonic_request.set_timeout(timeout);
1091 }
1092 let response = self.inner.count(tonic_request).await?;
1093 Ok(from_wire_count_response(response.into_inner()))
1094 }
1095
1096 pub async fn delete_range(
1098 &mut self,
1099 store: String,
1100 query: Option<IndexedDBQuery>,
1101 ) -> Result<DeleteResponse, GestaltError> {
1102 let request = ObjectStoreRangeRequest {
1103 store,
1104 query,
1105 ..Default::default()
1106 };
1107 let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
1108 if let Some(timeout) = self.timeout {
1109 tonic_request.set_timeout(timeout);
1110 }
1111 let response = self.inner.delete_range(tonic_request).await?;
1112 Ok(from_wire_delete_response(response.into_inner()))
1113 }
1114
1115 pub async fn delete_range_raw(
1117 &mut self,
1118 request: ObjectStoreRangeRequest,
1119 ) -> Result<DeleteResponse, GestaltError> {
1120 let mut tonic_request = tonic::Request::new(to_wire_object_store_range_request(request));
1121 if let Some(timeout) = self.timeout {
1122 tonic_request.set_timeout(timeout);
1123 }
1124 let response = self.inner.delete_range(tonic_request).await?;
1125 Ok(from_wire_delete_response(response.into_inner()))
1126 }
1127
1128 pub async fn index_get(
1132 &mut self,
1133 store: String,
1134 index: String,
1135 query: Option<IndexedDBQuery>,
1136 ) -> Result<RecordResponse, GestaltError> {
1137 let request = IndexQueryRequest {
1138 store,
1139 index,
1140 query,
1141 ..Default::default()
1142 };
1143 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1144 if let Some(timeout) = self.timeout {
1145 tonic_request.set_timeout(timeout);
1146 }
1147 let response = self.inner.index_get(tonic_request).await?;
1148 Ok(from_wire_record_response(response.into_inner()))
1149 }
1150
1151 pub async fn index_get_raw(
1155 &mut self,
1156 request: IndexQueryRequest,
1157 ) -> Result<RecordResponse, GestaltError> {
1158 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1159 if let Some(timeout) = self.timeout {
1160 tonic_request.set_timeout(timeout);
1161 }
1162 let response = self.inner.index_get(tonic_request).await?;
1163 Ok(from_wire_record_response(response.into_inner()))
1164 }
1165
1166 pub async fn index_get_key(
1168 &mut self,
1169 store: String,
1170 index: String,
1171 query: Option<IndexedDBQuery>,
1172 ) -> Result<KeyResponse, GestaltError> {
1173 let request = IndexQueryRequest {
1174 store,
1175 index,
1176 query,
1177 ..Default::default()
1178 };
1179 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1180 if let Some(timeout) = self.timeout {
1181 tonic_request.set_timeout(timeout);
1182 }
1183 let response = self.inner.index_get_key(tonic_request).await?;
1184 Ok(from_wire_key_response(response.into_inner()))
1185 }
1186
1187 pub async fn index_get_key_raw(
1189 &mut self,
1190 request: IndexQueryRequest,
1191 ) -> Result<KeyResponse, GestaltError> {
1192 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1193 if let Some(timeout) = self.timeout {
1194 tonic_request.set_timeout(timeout);
1195 }
1196 let response = self.inner.index_get_key(tonic_request).await?;
1197 Ok(from_wire_key_response(response.into_inner()))
1198 }
1199
1200 pub async fn index_get_all(
1202 &mut self,
1203 store: String,
1204 index: String,
1205 query: Option<IndexedDBQuery>,
1206 options: IndexedDBIndexGetAllOptions,
1207 ) -> Result<RecordsResponse, GestaltError> {
1208 let request = IndexQueryRequest {
1209 store,
1210 index,
1211 query,
1212 count: options.count,
1213 };
1214 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1215 if let Some(timeout) = self.timeout {
1216 tonic_request.set_timeout(timeout);
1217 }
1218 let response = self.inner.index_get_all(tonic_request).await?;
1219 Ok(from_wire_records_response(response.into_inner()))
1220 }
1221
1222 pub async fn index_get_all_raw(
1224 &mut self,
1225 request: IndexQueryRequest,
1226 ) -> Result<RecordsResponse, GestaltError> {
1227 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1228 if let Some(timeout) = self.timeout {
1229 tonic_request.set_timeout(timeout);
1230 }
1231 let response = self.inner.index_get_all(tonic_request).await?;
1232 Ok(from_wire_records_response(response.into_inner()))
1233 }
1234
1235 pub async fn index_get_all_keys(
1237 &mut self,
1238 store: String,
1239 index: String,
1240 query: Option<IndexedDBQuery>,
1241 options: IndexedDBIndexGetAllKeysOptions,
1242 ) -> Result<KeysResponse, GestaltError> {
1243 let request = IndexQueryRequest {
1244 store,
1245 index,
1246 query,
1247 count: options.count,
1248 };
1249 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1250 if let Some(timeout) = self.timeout {
1251 tonic_request.set_timeout(timeout);
1252 }
1253 let response = self.inner.index_get_all_keys(tonic_request).await?;
1254 Ok(from_wire_keys_response(response.into_inner()))
1255 }
1256
1257 pub async fn index_get_all_keys_raw(
1259 &mut self,
1260 request: IndexQueryRequest,
1261 ) -> Result<KeysResponse, GestaltError> {
1262 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1263 if let Some(timeout) = self.timeout {
1264 tonic_request.set_timeout(timeout);
1265 }
1266 let response = self.inner.index_get_all_keys(tonic_request).await?;
1267 Ok(from_wire_keys_response(response.into_inner()))
1268 }
1269
1270 pub async fn index_count(
1272 &mut self,
1273 store: String,
1274 index: String,
1275 query: Option<IndexedDBQuery>,
1276 ) -> Result<i64, GestaltError> {
1277 let request = IndexQueryRequest {
1278 store,
1279 index,
1280 query,
1281 ..Default::default()
1282 };
1283 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1284 if let Some(timeout) = self.timeout {
1285 tonic_request.set_timeout(timeout);
1286 }
1287 let response =
1288 from_wire_count_response(self.inner.index_count(tonic_request).await?.into_inner());
1289 Ok(response.count)
1290 }
1291
1292 pub async fn index_count_raw(
1294 &mut self,
1295 request: IndexQueryRequest,
1296 ) -> Result<CountResponse, GestaltError> {
1297 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1298 if let Some(timeout) = self.timeout {
1299 tonic_request.set_timeout(timeout);
1300 }
1301 let response = self.inner.index_count(tonic_request).await?;
1302 Ok(from_wire_count_response(response.into_inner()))
1303 }
1304
1305 pub async fn index_delete(
1307 &mut self,
1308 store: String,
1309 index: String,
1310 query: Option<IndexedDBQuery>,
1311 ) -> Result<DeleteResponse, GestaltError> {
1312 let request = IndexQueryRequest {
1313 store,
1314 index,
1315 query,
1316 ..Default::default()
1317 };
1318 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1319 if let Some(timeout) = self.timeout {
1320 tonic_request.set_timeout(timeout);
1321 }
1322 let response = self.inner.index_delete(tonic_request).await?;
1323 Ok(from_wire_delete_response(response.into_inner()))
1324 }
1325
1326 pub async fn index_delete_raw(
1328 &mut self,
1329 request: IndexQueryRequest,
1330 ) -> Result<DeleteResponse, GestaltError> {
1331 let mut tonic_request = tonic::Request::new(to_wire_index_query_request(request));
1332 if let Some(timeout) = self.timeout {
1333 tonic_request.set_timeout(timeout);
1334 }
1335 let response = self.inner.index_delete(tonic_request).await?;
1336 Ok(from_wire_delete_response(response.into_inner()))
1337 }
1338
1339 pub async fn open_cursor(
1343 &mut self,
1344 requests: impl tokio_stream::Stream<Item = CursorClientMessage> + Send + 'static,
1345 ) -> Result<IndexedDBOpenCursorStream, GestaltError> {
1346 let response = self
1347 .inner
1348 .open_cursor(requests.map(to_wire_cursor_client_message))
1349 .await?;
1350 Ok(IndexedDBOpenCursorStream {
1351 inner: response.into_inner(),
1352 })
1353 }
1354
1355 pub async fn transaction(
1360 &mut self,
1361 requests: impl tokio_stream::Stream<Item = TransactionClientMessage> + Send + 'static,
1362 ) -> Result<IndexedDBTransactionStream, GestaltError> {
1363 let response = self
1364 .inner
1365 .transaction(requests.map(to_wire_transaction_client_message))
1366 .await?;
1367 Ok(IndexedDBTransactionStream {
1368 inner: response.into_inner(),
1369 })
1370 }
1371}
1372
1373#[derive(Clone, Debug, Default)]
1376pub struct IndexedDBGetAllOptions {
1377 pub count: Option<u32>,
1379}
1380
1381#[derive(Clone, Debug, Default)]
1384pub struct IndexedDBGetAllKeysOptions {
1385 pub count: Option<u32>,
1387}
1388
1389#[derive(Clone, Debug, Default)]
1392pub struct IndexedDBIndexGetAllOptions {
1393 pub count: Option<u32>,
1395}
1396
1397#[derive(Clone, Debug, Default)]
1400pub struct IndexedDBIndexGetAllKeysOptions {
1401 pub count: Option<u32>,
1403}
1404
1405pub struct IndexedDBOpenCursorStream {
1409 inner: tonic::Streaming<v1::CursorResponse>,
1410}
1411
1412impl IndexedDBOpenCursorStream {
1413 pub async fn recv(&mut self) -> Result<Option<CursorResponse>, GestaltError> {
1415 Ok(self.inner.message().await?.map(from_wire_cursor_response))
1416 }
1417}
1418
1419pub struct IndexedDBTransactionStream {
1424 inner: tonic::Streaming<v1::TransactionServerMessage>,
1425}
1426
1427impl IndexedDBTransactionStream {
1428 pub async fn recv(&mut self) -> Result<Option<TransactionServerMessage>, GestaltError> {
1430 Ok(self
1431 .inner
1432 .message()
1433 .await?
1434 .map(from_wire_transaction_server_message))
1435 }
1436}