Skip to content

Commit 0919a60

Browse files
committed
Simplify pools cache to only rely on the store
1 parent d3155d3 commit 0919a60

File tree

3 files changed

+30
-70
lines changed

3 files changed

+30
-70
lines changed

mithril-explorer/src/app/page.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import SnapshotsList from '../components/Artifacts/SnapshotsList';
1111
import MithrilStakeDistributionsList from "../components/Artifacts/MithrilStakeDistributionsList";
1212
import {aggregatorSearchParam} from "../constants";
1313
import {selectAggregator, selectedAggregator as currentlySelectedAggregator} from "../store/settingsSlice";
14-
import {refreshPoolsCaches, updatePoolsForAggregator} from "../store/poolsSlice";
14+
import {updatePoolsForAggregator} from "../store/poolsSlice";
1515

1616
// Disable SSR for the following components since they use data from the store that are not
1717
// available server sides (because those data can be read from the local storage).
@@ -39,7 +39,6 @@ export default function Explorer() {
3939
router.push("?" + params.toString(), undefined, {shallow: true});
4040
}
4141

42-
dispatch(refreshPoolsCaches());
4342
dispatch(updatePoolsForAggregator(selectedAggregator));
4443
}, [selectedAggregator]);
4544

mithril-explorer/src/app/registrations/page.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import {Alert, ButtonGroup, Col, Row, Spinner, Stack, Table} from "react-bootstr
88
import {ArcElement, BarElement, CategoryScale, Chart, Legend, LinearScale, Title, Tooltip} from 'chart.js';
99
import {Bar, Pie} from "react-chartjs-2";
1010
import {aggregatorSearchParam} from "../../constants";
11+
import {updatePoolsForAggregator} from "../../store/poolsSlice";
1112
import LinkButton from "../../components/LinkButton";
1213
import Stake from "../../components/Stake";
1314
import RawJsonButton from "../../components/RawJsonButton";
1415
import VerifiedBadge from "../../components/VerifiedBadge";
1516
import PoolTicker from "../../components/PoolTicker";
16-
import {refreshPoolsCaches, updatePoolsForAggregator} from "../../store/poolsSlice";
1717
import PartyId from "../../components/PartyId";
1818

1919
Chart.register(
@@ -80,7 +80,6 @@ export default function Registrations() {
8080
console.error("Fetch current epoch in epoch-settings error:", error);
8181
});
8282

83-
dispatch(refreshPoolsCaches());
8483
dispatch(updatePoolsForAggregator(aggregator));
8584
} else {
8685
setCurrentError(error);

mithril-explorer/src/store/poolsSlice.js

Lines changed: 28 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,22 @@
11
import {createAsyncThunk, createSelector, createSlice} from "@reduxjs/toolkit";
22

3-
const CACHE_NAME = "v1";
43
// Delete all caches older than 6 hours
54
const cacheRefreshIntervalInMilliseconds = 6 * 3600 * 1000;
65

76
export const poolsSlice = createSlice({
87
name: 'pools',
98
initialState: { list: [] },
10-
reducers: {
11-
refreshPoolsCaches: (state) => {
12-
const now = Date.now();
13-
for (const entry of state.list.map(p => ({date: p.date, url: poolTickersUrl(p.aggregator)}))) {
14-
const millisecondsSinceLastRefresh = now - entry.date;
15-
16-
if (millisecondsSinceLastRefresh > cacheRefreshIntervalInMilliseconds) {
17-
caches.open(CACHE_NAME).then(async (cache) => {
18-
const deletionSuccessful = await cache.delete(entry.url);
19-
if (!deletionSuccessful) {
20-
console.error(`Failed to delete cache: ${entry.url}`);
21-
}
22-
});
23-
}
24-
}
25-
}
26-
},
9+
reducers: {},
2710
extraReducers: builder => builder.addCase(updatePoolsForAggregator.fulfilled, (state, action) => {
28-
let existing = poolsForAggregator(state, action.payload.aggregator);
11+
if (action.payload.keep_cached_data) {
12+
return;
13+
}
14+
const existing = poolsForAggregator(state, action.payload.aggregator);
2915

3016
if (existing) {
3117
existing.network = action.payload.network;
3218
existing.pools = action.payload.pools;
19+
existing.date = action.payload.date;
3320
} else {
3421
state.list.push({
3522
aggregator: action.payload.aggregator,
@@ -41,61 +28,36 @@ export const poolsSlice = createSlice({
4128
})
4229
});
4330

44-
export const {
45-
refreshPoolsCaches
46-
} = poolsSlice.actions;
31+
export const updatePoolsForAggregator = createAsyncThunk('pools/updateForAggregator', (aggregator, thunkAPI) => {
32+
const state = thunkAPI.getState();
33+
const aggregatorPools = poolsForAggregator(state.pools, aggregator);
34+
const now = Date.now();
4735

48-
const poolTickersUrl = aggregator => `${aggregator}/signers/tickers`;
36+
const millisecondsSinceLastRefresh = now - (aggregatorPools?.date ?? 0);
4937

50-
export const updatePoolsForAggregator = createAsyncThunk('pools/updateForAggregator', aggregator => {
51-
const url = poolTickersUrl(aggregator);
52-
return caches.match(url)
53-
.then(cached => {
54-
// Cache hit
55-
if (cached) {
56-
return cached;
57-
}
38+
if (millisecondsSinceLastRefresh > cacheRefreshIntervalInMilliseconds) {
39+
return fetch(`${aggregator}/signers/tickers`)
40+
.then(response => response.status === 200 ? response.json() : {})
41+
.then(data => {
42+
return {
43+
aggregator: aggregator,
44+
date: now,
45+
network: data.network,
46+
pools: data.signers ?? [],
47+
};
48+
});
49+
}
5850

59-
// Cache miss
60-
return fetch(url).then(response => {
61-
if (response.status === 200) {
62-
caches.open(CACHE_NAME).then(async (cache) => {
63-
const putSuccessful = await cache.put(url, response);
64-
if (!putSuccessful) {
65-
console.error(`Failed to put cache: ${url}`);
66-
}
67-
});
68-
}
69-
return response.clone();
70-
})
71-
})
72-
.then(response => response.status === 200 ? response.json() : {})
73-
.then(data => {
74-
return {
75-
aggregator: aggregator,
76-
date: Date.now(),
77-
network: data.network,
78-
pools: data.signers ?? [],
79-
};
80-
});
51+
return { keep_cached_data: true };
8152
});
8253

83-
const poolsForAggregator = createSelector( [
84-
state => state.pools,
85-
(state, aggregator) => aggregator
86-
],
87-
(pools, aggregator) => {
88-
return pools.list.find(poolsData => poolsData.aggregator === aggregator);
89-
}
90-
);
54+
const poolsForAggregator = (poolsSlice, aggregator) => {
55+
return poolsSlice.list.find(poolsData => poolsData.aggregator === aggregator);
56+
}
9157

9258
export const getPool = createSelector([
9359
state => state.pools,
94-
(state, aggregator, poolId) => {
95-
return {
96-
aggregator: aggregator,
97-
poolId: poolId
98-
}},
60+
(state, aggregator, poolId) => ({ aggregator: aggregator, poolId: poolId, }),
9961
],
10062
(pools, args) => {
10163
const aggregator = poolsForAggregator(pools, args.aggregator);

0 commit comments

Comments
 (0)