diff --git a/lib/server.js b/lib/server.js index 2c9079d..b9fdb40 100644 --- a/lib/server.js +++ b/lib/server.js @@ -19,10 +19,12 @@ var TxProposal = require('./model/txproposal'); /** * Creates an instance of the Copay server. * @constructor + * @param {Object} opts + * @param {Storage} [opts.storage] - The storage provider. */ function CopayServer(opts) { opts = opts || {}; - this.storage = new Storage(opts); + this.storage = opts.storage || new Storage(); }; @@ -81,7 +83,7 @@ CopayServer.prototype.createWallet = function (opts, cb) { }; -CopayServer.prototype.runLocked = function (walletId, cb, task) { +CopayServer.prototype._runLocked = function (walletId, cb, task) { var self = this; Lock.get(walletId, function (lock) { @@ -105,13 +107,12 @@ CopayServer.prototype.runLocked = function (walletId, cb, task) { CopayServer.prototype.joinWallet = function (opts, cb) { var self = this; - self.runLocked(opts.walletId, cb, function (cb) { + self._runLocked(opts.walletId, cb, function (cb) { self.getWallet({ id: opts.walletId, includeCopayers: true }, function (err, wallet) { if (err) return cb(err); if (!wallet) return cb('Wallet not found'); if (_.find(wallet.copayers, { xPubKey: opts.xPubKey })) return cb('Copayer already in wallet'); if (wallet.copayers.length == wallet.n) return cb('Wallet full'); - // TODO: validate copayer's extended public key using the public key from this wallet // Note: use Bitcore.crypto.ecdsa .verify() @@ -149,19 +150,21 @@ CopayServer.prototype._doCreateAddress = function (pkr, index, isChange) { CopayServer.prototype.createAddress = function (opts, cb) { var self = this; - self.getWallet({ id: opts.walletId }, function (err, wallet) { - if (err) return cb(err); - if (!wallet) return cb('Wallet not found'); - - var index = wallet.addressIndex++; - self.storage.storeWallet(wallet, function (err) { + self._runLocked(opts.walletId, cb, function (cb) { + self.getWallet({ id: opts.walletId }, function (err, wallet) { if (err) return cb(err); - - var address = self._doCreateAddress(wallet.publicKeyRing, index, opts.isChange); - self.storage.storeAddress(opts.walletId, address, function (err) { + if (!wallet) return cb('Wallet not found'); + + var index = wallet.addressIndex++; + self.storage.storeWallet(wallet, function (err) { if (err) return cb(err); - return cb(null, address); + var address = self._doCreateAddress(wallet.publicKeyRing, index, opts.isChange); + self.storage.storeAddress(opts.walletId, address, function (err) { + if (err) return cb(err); + + return cb(null, address); + }); }); }); }); diff --git a/test/integration.js b/test/integration.js index b2a7ab2..2312ec9 100644 --- a/test/integration.js +++ b/test/integration.js @@ -9,23 +9,26 @@ var should = chai.should(); var levelup = require('levelup'); var memdown = require('memdown'); +var Storage = require('../lib/storage'); + var Wallet = require('../lib/model/wallet'); var Address = require('../lib/model/address'); var Copayer = require('../lib/model/copayer'); var CopayServer = require('../lib/server'); -var db; +var db, storage; var server; describe('Copay server', function() { beforeEach(function() { db = levelup(memdown, { valueEncoding: 'json' }); + storage = new Storage({ db: db }); }); describe('#getWallet', function() { beforeEach(function() { server = new CopayServer({ - db: db, + storage: storage, }); }); @@ -102,7 +105,7 @@ describe('Copay server', function() { describe('#createWallet', function() { beforeEach(function() { server = new CopayServer({ - db: db, + storage: storage, }); }); @@ -151,7 +154,7 @@ describe('Copay server', function() { describe('#joinWallet', function() { beforeEach(function() { server = new CopayServer({ - db: db, + storage: storage, }); }); @@ -324,7 +327,7 @@ describe('Copay server', function() { describe('#createAddress', function() { beforeEach(function() { server = new CopayServer({ - db: db, + storage: storage, }); }); @@ -345,7 +348,7 @@ describe('Copay server', function() { describe('#createTx', function() { beforeEach(function(done) { server = new CopayServer({ - db: db, + storage: storage, }); server._doCreateAddress = sinon.stub().returns(new Address({ address: 'addr1', path: 'path1' })); helpers.createAndJoinWallet('123', 2, 2, function (err, wallet) {