feat(gui): Switch to up-to-date asb, if current one is outdated (#189)

This commit is contained in:
binarybaron 2024-11-17 23:14:36 +01:00 committed by GitHub
parent ba0b7ac893
commit aa81f3c588
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 40 additions and 34 deletions

View file

@ -3,7 +3,7 @@ import { ExtendedProviderStatus, ProviderStatus } from "models/apiModel";
import { Seller } from "models/tauriModel"; import { Seller } from "models/tauriModel";
import { getStubTestnetProvider } from "store/config"; import { getStubTestnetProvider } from "store/config";
import { rendezvousSellerToProviderStatus } from "utils/conversionUtils"; import { rendezvousSellerToProviderStatus } from "utils/conversionUtils";
import { isProviderCompatible } from "utils/multiAddrUtils"; import { isProviderOutdated } from "utils/multiAddrUtils";
import { sortProviderList } from "utils/sortUtils"; import { sortProviderList } from "utils/sortUtils";
const stubTestnetProvider = getStubTestnetProvider(); const stubTestnetProvider = getStubTestnetProvider();
@ -37,13 +37,21 @@ function selectNewSelectedProvider(
): ProviderStatus { ): ProviderStatus {
const selectedPeerId = peerId || slice.selectedProvider?.peerId; const selectedPeerId = peerId || slice.selectedProvider?.peerId;
return ( // Check if we still have a record of the currently selected provider
slice.registry.providers?.find((prov) => prov.peerId === selectedPeerId) || const currentProvider = slice.registry.providers?.find((prov) => prov.peerId === selectedPeerId) || slice.rendezvous.providers.find((prov) => prov.peerId === selectedPeerId);
slice.rendezvous.providers.find((prov) => prov.peerId === selectedPeerId) ||
slice.registry.providers?.at(0) || // If the currently selected provider is not outdated, keep it
slice.rendezvous.providers[0] || if (currentProvider != null && !isProviderOutdated(currentProvider)) {
null return currentProvider;
); }
// Otherwise we'd prefer to switch to a provider that has the newest version
const providers = sortProviderList([
...(slice.registry.providers ?? []),
...(slice.rendezvous.providers ?? []),
]);
return providers.at(0) || null;
} }
export const providersSlice = createSlice({ export const providersSlice = createSlice({
@ -61,13 +69,6 @@ export const providersSlice = createSlice({
} }
// If the provider was already discovered via the public registry, don't add it again // If the provider was already discovered via the public registry, don't add it again
if (
!slice.registry.providers?.some(
(prov) =>
prov.peerId === discoveredProviderStatus.peerId &&
prov.multiAddr === discoveredProviderStatus.multiAddr,
)
) {
const indexOfExistingProvider = slice.rendezvous.providers.findIndex( const indexOfExistingProvider = slice.rendezvous.providers.findIndex(
(prov) => (prov) =>
prov.peerId === discoveredProviderStatus.peerId && prov.peerId === discoveredProviderStatus.peerId &&
@ -81,9 +82,9 @@ export const providersSlice = createSlice({
} else { } else {
slice.rendezvous.providers.push(discoveredProviderStatus); slice.rendezvous.providers.push(discoveredProviderStatus);
} }
}
}); });
// Sort the provider list and select a new provider if needed
slice.rendezvous.providers = sortProviderList(slice.rendezvous.providers); slice.rendezvous.providers = sortProviderList(slice.rendezvous.providers);
slice.selectedProvider = selectNewSelectedProvider(slice); slice.selectedProvider = selectNewSelectedProvider(slice);
}, },
@ -95,9 +96,8 @@ export const providersSlice = createSlice({
action.payload.push(stubTestnetProvider); action.payload.push(stubTestnetProvider);
} }
slice.registry.providers = sortProviderList(action.payload).filter( // Sort the provider list and select a new provider if needed
isProviderCompatible, slice.registry.providers = sortProviderList(action.payload);
);
slice.selectedProvider = selectNewSelectedProvider(slice); slice.selectedProvider = selectNewSelectedProvider(slice);
}, },
registryConnectionFailed(slice) { registryConnectionFailed(slice) {

View file

@ -11,7 +11,7 @@ export function providerToConcatenatedMultiAddr(provider: Provider) {
.toString(); .toString();
} }
export function isProviderCompatible( export function isProviderOnCorrectNetwork(
provider: ExtendedProviderStatus, provider: ExtendedProviderStatus,
): boolean { ): boolean {
return provider.testnet === isTestnet(); return provider.testnet === isTestnet();

View file

@ -1,10 +1,12 @@
import { ExtendedProviderStatus } from "models/apiModel"; import { ExtendedProviderStatus } from "models/apiModel";
import { isProviderCompatible, isProviderOutdated } from "./multiAddrUtils"; import { isProviderOnCorrectNetwork, isProviderOutdated } from "./multiAddrUtils";
export function sortProviderList(list: ExtendedProviderStatus[]) { export function sortProviderList(list: ExtendedProviderStatus[]) {
return list return list
.filter(isProviderCompatible) // Filter out providers that are on the wrong network (testnet / mainnet)
.filter(isProviderOnCorrectNetwork)
.concat() .concat()
// Sort by criteria
.sort((firstEl, secondEl) => { .sort((firstEl, secondEl) => {
// If either provider is outdated, prioritize the one that isn't // If either provider is outdated, prioritize the one that isn't
if (isProviderOutdated(firstEl) && !isProviderOutdated(secondEl)) return 1; if (isProviderOutdated(firstEl) && !isProviderOutdated(secondEl)) return 1;
@ -24,5 +26,9 @@ export function sortProviderList(list: ExtendedProviderStatus[]) {
return -1; return -1;
} }
return 1; return 1;
}); })
// Remove duplicate providers
.filter((provider, index, self) =>
index === self.findIndex((p) => p.peerId === provider.peerId)
)
} }