From d4fbc1687ba76b1d5f2f6a30b124f2822a13f037 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 9 Sep 2022 18:45:51 +0100 Subject: [PATCH] Optionally exclude initial data from all trade websockets, using query string parameter excludeInitialData=true Due to the large amount of data, it can take some time for the request to be processed and data to be transferred. It may make more sense to load the initial state from the standard API, and just use the websockets for updates. --- .../api/websocket/TradeBotWebSocket.java | 29 +++++++++++-------- .../api/websocket/TradeOffersWebSocket.java | 26 ++++++++++------- .../api/websocket/TradePresenceWebSocket.java | 10 +++++-- 3 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java b/src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java index 55969c6b..8d7a13cd 100644 --- a/src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java @@ -2,10 +2,7 @@ package org.qortal.api.websocket; import java.io.IOException; import java.io.StringWriter; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import org.eclipse.jetty.websocket.api.Session; @@ -85,6 +82,7 @@ public class TradeBotWebSocket extends ApiWebSocket implements Listener { @Override public void onWebSocketConnect(Session session) { Map> queryParams = session.getUpgradeRequest().getParameterMap(); + final boolean excludeInitialData = queryParams.get("excludeInitialData") != null; List foreignBlockchains = queryParams.get("foreignBlockchain"); final String foreignBlockchain = foreignBlockchains == null ? null : foreignBlockchains.get(0); @@ -98,15 +96,22 @@ public class TradeBotWebSocket extends ApiWebSocket implements Listener { // save session's preferred blockchain (if any) sessionBlockchain.put(session, foreignBlockchain); - // Send all known trade-bot entries - try (final Repository repository = RepositoryManager.getRepository()) { - List tradeBotEntries = repository.getCrossChainRepository().getAllTradeBotData(); - // Optional filtering - if (foreignBlockchain != null) - tradeBotEntries = tradeBotEntries.stream() - .filter(tradeBotData -> tradeBotData.getForeignBlockchain().equals(foreignBlockchain)) - .collect(Collectors.toList()); + + // Maybe send all known trade-bot entries + try (final Repository repository = RepositoryManager.getRepository()) { + List tradeBotEntries = new ArrayList<>(); + + // We might need to exclude the initial data from the response + if (!excludeInitialData) { + tradeBotEntries = repository.getCrossChainRepository().getAllTradeBotData(); + + // Optional filtering + if (foreignBlockchain != null) + tradeBotEntries = tradeBotEntries.stream() + .filter(tradeBotData -> tradeBotData.getForeignBlockchain().equals(foreignBlockchain)) + .collect(Collectors.toList()); + } if (!sendEntries(session, tradeBotEntries)) { session.close(4002, "websocket issue"); diff --git a/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java b/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java index 35fc4691..78c53dc3 100644 --- a/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java @@ -173,6 +173,7 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener { public void onWebSocketConnect(Session session) { Map> queryParams = session.getUpgradeRequest().getParameterMap(); final boolean includeHistoric = queryParams.get("includeHistoric") != null; + final boolean excludeInitialData = queryParams.get("excludeInitialData") != null; List foreignBlockchains = queryParams.get("foreignBlockchain"); final String foreignBlockchain = foreignBlockchains == null ? null : foreignBlockchains.get(0); @@ -189,20 +190,23 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener { List crossChainOfferSummaries = new ArrayList<>(); - synchronized (cachedInfoByBlockchain) { - Collection cachedInfos; + // We might need to exclude the initial data from the response + if (!excludeInitialData) { + synchronized (cachedInfoByBlockchain) { + Collection cachedInfos; - if (foreignBlockchain == null) - // No preferred blockchain, so iterate through all of them - cachedInfos = cachedInfoByBlockchain.values(); - else - cachedInfos = Collections.singleton(cachedInfoByBlockchain.computeIfAbsent(foreignBlockchain, k -> new CachedOfferInfo())); + if (foreignBlockchain == null) + // No preferred blockchain, so iterate through all of them + cachedInfos = cachedInfoByBlockchain.values(); + else + cachedInfos = Collections.singleton(cachedInfoByBlockchain.computeIfAbsent(foreignBlockchain, k -> new CachedOfferInfo())); - for (CachedOfferInfo cachedInfo : cachedInfos) { - crossChainOfferSummaries.addAll(cachedInfo.currentSummaries.values()); + for (CachedOfferInfo cachedInfo : cachedInfos) { + crossChainOfferSummaries.addAll(cachedInfo.currentSummaries.values()); - if (includeHistoric) - crossChainOfferSummaries.addAll(cachedInfo.historicSummaries.values()); + if (includeHistoric) + crossChainOfferSummaries.addAll(cachedInfo.historicSummaries.values()); + } } } diff --git a/src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java b/src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java index e9558599..ba9a8085 100644 --- a/src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java @@ -65,11 +65,15 @@ public class TradePresenceWebSocket extends ApiWebSocket implements Listener { @Override public void onWebSocketConnect(Session session) { Map> queryParams = session.getUpgradeRequest().getParameterMap(); + final boolean excludeInitialData = queryParams.get("excludeInitialData") != null; - List tradePresences; + List tradePresences = new ArrayList<>(); - synchronized (currentEntries) { - tradePresences = List.copyOf(currentEntries.values()); + // We might need to exclude the initial data from the response + if (!excludeInitialData) { + synchronized (currentEntries) { + tradePresences = List.copyOf(currentEntries.values()); + } } if (!sendTradePresences(session, tradePresences)) {