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 { getStubTestnetProvider } from "store/config";
import { rendezvousSellerToProviderStatus } from "utils/conversionUtils";
import { isProviderCompatible } from "utils/multiAddrUtils";
import { isProviderOutdated } from "utils/multiAddrUtils";
import { sortProviderList } from "utils/sortUtils";
const stubTestnetProvider = getStubTestnetProvider();
@ -37,13 +37,21 @@ function selectNewSelectedProvider(
): ProviderStatus {
const selectedPeerId = peerId || slice.selectedProvider?.peerId;
return (
slice.registry.providers?.find((prov) => prov.peerId === selectedPeerId) ||
slice.rendezvous.providers.find((prov) => prov.peerId === selectedPeerId) ||
slice.registry.providers?.at(0) ||
slice.rendezvous.providers[0] ||
null
);
// Check if we still have a record of the currently selected provider
const currentProvider = slice.registry.providers?.find((prov) => prov.peerId === selectedPeerId) || slice.rendezvous.providers.find((prov) => prov.peerId === selectedPeerId);
// If the currently selected provider is not outdated, keep it
if (currentProvider != null && !isProviderOutdated(currentProvider)) {
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({
@ -61,29 +69,22 @@ export const providersSlice = createSlice({
}
// 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(
(prov) =>
prov.peerId === discoveredProviderStatus.peerId &&
prov.multiAddr === discoveredProviderStatus.multiAddr,
);
const indexOfExistingProvider = slice.rendezvous.providers.findIndex(
(prov) =>
prov.peerId === discoveredProviderStatus.peerId &&
prov.multiAddr === discoveredProviderStatus.multiAddr,
);
// Avoid duplicate entries, replace them instead
if (indexOfExistingProvider !== -1) {
slice.rendezvous.providers[indexOfExistingProvider] =
discoveredProviderStatus;
} else {
slice.rendezvous.providers.push(discoveredProviderStatus);
}
// Avoid duplicate entries, replace them instead
if (indexOfExistingProvider !== -1) {
slice.rendezvous.providers[indexOfExistingProvider] =
discoveredProviderStatus;
} else {
slice.rendezvous.providers.push(discoveredProviderStatus);
}
});
// Sort the provider list and select a new provider if needed
slice.rendezvous.providers = sortProviderList(slice.rendezvous.providers);
slice.selectedProvider = selectNewSelectedProvider(slice);
},
@ -95,9 +96,8 @@ export const providersSlice = createSlice({
action.payload.push(stubTestnetProvider);
}
slice.registry.providers = sortProviderList(action.payload).filter(
isProviderCompatible,
);
// Sort the provider list and select a new provider if needed
slice.registry.providers = sortProviderList(action.payload);
slice.selectedProvider = selectNewSelectedProvider(slice);
},
registryConnectionFailed(slice) {

View file

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

View file

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