diff --git a/js/src/DappRequests/index.js b/js/src/DappRequests/index.js
index 3aa372f0c..58b071230 100644
--- a/js/src/DappRequests/index.js
+++ b/js/src/DappRequests/index.js
@@ -15,9 +15,12 @@
// along with Parity. If not, see .
import Store from './store';
+import shellMiddleware from '../shellMiddleware';
function setupProviderFilters (provider) {
- return Store.create(provider);
+ const store = Store.create(provider, [shellMiddleware]);
+
+ return store;
}
export default from './dappRequests';
diff --git a/js/src/DappRequests/store.js b/js/src/DappRequests/store.js
index 6674141d5..69d2e9829 100644
--- a/js/src/DappRequests/store.js
+++ b/js/src/DappRequests/store.js
@@ -14,13 +14,11 @@
// You should have received a copy of the GNU General Public License
// along with Parity. If not, see .
-import flatten from 'lodash.flatten';
import { action, computed, observable } from 'mobx';
import store from 'store';
import { sha3 } from '@parity/api/util/sha3';
-import VisibleStore from '@parity/shared/mobx/dappsStore';
import filteredRequests from './filteredRequests';
const LS_PERMISSIONS = '_parity::dapps::methods';
@@ -32,11 +30,13 @@ export default class Store {
@observable requests = [];
@observable tokens = {};
+ middleware = [];
sources = {};
- constructor (provider) {
+ constructor (provider, middleware = []) {
this.provider = provider;
this.permissions = store.get(LS_PERMISSIONS) || {};
+ this.middleware = middleware;
window.addEventListener('message', this.receiveMessage, false);
}
@@ -161,6 +161,10 @@ export default class Store {
return true;
}
+ addMiddleware (middleware) {
+ this.middleware.push(middleware);
+ }
+
hasValidToken = (method, appId, token) => {
if (!token) {
return method === 'shell_requestNewToken';
@@ -214,58 +218,12 @@ export default class Store {
});
}
- executeMethodCall = ({ appId, id, from, method, params, token }, source) => {
- const visibleStore = VisibleStore.get();
+ executeMethodCall = ({ id, from, method, params, token }, source) => {
const callback = this._methodCallbackPost(id, from, source, token);
+ const isHandled = this.middleware.find((middleware) => middleware(from, method, params, callback));
- switch (method) {
- case 'shell_getApps':
- const [displayAll] = params;
-
- return callback(null, displayAll
- ? visibleStore.allApps.slice()
- : visibleStore.visibleApps.slice()
- );
-
- case 'shell_getFilteredMethods':
- return callback(null, flatten(
- Object
- .keys(filteredRequests)
- .map((key) => filteredRequests[key].methods)
- ));
-
- case 'shell_getMethodPermissions':
- return callback(null, this.permissions);
-
- case 'shell_loadApp':
- const [_loadId, loadParams] = params;
- const loadId = _loadId.substr(0, 2) !== '0x'
- ? sha3(_loadId)
- : _loadId;
- const loadUrl = `/${loadId}/${loadParams || ''}`;
-
- window.location.hash = loadUrl;
-
- return callback(null, true);
-
- case 'shell_requestNewToken':
- return callback(null, this.createToken(from));
-
- case 'shell_setAppVisibility':
- const [changeId, visibility] = params;
-
- return callback(null, visibility
- ? visibleStore.showApp(changeId)
- : visibleStore.hideApp(changeId)
- );
-
- case 'shell_setMethodPermissions':
- const [permissions] = params;
-
- return callback(null, this.setPermissions(permissions));
-
- default:
- return this.provider.send(method, params, callback);
+ if (!isHandled) {
+ this.provider.send(method, params, callback);
}
}
@@ -314,9 +272,9 @@ export default class Store {
static instance = null;
- static create (provider) {
+ static create (provider, middleware) {
if (!Store.instance) {
- Store.instance = new Store(provider, {});
+ Store.instance = new Store(provider, middleware);
}
return Store.instance;
diff --git a/js/src/shellMiddleware.js b/js/src/shellMiddleware.js
new file mode 100644
index 000000000..eb2663b91
--- /dev/null
+++ b/js/src/shellMiddleware.js
@@ -0,0 +1,85 @@
+// Copyright 2015-2017 Parity Technologies (UK) Ltd.
+// This file is part of Parity.
+
+// Parity is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Parity is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Parity. If not, see .
+
+import flatten from 'lodash.flatten';
+
+import { sha3 } from '@parity/api/util/sha3';
+import VisibleStore from '@parity/shared/mobx/dappsStore';
+
+import RequestStore from './DappRequests/store';
+import filteredRequests from './DappRequests/filteredRequests';
+
+export function execute (appId, method, params, callback) {
+ const visibleStore = VisibleStore.get();
+ const requestStore = RequestStore.get();
+
+ switch (method) {
+ case 'shell_getApps':
+ const [displayAll] = params;
+
+ callback(null, displayAll
+ ? visibleStore.allApps.slice()
+ : visibleStore.visibleApps.slice()
+ );
+ return true;
+
+ case 'shell_getFilteredMethods':
+ callback(null, flatten(
+ Object
+ .keys(filteredRequests)
+ .map((key) => filteredRequests[key].methods)
+ ));
+ return true;
+
+ case 'shell_getMethodPermissions':
+ callback(null, requestStore.permissions);
+ return true;
+
+ case 'shell_loadApp':
+ const [_loadId, loadParams] = params;
+ const loadId = _loadId.substr(0, 2) !== '0x'
+ ? sha3(_loadId)
+ : _loadId;
+ const loadUrl = `/${loadId}/${loadParams || ''}`;
+
+ window.location.hash = loadUrl;
+
+ callback(null, true);
+ return true;
+
+ case 'shell_requestNewToken':
+ callback(null, requestStore.createToken(appId));
+ return true;
+
+ case 'shell_setAppVisibility':
+ const [changeId, visibility] = params;
+
+ callback(null, visibility
+ ? visibleStore.showApp(changeId)
+ : visibleStore.hideApp(changeId)
+ );
+ return true;
+
+ case 'shell_setMethodPermissions':
+ const [permissions] = params;
+
+ callback(null, requestStore.setPermissions(permissions));
+ return true;
+
+ default:
+ return false;
+ }
+}