diff options
| author | Andrej Mihajlov <and@codeispoetry.ru> | 2017-02-21 14:12:39 +0000 |
|---|---|---|
| committer | Andrej Mihajlov <and@codeispoetry.ru> | 2017-02-21 14:12:39 +0000 |
| commit | 0fd89cfc1c91d90ec625199ba0460bb5fb8c9ec6 (patch) | |
| tree | 04b2f15f7f9aef83aa749b29757458486a11fee6 /app/lib | |
| parent | 191d72546accf308696f57ee14d27c1b221ad4b9 (diff) | |
| download | mullvadvpn-0fd89cfc1c91d90ec625199ba0460bb5fb8c9ec6.tar.xz mullvadvpn-0fd89cfc1c91d90ec625199ba0460bb5fb8c9ec6.zip | |
State management via Backend events
Diffstat (limited to 'app/lib')
| -rw-r--r-- | app/lib/backend.js | 101 | ||||
| -rw-r--r-- | app/lib/private.js | 10 |
2 files changed, 64 insertions, 47 deletions
diff --git a/app/lib/backend.js b/app/lib/backend.js index 55560cca2c..288ea6d181 100644 --- a/app/lib/backend.js +++ b/app/lib/backend.js @@ -1,37 +1,53 @@ -import privateData from './private'; +import Enum from './enum'; +import { EventEmitter } from 'events'; -/** - * Private data - */ -const { get: getImpl, set: setImpl } = privateData(); +const EventType = Enum('connect', 'connecting', 'disconnect', 'login', 'logging', 'logout'); /** - * Remote backend implementation + * Backend implementation * - * @class BackendImpl + * @class Backend */ -class BackendImpl { +export default class Backend extends EventEmitter { + + static EventType = EventType; + constructor() { + super(); this._account = null; this._loggedIn = false; + this._serverAddress = null; } - get account() { - return this._account; - } + // Accessors - get loggedIn() { - return this._loggedIn; - } + get account() { return this._account; } + get loggedIn() { return this._loggedIn; } + get serverAddress() { return this._serverAddress; } + + // Public methods login(account) { return new Promise((resolve, reject) => { + this._account = account; + + // emit: logging in + this.emit(EventType.logging, account); + // @TODO: Add login call setTimeout(() => { if(account.startsWith('1111')) { + // emit: login + this.emit(EventType.login, account); + resolve(true); } else { - reject(new Error('Invalid account number.')); + const err = new Error('Invalid account number.'); + + // emit: login + this.emit(EventType.login, account, err); + + reject(err); } }, 2000); }); @@ -39,38 +55,49 @@ class BackendImpl { logout() { return new Promise((resolve, reject) => { + this._account = null; + + // emit event + this.emit(EventType.logout); + // @TODO: Add logout call resolve(); }); } -} -/** - * Backend implementation - * - * @export - * @class Backend - */ -export default class Backend { + connect(addr) { + return new Promise((resolve, reject) => { + this._serverAddress = addr; + + // @TODO: Add connect call + setTimeout(() => { + if(/se\d+\.mullvad\.net/.test(addr)) { - constructor() { - setImpl(this, new BackendImpl()); - } + // emit: connect + this.emit(EventType.connect, addr, err); + + resolve(true); + } else { + const err = new Error('Server is unreachable'); - get account() { - return getImpl(this).account; - } + // emit: connect + this.emit(EventType.connect, addr, err); - get loggedIn() { - return getImpl(this).loggedIn; + reject(err); + } + }, 2000); + }); } - login(account) { - return getImpl(this).login(account); - } + disconnect() { + return new Promise((resolve, reject) => { + this._serverAddress = null; - logout() { - return getImpl(this).logout(); - } + // emit: disconnect + this.emit(EventType.disconnect); + // @TODO: Add disconnect call + resolve(); + }); + } } diff --git a/app/lib/private.js b/app/lib/private.js deleted file mode 100644 index 61e574ee12..0000000000 --- a/app/lib/private.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Data incapsulation helper - */ -export default () => { - const store = new WeakMap(); - return { - get: (k) => store.get(k), - set: (k, v) => store.set(k, v) - }; -}; |
