From 4176936d34076c930a8937ff95e3f6bf5bcca854 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Wed, 9 Aug 2017 13:03:26 +0200 Subject: [PATCH] Move shell APIs to middleware --- js/src/DappRequests/index.js | 5 ++- js/src/DappRequests/store.js | 68 ++++++----------------------- js/src/shellMiddleware.js | 85 ++++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 js/src/shellMiddleware.js 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; + } +}