1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
use crate::error::*;
use crate::storage::{ClientRemoteTabs, RemoteTab, TabsStorage};
use crate::sync::store::TabsStore;
use interrupt_support::NeverInterrupts;
use std::cell::{Cell, RefCell};
use sync15::{sync_multiple, telemetry, KeyBundle, MemoryCachedState, Sync15StorageClientInit};
pub struct TabsEngine {
pub storage: TabsStorage,
mem_cached_state: Cell<MemoryCachedState>,
}
impl Default for TabsEngine {
fn default() -> Self {
Self::new()
}
}
impl TabsEngine {
pub fn new() -> Self {
Self {
storage: TabsStorage::new(),
mem_cached_state: Cell::default(),
}
}
pub fn update_local_state(&mut self, local_state: Vec<RemoteTab>) {
self.storage.update_local_state(local_state);
}
pub fn remote_tabs(&self) -> Option<Vec<ClientRemoteTabs>> {
self.storage.get_remote_tabs()
}
pub fn sync(
&self,
storage_init: &Sync15StorageClientInit,
root_sync_key: &KeyBundle,
local_id: &str,
) -> Result<telemetry::SyncTelemetryPing> {
let mut mem_cached_state = self.mem_cached_state.take();
let mut store = TabsStore::new(&self.storage);
store.local_id = RefCell::new(local_id.to_owned());
let mut result = sync_multiple(
&[&store],
&mut None,
&mut mem_cached_state,
storage_init,
root_sync_key,
&NeverInterrupts,
None,
);
if let Err(e) = result.result {
return Err(e.into());
}
match result.engine_results.remove("tabs") {
None | Some(Ok(())) => Ok(result.telemetry),
Some(Err(e)) => Err(e.into()),
}
}
}