Merge pull request #1076 from MetaMask/messageManagerCleanUp
Message manager clean upfeature/default_network_editable
commit
3afa3592fe
@ -1,61 +1,110 @@ |
|||||||
module.exports = new MessageManager() |
const EventEmitter = require('events') |
||||||
|
const ObservableStore = require('obs-store') |
||||||
|
const createId = require('./random-id') |
||||||
|
|
||||||
function MessageManager (opts) { |
|
||||||
this.messages = [] |
module.exports = class MessageManager extends EventEmitter{ |
||||||
|
constructor (opts) { |
||||||
|
super() |
||||||
|
this.memStore = new ObservableStore({ messages: [] }) |
||||||
|
} |
||||||
|
|
||||||
|
getState() { |
||||||
|
return { |
||||||
|
unapprovedMsgs: this.getUnapprovedMsgs(), |
||||||
|
messages: this.getMsgList(), |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
getMsgList () { |
||||||
|
return this.memStore.getState().messages |
||||||
} |
} |
||||||
|
|
||||||
MessageManager.prototype.getMsgList = function () { |
get unapprovedMsgCount () { |
||||||
return this.messages |
return Object.keys(this.getUnapprovedMsgs()).length |
||||||
} |
} |
||||||
|
|
||||||
MessageManager.prototype.unconfirmedMsgs = function () { |
getUnapprovedMsgs () { |
||||||
var messages = this.getMsgList() |
let messages = this.getMsgList() |
||||||
return messages.filter(msg => msg.status === 'unconfirmed') |
return messages.filter(msg => msg.status === 'unapproved') |
||||||
.reduce((result, msg) => { result[msg.id] = msg; return result }, {}) |
.reduce((result, msg) => { result[msg.id] = msg; return result }, {}) |
||||||
} |
} |
||||||
|
|
||||||
MessageManager.prototype._saveMsgList = function (msgList) { |
addUnapprovedMessage (msgParams) { |
||||||
this.messages = msgList |
// create txData obj with parameters and meta data
|
||||||
|
var time = (new Date()).getTime() |
||||||
|
var msgId = createId() |
||||||
|
var msgData = { |
||||||
|
id: msgId, |
||||||
|
msgParams: msgParams, |
||||||
|
time: time, |
||||||
|
status: 'unapproved', |
||||||
} |
} |
||||||
|
this.addMsg(msgData) |
||||||
|
console.log('addUnapprovedMessage:', msgData) |
||||||
|
|
||||||
|
// keep the cb around for after approval (requires user interaction)
|
||||||
|
// This cb fires completion to the Dapp's write operation.
|
||||||
|
|
||||||
MessageManager.prototype.addMsg = function (msg) { |
// signal update
|
||||||
var messages = this.getMsgList() |
this.emit('update') |
||||||
|
return msgId |
||||||
|
} |
||||||
|
|
||||||
|
addMsg (msg) { |
||||||
|
let messages = this.getMsgList() |
||||||
messages.push(msg) |
messages.push(msg) |
||||||
this._saveMsgList(messages) |
this._saveMsgList(messages) |
||||||
} |
} |
||||||
|
|
||||||
MessageManager.prototype.getMsg = function (msgId) { |
getMsg (msgId) { |
||||||
var messages = this.getMsgList() |
let messages = this.getMsgList() |
||||||
var matching = messages.filter(msg => msg.id === msgId) |
let matching = messages.filter(msg => msg.id === msgId) |
||||||
return matching.length > 0 ? matching[0] : null |
return matching.length > 0 ? matching[0] : null |
||||||
} |
} |
||||||
|
|
||||||
MessageManager.prototype.confirmMsg = function (msgId) { |
approveMessage (msgParams) { |
||||||
this._setMsgStatus(msgId, 'confirmed') |
this.setMsgStatusApproved(msgParams.metamaskId) |
||||||
|
return this.prepMsgForSigning(msgParams) |
||||||
|
} |
||||||
|
|
||||||
|
setMsgStatusApproved (msgId) { |
||||||
|
this._setMsgStatus(msgId, 'approved') |
||||||
|
} |
||||||
|
|
||||||
|
prepMsgForSigning (msgParams) { |
||||||
|
delete msgParams.metamaskId |
||||||
|
return Promise.resolve(msgParams) |
||||||
} |
} |
||||||
|
|
||||||
MessageManager.prototype.rejectMsg = function (msgId) { |
rejectMsg (msgId) { |
||||||
|
this.brodcastMessage(null, msgId, 'rejected') |
||||||
this._setMsgStatus(msgId, 'rejected') |
this._setMsgStatus(msgId, 'rejected') |
||||||
} |
} |
||||||
|
|
||||||
MessageManager.prototype._setMsgStatus = function (msgId, status) { |
brodcastMessage (rawSig, msgId, status) { |
||||||
var msg = this.getMsg(msgId) |
this.emit(`${msgId}:finished`, {status, rawSig}) |
||||||
if (msg) msg.status = status |
|
||||||
this.updateMsg(msg) |
|
||||||
} |
} |
||||||
|
// PRIVATE METHODS
|
||||||
|
|
||||||
MessageManager.prototype.updateMsg = function (msg) { |
_setMsgStatus (msgId, status) { |
||||||
var messages = this.getMsgList() |
let msg = this.getMsg(msgId) |
||||||
var found, index |
if (msg) msg.status = status |
||||||
messages.forEach((otherMsg, i) => { |
this._updateMsg(msg) |
||||||
if (otherMsg.id === msg.id) { |
|
||||||
found = true |
|
||||||
index = i |
|
||||||
} |
} |
||||||
}) |
|
||||||
if (found) { |
_updateMsg (msg) { |
||||||
|
let messages = this.getMsgList() |
||||||
|
let index = messages.findIndex((message) => message.id === msg.id) |
||||||
|
if (index !== -1) { |
||||||
messages[index] = msg |
messages[index] = msg |
||||||
} |
} |
||||||
this._saveMsgList(messages) |
this._saveMsgList(messages) |
||||||
} |
} |
||||||
|
|
||||||
|
_saveMsgList (msgList) { |
||||||
|
this.memStore.updateState({ messages: msgList }) |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
@ -0,0 +1,98 @@ |
|||||||
|
const assert = require('assert') |
||||||
|
const extend = require('xtend') |
||||||
|
const EventEmitter = require('events') |
||||||
|
|
||||||
|
const MessageManger = require('../../app/scripts/lib/message-manager') |
||||||
|
|
||||||
|
describe('Transaction Manager', function() { |
||||||
|
let messageManager |
||||||
|
|
||||||
|
beforeEach(function() { |
||||||
|
messageManager = new MessageManger () |
||||||
|
}) |
||||||
|
|
||||||
|
describe('#getMsgList', function() { |
||||||
|
it('when new should return empty array', function() { |
||||||
|
var result = messageManager.getMsgList() |
||||||
|
assert.ok(Array.isArray(result)) |
||||||
|
assert.equal(result.length, 0) |
||||||
|
}) |
||||||
|
it('should also return transactions from local storage if any', function() { |
||||||
|
|
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('#_saveMsgList', function() { |
||||||
|
it('saves the submitted data to the Msg list', function() { |
||||||
|
var target = [{ foo: 'bar', metamaskNetworkId: 'unit test' }] |
||||||
|
messageManager._saveMsgList(target) |
||||||
|
var result = messageManager.getMsgList() |
||||||
|
assert.equal(result[0].foo, 'bar') |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('#addMsg', function() { |
||||||
|
it('adds a Msg returned in getMsgList', function() { |
||||||
|
var Msg = { id: 1, status: 'approved', metamaskNetworkId: 'unit test' } |
||||||
|
messageManager.addMsg(Msg) |
||||||
|
var result = messageManager.getMsgList() |
||||||
|
assert.ok(Array.isArray(result)) |
||||||
|
assert.equal(result.length, 1) |
||||||
|
assert.equal(result[0].id, 1) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('#setMsgStatusApproved', function() { |
||||||
|
it('sets the Msg status to approved', function() { |
||||||
|
var Msg = { id: 1, status: 'unapproved', metamaskNetworkId: 'unit test' } |
||||||
|
messageManager.addMsg(Msg) |
||||||
|
messageManager.setMsgStatusApproved(1) |
||||||
|
var result = messageManager.getMsgList() |
||||||
|
assert.ok(Array.isArray(result)) |
||||||
|
assert.equal(result.length, 1) |
||||||
|
assert.equal(result[0].status, 'approved') |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('#rejectMsg', function() { |
||||||
|
it('sets the Msg status to rejected', function() { |
||||||
|
var Msg = { id: 1, status: 'unapproved', metamaskNetworkId: 'unit test' } |
||||||
|
messageManager.addMsg(Msg) |
||||||
|
messageManager.rejectMsg(1) |
||||||
|
var result = messageManager.getMsgList() |
||||||
|
assert.ok(Array.isArray(result)) |
||||||
|
assert.equal(result.length, 1) |
||||||
|
assert.equal(result[0].status, 'rejected') |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('#_updateMsg', function() { |
||||||
|
it('replaces the Msg with the same id', function() { |
||||||
|
messageManager.addMsg({ id: '1', status: 'unapproved', metamaskNetworkId: 'unit test' }) |
||||||
|
messageManager.addMsg({ id: '2', status: 'approved', metamaskNetworkId: 'unit test' }) |
||||||
|
messageManager._updateMsg({ id: '1', status: 'blah', hash: 'foo', metamaskNetworkId: 'unit test' }) |
||||||
|
var result = messageManager.getMsg('1') |
||||||
|
assert.equal(result.hash, 'foo') |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('#getUnapprovedMsgs', function() { |
||||||
|
it('returns unapproved Msgs in a hash', function() { |
||||||
|
messageManager.addMsg({ id: '1', status: 'unapproved', metamaskNetworkId: 'unit test' }) |
||||||
|
messageManager.addMsg({ id: '2', status: 'approved', metamaskNetworkId: 'unit test' }) |
||||||
|
let result = messageManager.getUnapprovedMsgs() |
||||||
|
assert.equal(typeof result, 'object') |
||||||
|
assert.equal(result['1'].status, 'unapproved') |
||||||
|
assert.equal(result['2'], undefined) |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
describe('#getMsg', function() { |
||||||
|
it('returns a Msg with the requested id', function() { |
||||||
|
messageManager.addMsg({ id: '1', status: 'unapproved', metamaskNetworkId: 'unit test' }) |
||||||
|
messageManager.addMsg({ id: '2', status: 'approved', metamaskNetworkId: 'unit test' }) |
||||||
|
assert.equal(messageManager.getMsg('1').status, 'unapproved') |
||||||
|
assert.equal(messageManager.getMsg('2').status, 'approved') |
||||||
|
}) |
||||||
|
}) |
||||||
|
}) |
@ -1,8 +1,8 @@ |
|||||||
const valuesFor = require('../app/util').valuesFor |
const valuesFor = require('../app/util').valuesFor |
||||||
|
|
||||||
module.exports = function (unconfTxs, unconfMsgs, network) { |
module.exports = function (unapprovedTxs, unapprovedMsgs, network) { |
||||||
var txValues = network ? valuesFor(unconfTxs).filter(tx => tx.txParams.metamaskNetworkId === network) : valuesFor(unconfTxs) |
var txValues = network ? valuesFor(unapprovedTxs).filter(tx => tx.txParams.metamaskNetworkId === network) : valuesFor(unapprovedTxs) |
||||||
var msgValues = valuesFor(unconfMsgs) |
var msgValues = valuesFor(unapprovedMsgs) |
||||||
var allValues = txValues.concat(msgValues) |
var allValues = txValues.concat(msgValues) |
||||||
return allValues.sort(tx => tx.time) |
return allValues.sort(tx => tx.time) |
||||||
} |
} |
||||||
|
Loading…
Reference in new issue