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 = [] |
||||
} |
||||
|
||||
MessageManager.prototype.getMsgList = function () { |
||||
return this.messages |
||||
} |
||||
module.exports = class MessageManager extends EventEmitter{ |
||||
constructor (opts) { |
||||
super() |
||||
this.memStore = new ObservableStore({ messages: [] }) |
||||
} |
||||
|
||||
MessageManager.prototype.unconfirmedMsgs = function () { |
||||
var messages = this.getMsgList() |
||||
return messages.filter(msg => msg.status === 'unconfirmed') |
||||
.reduce((result, msg) => { result[msg.id] = msg; return result }, {}) |
||||
} |
||||
getState() { |
||||
return { |
||||
unapprovedMsgs: this.getUnapprovedMsgs(), |
||||
messages: this.getMsgList(), |
||||
} |
||||
} |
||||
|
||||
MessageManager.prototype._saveMsgList = function (msgList) { |
||||
this.messages = msgList |
||||
} |
||||
getMsgList () { |
||||
return this.memStore.getState().messages |
||||
} |
||||
|
||||
MessageManager.prototype.addMsg = function (msg) { |
||||
var messages = this.getMsgList() |
||||
messages.push(msg) |
||||
this._saveMsgList(messages) |
||||
} |
||||
get unapprovedMsgCount () { |
||||
return Object.keys(this.getUnapprovedMsgs()).length |
||||
} |
||||
|
||||
MessageManager.prototype.getMsg = function (msgId) { |
||||
var messages = this.getMsgList() |
||||
var matching = messages.filter(msg => msg.id === msgId) |
||||
return matching.length > 0 ? matching[0] : null |
||||
} |
||||
getUnapprovedMsgs () { |
||||
let messages = this.getMsgList() |
||||
return messages.filter(msg => msg.status === 'unapproved') |
||||
.reduce((result, msg) => { result[msg.id] = msg; return result }, {}) |
||||
} |
||||
|
||||
MessageManager.prototype.confirmMsg = function (msgId) { |
||||
this._setMsgStatus(msgId, 'confirmed') |
||||
} |
||||
addUnapprovedMessage (msgParams) { |
||||
// 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) |
||||
|
||||
MessageManager.prototype.rejectMsg = function (msgId) { |
||||
this._setMsgStatus(msgId, 'rejected') |
||||
} |
||||
// keep the cb around for after approval (requires user interaction)
|
||||
// This cb fires completion to the Dapp's write operation.
|
||||
|
||||
MessageManager.prototype._setMsgStatus = function (msgId, status) { |
||||
var msg = this.getMsg(msgId) |
||||
if (msg) msg.status = status |
||||
this.updateMsg(msg) |
||||
} |
||||
// signal update
|
||||
this.emit('update') |
||||
return msgId |
||||
} |
||||
|
||||
addMsg (msg) { |
||||
let messages = this.getMsgList() |
||||
messages.push(msg) |
||||
this._saveMsgList(messages) |
||||
} |
||||
|
||||
MessageManager.prototype.updateMsg = function (msg) { |
||||
var messages = this.getMsgList() |
||||
var found, index |
||||
messages.forEach((otherMsg, i) => { |
||||
if (otherMsg.id === msg.id) { |
||||
found = true |
||||
index = i |
||||
getMsg (msgId) { |
||||
let messages = this.getMsgList() |
||||
let matching = messages.filter(msg => msg.id === msgId) |
||||
return matching.length > 0 ? matching[0] : null |
||||
} |
||||
|
||||
approveMessage (msgParams) { |
||||
this.setMsgStatusApproved(msgParams.metamaskId) |
||||
return this.prepMsgForSigning(msgParams) |
||||
} |
||||
|
||||
setMsgStatusApproved (msgId) { |
||||
this._setMsgStatus(msgId, 'approved') |
||||
} |
||||
|
||||
prepMsgForSigning (msgParams) { |
||||
delete msgParams.metamaskId |
||||
return Promise.resolve(msgParams) |
||||
} |
||||
|
||||
rejectMsg (msgId) { |
||||
this.brodcastMessage(null, msgId, 'rejected') |
||||
this._setMsgStatus(msgId, 'rejected') |
||||
} |
||||
|
||||
brodcastMessage (rawSig, msgId, status) { |
||||
this.emit(`${msgId}:finished`, {status, rawSig}) |
||||
} |
||||
// PRIVATE METHODS
|
||||
|
||||
_setMsgStatus (msgId, status) { |
||||
let msg = this.getMsg(msgId) |
||||
if (msg) msg.status = status |
||||
this._updateMsg(msg) |
||||
} |
||||
|
||||
_updateMsg (msg) { |
||||
let messages = this.getMsgList() |
||||
let index = messages.findIndex((message) => message.id === msg.id) |
||||
if (index !== -1) { |
||||
messages[index] = msg |
||||
} |
||||
}) |
||||
if (found) { |
||||
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 |
||||
|
||||
module.exports = function (unconfTxs, unconfMsgs, network) { |
||||
var txValues = network ? valuesFor(unconfTxs).filter(tx => tx.txParams.metamaskNetworkId === network) : valuesFor(unconfTxs) |
||||
var msgValues = valuesFor(unconfMsgs) |
||||
module.exports = function (unapprovedTxs, unapprovedMsgs, network) { |
||||
var txValues = network ? valuesFor(unapprovedTxs).filter(tx => tx.txParams.metamaskNetworkId === network) : valuesFor(unapprovedTxs) |
||||
var msgValues = valuesFor(unapprovedMsgs) |
||||
var allValues = txValues.concat(msgValues) |
||||
return allValues.sort(tx => tx.time) |
||||
} |
||||
|
Loading…
Reference in new issue