From 5dc5b8c7f64b16b8da491ed6cc3e43ec2980b6a9 Mon Sep 17 00:00:00 2001 From: catbref Date: Sat, 26 Feb 2022 17:54:18 +0000 Subject: [PATCH] Add support for new API WS /websockets/crosschain/tradepresence in parallel with /websockets/presence --- .../core/trade-portal/trade-portal.src.js | 86 ++++++++++++++----- 1 file changed, 66 insertions(+), 20 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js index 591ad812..de4fcbb7 100644 --- a/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js +++ b/qortal-ui-plugins/plugins/core/trade-portal/trade-portal.src.js @@ -1355,14 +1355,14 @@ class TradePortal extends LitElement { initSocket() { let _relatedCoin = "" let presenceTxns = null + let tradePresenceTxns = null let offeringTrades = null - let filteredOffers = [] self.addEventListener('message', function (event) { switch (event.data.type) { case 'open_orders': offeringTrades = event.data.content - handleOfferingTrades() + processOffersWithPresence() break case 'set_coin': _relatedCoin = event.data.content @@ -1378,34 +1378,42 @@ class TradePortal extends LitElement { return timestamp > thirtyMinsAgo } + const filterOffersUsingEitherPresence = (offeringTrade) => { + return lessThanThirtyMinsAgo(offeringTrade.lastSeen) || offeringTrade.tradePresenceExpiry > Date.now(); + } + const processOffersWithPresence = () => { + if (offeringTrades === null) return + const waitFor = (ms) => new Promise((r) => setTimeout(r, ms)) async function asyncForEach(array, callback) { for (let index = 0; index < array.length; index++) { await callback(array[index], index, array) } } + const startOfferPresenceMapping = async () => { - await asyncForEach(presenceTxns, async (presence) => { - await waitFor(5) - let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === presence.address) - offerIndex !== -1 ? (offeringTrades[offerIndex].lastSeen = presence.timestamp) : null - }) - filteredOffers = offeringTrades.filter((offeringTrade) => lessThanThirtyMinsAgo(offeringTrade.lastSeen)) + if (presenceTxns !== null) { + await asyncForEach(presenceTxns, async (presence) => { + await waitFor(5) + let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === presence.address) + offerIndex !== -1 ? (offeringTrades[offerIndex].lastSeen = presence.timestamp) : null + }) + } + + if (tradePresenceTxns !== null) { + await asyncForEach(tradePresenceTxns, async (tradePresence) => { + await waitFor(5) + let offerIndex = offeringTrades.findIndex((offeringTrade) => offeringTrade.qortalCreatorTradeAddress === tradePresence.tradeAddress) + offerIndex !== -1 ? (offeringTrades[offerIndex].tradePresenceExpiry = tradePresence.timestamp) : null + }) + } + + let filteredOffers = offeringTrades.filter((offeringTrade) => filterOffersUsingEitherPresence(offeringTrade)) self.postMessage({ type: 'PRESENCE', data: { offers: offeringTrades, filteredOffers: filteredOffers, relatedCoin: _relatedCoin } }) - filteredOffers = [] } - startOfferPresenceMapping() - } - - const handleOfferingTrades = () => { - if (presenceTxns === null) return - processOffersWithPresence() - } - const handlePresence = () => { - if (offeringTrades === null) return - processOffersWithPresence() + startOfferPresenceMapping() } const initTradeOffersWebSocket = (restarted = false) => { @@ -1480,6 +1488,37 @@ class TradePortal extends LitElement { } } + const initTradePresenceWebSocket = (restarted = false) => { + let socketTimeout + let socketLink = `ws://NODEURL/websockets/crosschain/tradepresence` + const socket = new WebSocket(socketLink) + // Open Connection + socket.onopen = () => { + setTimeout(pingSocket, 50) + } + // Message Event + socket.onmessage = (e) => { + tradePresenceTxns = JSON.parse(e.data) + processOffersWithPresence() + restarted = false + } + // Closed Event + socket.onclose = () => { + clearTimeout(socketTimeout) + // Restart Socket Connection + restartTradePresenceWebSocket() + } + // Error Event + socket.onerror = (e) => { + clearTimeout(socketTimeout) + } + const pingSocket = () => { + socket.send('ping') + socketTimeout = setTimeout(pingSocket, 295000) + } + } + + // Will be removed in future - being replaced by tradepresence above const initPresenceWebSocket = (restarted = false) => { let socketTimeout let socketLink = `ws://NODEURL/websockets/presence?presenceType=TRADE_BOT` @@ -1491,7 +1530,7 @@ class TradePortal extends LitElement { // Message Event socket.onmessage = (e) => { presenceTxns = JSON.parse(e.data) - handlePresence() + processOffersWithPresence() restarted = false } // Closed Event @@ -1514,6 +1553,10 @@ class TradePortal extends LitElement { setTimeout(() => initPresenceWebSocket(true), 3000) } + const restartTradePresenceWebSocket = () => { + setTimeout(() => initTradePresenceWebSocket(true), 3000) + } + const restartTradeOffersWebSocket = () => { setTimeout(() => initTradeOffersWebSocket(true), 3000) } @@ -1528,6 +1571,9 @@ class TradePortal extends LitElement { // Start PresenceWebSocket initPresenceWebSocket() + // Start TradePresenceWebSocket + initTradePresenceWebSocket() + // Start TradeBotWebSocket initTradeBotWebSocket() }