use our retrieve status as isOnline status

pull/1744/head
Audric Ackermann 4 years ago
parent 19555b99a0
commit e85f69a144
No known key found for this signature in database
GPG Key ID: 999F434D76324AD4

@ -450,7 +450,6 @@
}, window.CONSTANTS.NOTIFICATION_ENABLE_TIMEOUT_SECONDS * 1000); }, window.CONSTANTS.NOTIFICATION_ENABLE_TIMEOUT_SECONDS * 1000);
window.NewReceiver.queueAllCached(); window.NewReceiver.queueAllCached();
window.libsession.Utils.AttachmentDownloads.start({ window.libsession.Utils.AttachmentDownloads.start({
logger: window.log, logger: window.log,
}); });

@ -7,7 +7,6 @@ import { openConversationExternal } from '../state/ducks/conversations';
import { LeftPaneContactSection } from './session/LeftPaneContactSection'; import { LeftPaneContactSection } from './session/LeftPaneContactSection';
import { LeftPaneSettingSection } from './session/LeftPaneSettingSection'; import { LeftPaneSettingSection } from './session/LeftPaneSettingSection';
import { SessionTheme } from '../state/ducks/SessionTheme'; import { SessionTheme } from '../state/ducks/SessionTheme';
import { SessionOffline } from './session/network/SessionOffline';
import { SessionExpiredWarning } from './session/network/SessionExpiredWarning'; import { SessionExpiredWarning } from './session/network/SessionExpiredWarning';
import { getFocusedSection } from '../state/selectors/section'; import { getFocusedSection } from '../state/selectors/section';
import { useDispatch, useSelector } from 'react-redux'; import { useDispatch, useSelector } from 'react-redux';
@ -44,7 +43,6 @@ const InnerLeftPaneMessageSection = (props: { isExpired: boolean }) => {
return ( return (
<> <>
<SessionOffline />
{props.isExpired && <SessionExpiredWarning />} {props.isExpired && <SessionExpiredWarning />}
<LeftPaneMessageSection <LeftPaneMessageSection
theme={theme} theme={theme}
@ -74,7 +72,6 @@ const InnerLeftPaneContactSection = () => {
return ( return (
<> <>
<SessionOffline />
<LeftPaneContactSection <LeftPaneContactSection
openConversationExternal={(id, messageId) => openConversationExternal={(id, messageId) =>
dispatch(openConversationExternal(id, messageId)) dispatch(openConversationExternal(id, messageId))

@ -20,11 +20,10 @@ import { onionPathModal } from '../state/ducks/modalDialog';
import { import {
getFirstOnionPath, getFirstOnionPath,
getFirstOnionPathLength, getFirstOnionPathLength,
getIsOnline,
getOnionPathsCount, getOnionPathsCount,
} from '../state/selectors/onions'; } from '../state/selectors/onions';
// tslint:disable-next-line: no-submodule-imports
import useNetworkState from 'react-use/lib/useNetworkState';
import { SessionSpinner } from './session/SessionSpinner'; import { SessionSpinner } from './session/SessionSpinner';
import { Flex } from './basic/Flex'; import { Flex } from './basic/Flex';
@ -36,9 +35,10 @@ export type StatusLightType = {
const OnionPathModalInner = () => { const OnionPathModalInner = () => {
const onionPath = useSelector(getFirstOnionPath); const onionPath = useSelector(getFirstOnionPath);
const isOnline = useSelector(getIsOnline);
// including the device and destination in calculation // including the device and destination in calculation
const glowDuration = onionPath.length + 2; const glowDuration = onionPath.length + 2;
if (!onionPath || onionPath.length === 0) { if (!isOnline || !onionPath || onionPath.length === 0) {
return <SessionSpinner loading={true} />; return <SessionSpinner loading={true} />;
} }
@ -144,7 +144,7 @@ export const ActionPanelOnionStatusLight = (props: {
const theme = useTheme(); const theme = useTheme();
const onionPathsCount = useSelector(getOnionPathsCount); const onionPathsCount = useSelector(getOnionPathsCount);
const firstPathLength = useSelector(getFirstOnionPathLength); const firstPathLength = useSelector(getFirstOnionPathLength);
const isOnline = useNetworkState().online; const isOnline = useSelector(getIsOnline);
// Set icon color based on result // Set icon color based on result
const red = theme.colors.destructive; const red = theme.colors.destructive;

@ -1,36 +0,0 @@
import React from 'react';
// tslint:disable-next-line: no-submodule-imports
import useNetworkState from 'react-use/lib/useNetworkState';
import styled from 'styled-components';
type ContainerProps = {
show: boolean;
};
const OfflineContainer = styled.div<ContainerProps>`
background: ${props => props.theme.colors.accent};
color: ${props => props.theme.colors.textColor};
padding: ${props => (props.show ? props.theme.common.margins.sm : '0px')};
margin: ${props => (props.show ? props.theme.common.margins.xs : '0px')};
height: ${props => (props.show ? 'auto' : '0px')};
overflow: hidden;
transition: ${props => props.theme.common.animations.defaultDuration};
`;
const OfflineTitle = styled.h3`
padding-top: 0px;
margin-top: 0px;
`;
const OfflineMessage = styled.div``;
export const SessionOffline = () => {
const isOnline = useNetworkState().online;
return (
<OfflineContainer show={!isOnline}>
<OfflineTitle>{window.i18n('offline')}</OfflineTitle>
<OfflineMessage>{window.i18n('checkNetworkConnection')}</OfflineMessage>
</OfflineContainer>
);
};

@ -179,7 +179,7 @@ export const sendViaOnion = async (
{ {
retries: 9, // each path can fail 3 times before being dropped, we have 3 paths at most retries: 9, // each path can fail 3 times before being dropped, we have 3 paths at most
factor: 2, factor: 2,
minTimeout: 1000, minTimeout: 100,
maxTimeout: 4000, maxTimeout: 4000,
onFailedAttempt: e => { onFailedAttempt: e => {
window?.log?.warn( window?.log?.warn(

@ -24,11 +24,14 @@ import {
toHex, toHex,
} from '../utils/String'; } from '../utils/String';
import { Snode } from '../../data/data'; import { Snode } from '../../data/data';
import { updateIsOnline } from '../../state/ducks/onion';
// ONS name can have [a-zA-Z0-9_-] except that - is not allowed as start or end // ONS name can have [a-zA-Z0-9_-] except that - is not allowed as start or end
// do not define a regex but rather create it on the fly to avoid https://stackoverflow.com/questions/3891641/regex-test-only-works-every-other-time // do not define a regex but rather create it on the fly to avoid https://stackoverflow.com/questions/3891641/regex-test-only-works-every-other-time
export const onsNameRegex = '^\\w([\\w-]*[\\w])?$'; export const onsNameRegex = '^\\w([\\w-]*[\\w])?$';
export const ERROR_CODE_NO_CONNECT = 'ENETUNREACH: No network connection.';
const getSslAgentForSeedNode = (seedNodeHost: string, isSsl = false) => { const getSslAgentForSeedNode = (seedNodeHost: string, isSsl = false) => {
let filePrefix = ''; let filePrefix = '';
let pubkey256 = ''; let pubkey256 = '';
@ -527,9 +530,12 @@ export async function retrieveNextMessages(
try { try {
const json = JSON.parse(result.body); const json = JSON.parse(result.body);
window.inboxStore?.dispatch(updateIsOnline(true));
return json.messages || []; return json.messages || [];
} catch (e) { } catch (e) {
window?.log?.warn('exception while parsing json of nextMessage:', e); window?.log?.warn('exception while parsing json of nextMessage:', e);
window.inboxStore?.dispatch(updateIsOnline(true));
return []; return [];
} }
@ -538,6 +544,11 @@ export async function retrieveNextMessages(
'Got an error while retrieving next messages. Not retrying as we trigger fetch often:', 'Got an error while retrieving next messages. Not retrying as we trigger fetch often:',
e e
); );
if (e.message === ERROR_CODE_NO_CONNECT) {
window.inboxStore?.dispatch(updateIsOnline(false));
} else {
window.inboxStore?.dispatch(updateIsOnline(true));
}
return []; return [];
} }
} }

@ -13,6 +13,7 @@ import { hrefPnServerDev, hrefPnServerProd } from '../../pushnotification/PnServ
let snodeFailureCount: Record<string, number> = {}; let snodeFailureCount: Record<string, number> = {};
import { Snode } from '../../data/data'; import { Snode } from '../../data/data';
import { ERROR_CODE_NO_CONNECT } from './SNodeAPI';
// tslint:disable-next-line: variable-name // tslint:disable-next-line: variable-name
export const TEST_resetSnodeFailureCount = () => { export const TEST_resetSnodeFailureCount = () => {
@ -783,6 +784,7 @@ const sendOnionRequest = async ({
// we are talking to a snode... // we are talking to a snode...
agent: snodeHttpsAgent, agent: snodeHttpsAgent,
abortSignal, abortSignal,
timeout: 5000,
}; };
const guardUrl = `https://${guardNode.ip}:${guardNode.port}/onion_req/v2`; const guardUrl = `https://${guardNode.ip}:${guardNode.port}/onion_req/v2`;
@ -859,7 +861,7 @@ export async function lokiOnionFetch(
return onionFetchRetryable(targetNode, body, associatedWith); return onionFetchRetryable(targetNode, body, associatedWith);
}, },
{ {
retries: 9, retries: 4,
factor: 1, factor: 1,
minTimeout: 1000, minTimeout: 1000,
maxTimeout: 2000, maxTimeout: 2000,
@ -875,6 +877,10 @@ export async function lokiOnionFetch(
} catch (e) { } catch (e) {
window?.log?.warn('onionFetchRetryable failed ', e); window?.log?.warn('onionFetchRetryable failed ', e);
// console.warn('error to show to user'); // console.warn('error to show to user');
if (e?.errno === 'ENETUNREACH') {
// better handle the no connection state
throw new Error(ERROR_CODE_NO_CONNECT);
}
throw e; throw e;
} }
} }

@ -51,7 +51,6 @@ export const getSwarmPollingInstance = () => {
}; };
export class SwarmPolling { export class SwarmPolling {
private ourPubkey: PubKey | undefined;
private groupPolling: Array<{ pubkey: PubKey; lastPolledTimestamp: number }>; private groupPolling: Array<{ pubkey: PubKey; lastPolledTimestamp: number }>;
private readonly lastHashes: { [key: string]: PubkeyToHash }; private readonly lastHashes: { [key: string]: PubkeyToHash };
@ -61,7 +60,6 @@ export class SwarmPolling {
} }
public async start(waitForFirstPoll = false): Promise<void> { public async start(waitForFirstPoll = false): Promise<void> {
this.ourPubkey = UserUtils.getOurPubKeyFromCache();
this.loadGroupIds(); this.loadGroupIds();
if (waitForFirstPoll) { if (waitForFirstPoll) {
await this.TEST_pollForAllKeys(); await this.TEST_pollForAllKeys();
@ -74,7 +72,6 @@ export class SwarmPolling {
* Used fo testing only * Used fo testing only
*/ */
public TEST_reset() { public TEST_reset() {
this.ourPubkey = undefined;
this.groupPolling = []; this.groupPolling = [];
} }
@ -88,10 +85,6 @@ export class SwarmPolling {
public removePubkey(pk: PubKey | string) { public removePubkey(pk: PubKey | string) {
const pubkey = PubKey.cast(pk); const pubkey = PubKey.cast(pk);
window?.log?.info('Swarm removePubkey: removing pubkey from polling', pubkey.key); window?.log?.info('Swarm removePubkey: removing pubkey from polling', pubkey.key);
if (this.ourPubkey && PubKey.cast(pk).isEqual(this.ourPubkey)) {
this.ourPubkey = undefined;
}
this.groupPolling = this.groupPolling.filter(group => !pubkey.isEqual(group.pubkey)); this.groupPolling = this.groupPolling.filter(group => !pubkey.isEqual(group.pubkey));
} }
@ -132,9 +125,8 @@ export class SwarmPolling {
*/ */
public async TEST_pollForAllKeys() { public async TEST_pollForAllKeys() {
// we always poll as often as possible for our pubkey // we always poll as often as possible for our pubkey
const directPromise = this.ourPubkey const ourPubkey = UserUtils.getOurPubKeyFromCache();
? this.TEST_pollOnceForKey(this.ourPubkey, false) const directPromise = this.TEST_pollOnceForKey(ourPubkey, false);
: Promise.resolve();
const now = Date.now(); const now = Date.now();
const groupPromises = this.groupPolling.map(async group => { const groupPromises = this.groupPolling.map(async group => {

@ -3,10 +3,12 @@ import { Snode } from '../../data/data';
export type OnionState = { export type OnionState = {
snodePaths: Array<Array<Snode>>; snodePaths: Array<Array<Snode>>;
isOnline: boolean;
}; };
export const initialOnionPathState = { export const initialOnionPathState = {
snodePaths: new Array<Array<Snode>>(), snodePaths: new Array<Array<Snode>>(),
isOnline: false,
}; };
/** /**
@ -17,12 +19,15 @@ const onionSlice = createSlice({
initialState: initialOnionPathState, initialState: initialOnionPathState,
reducers: { reducers: {
updateOnionPaths(state: OnionState, action: PayloadAction<Array<Array<Snode>>>) { updateOnionPaths(state: OnionState, action: PayloadAction<Array<Array<Snode>>>) {
return { snodePaths: action.payload }; return { ...state, snodePaths: action.payload };
},
updateIsOnline(state: OnionState, action: PayloadAction<boolean>) {
return { ...state, isOnline: action.payload };
}, },
}, },
}); });
// destructures // destructures
const { actions, reducer } = onionSlice; const { actions, reducer } = onionSlice;
export const { updateOnionPaths } = actions; export const { updateOnionPaths, updateIsOnline } = actions;
export const defaultOnionReducer = reducer; export const defaultOnionReducer = reducer;

@ -21,3 +21,8 @@ export const getFirstOnionPathLength = createSelector(
getFirstOnionPath, getFirstOnionPath,
(state: Array<Snode>): number => state.length || 0 (state: Array<Snode>): number => state.length || 0
); );
export const getIsOnline = createSelector(
getOnionPaths,
(state: OnionState): boolean => state.isOnline
);

Loading…
Cancel
Save