summaryrefslogtreecommitdiffhomepage
path: root/gui
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2018-09-10 16:07:29 +0300
committerAndrej Mihajlov <and@mullvad.net>2018-09-10 17:56:02 +0300
commit80956fb4d5489c602139f9a019e06fa6ebacdf87 (patch)
treef40843a4c97addfe571151188fbddd068798d840 /gui
parent802bc64af347069b1d29ba982bbbac7fd812cc79 (diff)
downloadmullvadvpn-80956fb4d5489c602139f9a019e06fa6ebacdf87.tar.xz
mullvadvpn-80956fb4d5489c602139f9a019e06fa6ebacdf87.zip
Add TunnelStateTransition and TunnelState enum
Diffstat (limited to 'gui')
-rw-r--r--gui/packages/desktop/src/renderer/app.js42
-rw-r--r--gui/packages/desktop/src/renderer/components/Connect.js2
-rw-r--r--gui/packages/desktop/src/renderer/lib/daemon-rpc.js65
-rw-r--r--gui/packages/desktop/src/renderer/redux/connection/reducers.js10
4 files changed, 50 insertions, 69 deletions
diff --git a/gui/packages/desktop/src/renderer/app.js b/gui/packages/desktop/src/renderer/app.js
index 7bf5cdf534..18c29f9f20 100644
--- a/gui/packages/desktop/src/renderer/app.js
+++ b/gui/packages/desktop/src/renderer/app.js
@@ -28,13 +28,15 @@ import windowActions from './redux/window/actions';
import type { WindowShapeParameters } from '../main/window-controller';
import type {
+ AccountToken,
+ TunnelStateTransition,
+ RelaySettingsUpdate,
+ TunnelState,
DaemonRpcProtocol,
AccountData,
ConnectionObserver as DaemonConnectionObserver,
} from './lib/daemon-rpc';
import type { ReduxStore } from './redux/store';
-import type { AccountToken, TunnelState, RelaySettingsUpdate } from './lib/daemon-rpc';
-import type { ConnectionState } from './redux/connection/reducers';
import type { TrayIconType } from '../main/tray-icon-controller';
export default class AppRenderer {
@@ -51,7 +53,7 @@ export default class AppRenderer {
});
_connectedToDaemon = false;
_accountToken: ?AccountToken;
- _tunnelState: ?TunnelState;
+ _tunnelState: ?TunnelStateTransition;
constructor() {
const store = configureStore(null, this._memoryHistory);
@@ -545,17 +547,17 @@ export default class AppRenderer {
]);
}
- _onChangeTunnelState(tunnelState: TunnelState) {
+ _onChangeTunnelState(tunnelState: TunnelStateTransition) {
this._tunnelState = tunnelState;
this._updateConnectionStatus(tunnelState);
- this._updateConnectionLocation(tunnelState.state);
+ this._updateUserLocation(tunnelState.state);
this._updateTrayIcon(tunnelState.state);
this._showNotification(tunnelState.state);
}
- async _updateConnectionLocation(connectionState: ConnectionState) {
- if (connectionState === 'connecting' || connectionState === 'disconnected') {
+ async _updateUserLocation(tunnelState: TunnelState) {
+ if (tunnelState === 'connecting' || tunnelState === 'disconnected') {
try {
await this._fetchLocation();
} catch (error) {
@@ -564,43 +566,49 @@ export default class AppRenderer {
}
}
- _updateConnectionStatus(tunnelState: TunnelState) {
+ _updateConnectionStatus(stateTransition: TunnelStateTransition) {
const actions = this._reduxActions;
- switch (tunnelState.state) {
+ switch (stateTransition.state) {
case 'connecting':
actions.connection.connecting();
break;
+
case 'connected':
actions.connection.connected();
break;
+
case 'disconnecting':
actions.connection.disconnecting();
break;
+
case 'disconnected':
actions.connection.disconnected();
break;
+
case 'blocked':
- actions.connection.blocked(tunnelState.details);
+ actions.connection.blocked(stateTransition.details);
break;
+
default:
- log.error(`Unexpected TunnelState: ${(tunnelState: empty)}`);
+ log.error(`Unexpected TunnelStateTransition: ${(stateTransition.state: empty)}`);
+ break;
}
}
- _updateTrayIcon(connectionState: ConnectionState) {
- const iconTypes: { [ConnectionState]: TrayIconType } = {
+ _updateTrayIcon(tunnelState: TunnelState) {
+ const iconTypes: { [TunnelState]: TrayIconType } = {
connected: 'secured',
connecting: 'securing',
blocked: 'securing',
};
- const type = iconTypes[connectionState] || 'unsecured';
+ const type = iconTypes[tunnelState] || 'unsecured';
ipcRenderer.send('change-tray-icon', type);
}
- _showNotification(connectionState: ConnectionState) {
- switch (connectionState) {
+ _showNotification(tunnelState: TunnelState) {
+ switch (tunnelState) {
case 'connecting':
this._notificationController.show('Connecting');
break;
@@ -617,7 +625,7 @@ export default class AppRenderer {
// no-op
break;
default:
- log.error(`Unexpected ConnectionState: ${(connectionState: empty)}`);
+ log.error(`Unexpected TunnelState: ${(tunnelState: empty)}`);
return;
}
}
diff --git a/gui/packages/desktop/src/renderer/components/Connect.js b/gui/packages/desktop/src/renderer/components/Connect.js
index f06ea86eb1..5849d71249 100644
--- a/gui/packages/desktop/src/renderer/components/Connect.js
+++ b/gui/packages/desktop/src/renderer/components/Connect.js
@@ -335,7 +335,7 @@ export default class Connect extends Component<Props, State> {
case 'blocked':
return 'success';
default:
- throw new Error(`Invalid ConnectionState: ${(status: empty)}`);
+ throw new Error(`Invalid TunnelState: ${(status: empty)}`);
}
}
diff --git a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
index b13da5f2ab..9e4c2c1604 100644
--- a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
+++ b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
@@ -47,28 +47,12 @@ export type BlockReason =
| 'start_tunnel_error'
| 'no_matching_relay'
| 'no_account_token';
-export type DisconnectedState = {
- state: 'disconnected',
-};
-export type ConnectingState = {
- state: 'connecting',
-};
-export type ConnectedState = {
- state: 'connected',
-};
-export type DisconnectingState = {
- state: 'disconnecting',
-};
-export type BlockedState = {
- state: 'blocked',
- details: BlockReason,
-};
-export type TunnelState =
- | DisconnectedState
- | ConnectingState
- | ConnectedState
- | DisconnectingState
- | BlockedState;
+
+export type TunnelState = 'connecting' | 'connected' | 'disconnecting' | 'disconnected' | 'blocked';
+
+export type TunnelStateTransition =
+ | { state: 'disconnecting' | 'disconnected' | 'connecting' | 'connected' }
+ | { state: 'blocked', details: BlockReason };
export type RelayProtocol = 'tcp' | 'udp';
export type RelayLocation =
@@ -250,21 +234,14 @@ const allBlockReasons: Array<BlockReason> = [
'no_matching_relay',
'no_account_token',
];
-const BlockedStateSchema = object({
- state: enumeration('blocked'),
- details: enumeration(...allBlockReasons),
-});
-const ConnectedStateSchema = object({ state: enumeration('connected') });
-const ConnectingStateSchema = object({ state: enumeration('connecting') });
-const DisconnectedStateSchema = object({ state: enumeration('disconnected') });
-const DisconnectingStateSchema = object({ state: enumeration('disconnecting') });
-
-const TunnelStateSchema = oneOf(
- BlockedStateSchema,
- ConnectedStateSchema,
- ConnectingStateSchema,
- DisconnectedStateSchema,
- DisconnectingStateSchema,
+const TunnelStateTransitionSchema = oneOf(
+ object({
+ state: enumeration('blocked'),
+ details: enumeration(...allBlockReasons),
+ }),
+ object({
+ state: enumeration('connected', 'connecting', 'disconnected', 'disconnecting'),
+ }),
);
export type AppVersionInfo = {
@@ -301,8 +278,8 @@ export interface DaemonRpcProtocol {
connectTunnel(): Promise<void>;
disconnectTunnel(): Promise<void>;
getLocation(): Promise<Location>;
- getState(): Promise<TunnelState>;
- subscribeStateListener((state: ?TunnelState, error: ?Error) => void): Promise<void>;
+ getState(): Promise<TunnelStateTransition>;
+ subscribeStateListener((state: ?TunnelStateTransition, error: ?Error) => void): Promise<void>;
addOpenConnectionObserver(() => void): ConnectionObserver;
addCloseConnectionObserver((error: ?Error) => void): ConnectionObserver;
getAccountHistory(): Promise<Array<AccountToken>>;
@@ -494,19 +471,21 @@ export class DaemonRpc implements DaemonRpcProtocol {
}
}
- async getState(): Promise<TunnelState> {
+ async getState(): Promise<TunnelStateTransition> {
const response = await this._transport.send('get_state');
try {
- return validate(TunnelStateSchema, response);
+ return validate(TunnelStateTransitionSchema, response);
} catch (error) {
throw new ResponseParseError('Invalid response from get_state', error);
}
}
- subscribeStateListener(listener: (state: ?TunnelState, error: ?Error) => void): Promise<void> {
+ subscribeStateListener(
+ listener: (state: ?TunnelStateTransition, error: ?Error) => void,
+ ): Promise<void> {
return this._transport.subscribe('new_state', (payload) => {
try {
- const newState = validate(TunnelStateSchema, payload);
+ const newState = validate(TunnelStateTransitionSchema, payload);
listener(newState, null);
} catch (error) {
listener(null, new ResponseParseError('Invalid payload from new_state', error));
diff --git a/gui/packages/desktop/src/renderer/redux/connection/reducers.js b/gui/packages/desktop/src/renderer/redux/connection/reducers.js
index 71f53b3a4c..9381d5e037 100644
--- a/gui/packages/desktop/src/renderer/redux/connection/reducers.js
+++ b/gui/packages/desktop/src/renderer/redux/connection/reducers.js
@@ -1,16 +1,10 @@
// @flow
import type { ReduxAction } from '../store';
-import type { Ip } from '../../lib/daemon-rpc';
+import type { TunnelState, Ip } from '../../lib/daemon-rpc';
-export type ConnectionState =
- | 'disconnected'
- | 'disconnecting'
- | 'connecting'
- | 'connected'
- | 'blocked';
export type ConnectionReduxState = {
- status: ConnectionState,
+ status: TunnelState,
isOnline: boolean,
ip: ?Ip,
latitude: ?number,