From d3df9546a746dbf1c289849045ed0a9dd0e86150 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Wed, 6 Jul 2022 20:56:01 -0700 Subject: [PATCH 1/3] fix(tests): Speeding up e2e tests --- bin/server.js | 4 +++- production/docker/docker-compose.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/server.js b/bin/server.js index edd0378..8253c7f 100644 --- a/bin/server.js +++ b/bin/server.js @@ -104,7 +104,9 @@ class Server { // MIDDLEWARE END // Delay startup to give the P2WDB time to start first, so that it accepts the webook call - await this.sleep(20000) + if (this.config.env !== 'test') { + await this.sleep(20000) + } // Create webhook try { diff --git a/production/docker/docker-compose.yml b/production/docker/docker-compose.yml index 48fc4b2..89e165d 100644 --- a/production/docker/docker-compose.yml +++ b/production/docker/docker-compose.yml @@ -73,7 +73,7 @@ services: #build: # context: ./bch-dex/ # dockerfile: Dockerfile - image: christroutner/bch-dex:v1.8.0 + image: christroutner/bch-dex:v1.9.0 container_name: bch-dex environment: CONSUMER_URL: 'https://free-bch.fullstack.cash' From 1e80a3159ed61b515b31dabfdcc2f150edb198bc Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 7 Jul 2022 13:37:16 -0700 Subject: [PATCH 2/3] fix(webhook): Ensuring startup waits for webhook to be established --- bin/server.js | 40 ++++++++++++++++++++-------------------- src/adapters/index.js | 5 +++++ src/adapters/webhook.js | 40 ++++++++++++++++++++++++++++++++++++++++ src/use-cases/order.js | 2 +- 4 files changed, 66 insertions(+), 21 deletions(-) diff --git a/bin/server.js b/bin/server.js index 8253c7f..1ca2a2b 100644 --- a/bin/server.js +++ b/bin/server.js @@ -24,8 +24,8 @@ const config = require('../config') // this first. const AdminLib = require('../src/adapters/admin') // const adminLib = new AdminLib() -const WebHookLib = require('../src/adapters/webhook') -const webhookLib = new WebHookLib() +// const WebHookLib = require('../src/adapters/webhook') +// const webhookLib = new WebHookLib() // const JSONRPC = require('../src/rpc') // const rpc = new JSONRPC() @@ -103,26 +103,26 @@ class Server { // MIDDLEWARE END + // 7/7/22 CT: This code paragraph can be deleted // Delay startup to give the P2WDB time to start first, so that it accepts the webook call - if (this.config.env !== 'test') { - await this.sleep(20000) - } - + // if (this.config.env !== 'test') { + // await this.sleep(20000) + // } // Create webhook - try { - try { - // Delete an old webhook if it exists. - await webhookLib.deleteWebhook(config.webhookTarget) - } catch (err) { - /* exit quietly */ - // console.log('err deleting webhook: ', err) - } - - await webhookLib.createWebhook(config.webhookTarget) - console.log('Webhook created') - } catch (error) { - console.log('Webhook cant be created') - } + // try { + // try { + // // Delete an old webhook if it exists. + // await webhookLib.deleteWebhook(config.webhookTarget) + // } catch (err) { + // /* exit quietly */ + // // console.log('err deleting webhook: ', err) + // } + // + // await webhookLib.createWebhook(config.webhookTarget) + // console.log('Webhook created') + // } catch (error) { + // console.log('Webhook cant be created') + // } // startServer() this.server = await app.listen(config.port) diff --git a/src/adapters/index.js b/src/adapters/index.js index 9d69aec..9b956e5 100644 --- a/src/adapters/index.js +++ b/src/adapters/index.js @@ -19,6 +19,7 @@ const FullStackJWT = require('./fullstack-jwt') const BCHAdapter = require('./bch') const WalletAdapter = require('./wallet') const P2wdbAdapter = require('./p2wdb-adapter') +const Webhook = require('./webhook') const config = require('../../config') @@ -37,6 +38,7 @@ class Adapters { this.config = config this.wallet = new WalletAdapter() this.p2wdb = new P2wdbAdapter(localConfig) + this.webhook = new Webhook() // Get a valid JWT API key and instance bch-js. this.fullStackJwt = new FullStackJWT(config) @@ -65,6 +67,9 @@ class Adapters { if (this.config.env !== 'test') { // Instance the wallet. await this.wallet.instanceWallet(walletData, this.bchjs) + + // Wait until a webhook is established with the P2WDB + await this.webhook.waitUntilSuccess(this.config.webhookTarget) } console.log('Async Adapters have been started.') diff --git a/src/adapters/webhook.js b/src/adapters/webhook.js index 2a918fe..98e3581 100644 --- a/src/adapters/webhook.js +++ b/src/adapters/webhook.js @@ -59,6 +59,46 @@ class WebHook { throw err } } + + // Returns a promise that will not resolve until a webhook has been successfully + // created with the P2WDB. + // Dev Note: This was created because establishing a webhook between bch-dex + // and the P2WDB at startup is critical. If it's not established, then bch-dex + // can not 'see' new Offers and Counter Offers. + async waitUntilSuccess (url) { + try { + let success = false + + do { + try { + // Delete an old webhook if it exists. + await this.deleteWebhook(this.config.webhookTarget) + } catch (err) { + /* exit quietly */ + // console.log('err deleting webhook: ', err) + } + + try { + await this.createWebhook(this.config.webhookTarget) + console.log('Webhook created') + success = true + } catch (err) { + const now = new Date() + console.log(`${now.toLocaleString()}: Error trying to create webhook with P2WDB. Trying again...`) + await sleep(2000) + } + } while (!success) + + return true + } catch (err) { + console.error('Error in webhook.js/waitUntilSuccess()') + throw err + } + } +} + +function sleep (ms) { + return new Promise(resolve => setTimeout(resolve, ms)) } module.exports = WebHook diff --git a/src/use-cases/order.js b/src/use-cases/order.js index 13bf3eb..3a4fd56 100644 --- a/src/use-cases/order.js +++ b/src/use-cases/order.js @@ -28,7 +28,7 @@ class OrderLib { async createOrder (entryObj) { try { console.log('createOrder(entryObj): ', entryObj) - // if (!entryObj) return + // if (!entryObj) return false // Specify the address to send payment. entryObj.makerAddr = this.adapters.wallet.bchWallet.walletInfo.cashAddress From d1e96505c85abeb525108d6898407ac781c4fa0b Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 7 Jul 2022 13:45:01 -0700 Subject: [PATCH 3/3] fix(order): Handling bad order data --- src/use-cases/order.js | 4 +++- test/unit/use-cases/order.use-case.unit.js | 10 ++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/use-cases/order.js b/src/use-cases/order.js index 3a4fd56..726e77f 100644 --- a/src/use-cases/order.js +++ b/src/use-cases/order.js @@ -28,7 +28,9 @@ class OrderLib { async createOrder (entryObj) { try { console.log('createOrder(entryObj): ', entryObj) - // if (!entryObj) return false + if (!entryObj) return false + + if (!entryObj.tokenId) throw new Error('entry does not contain required properties') // Specify the address to send payment. entryObj.makerAddr = this.adapters.wallet.bchWallet.walletInfo.cashAddress diff --git a/test/unit/use-cases/order.use-case.unit.js b/test/unit/use-cases/order.use-case.unit.js index f710845..32f62b2 100644 --- a/test/unit/use-cases/order.use-case.unit.js +++ b/test/unit/use-cases/order.use-case.unit.js @@ -125,12 +125,18 @@ describe('#order-use-case', () => { it('should catch and throw an error', async () => { try { - await uut.createOrder() + await uut.createOrder({ a: 'b' }) assert.fail('Unexpected code path') } catch (err) { - assert.include(err.message, 'Cannot set') + assert.include(err.message, 'entry does not contain required properties') } }) + + it('should exit quietly if the entry is empty', async () => { + const result = await uut.createOrder() + + assert.equal(result, false) + }) }) })