summaryrefslogtreecommitdiffhomepage
path: root/app/lib
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@codeispoetry.ru>2017-02-21 14:12:39 +0000
committerAndrej Mihajlov <and@codeispoetry.ru>2017-02-21 14:12:39 +0000
commit0fd89cfc1c91d90ec625199ba0460bb5fb8c9ec6 (patch)
tree04b2f15f7f9aef83aa749b29757458486a11fee6 /app/lib
parent191d72546accf308696f57ee14d27c1b221ad4b9 (diff)
downloadmullvadvpn-0fd89cfc1c91d90ec625199ba0460bb5fb8c9ec6.tar.xz
mullvadvpn-0fd89cfc1c91d90ec625199ba0460bb5fb8c9ec6.zip
State management via Backend events
Diffstat (limited to 'app/lib')
-rw-r--r--app/lib/backend.js101
-rw-r--r--app/lib/private.js10
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)
- };
-};