From 1e80a3159ed61b515b31dabfdcc2f150edb198bc Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 7 Jul 2022 13:37:16 -0700 Subject: [PATCH] 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