Browse Source

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.
online-accounts-mempow-v2-block-updates
CalDescent 2 years ago
parent
commit
d4fbc1687b
  1. 27
      src/main/java/org/qortal/api/websocket/TradeBotWebSocket.java
  2. 26
      src/main/java/org/qortal/api/websocket/TradeOffersWebSocket.java
  3. 10
      src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java

27
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.IOException;
import java.io.StringWriter; import java.io.StringWriter;
import java.util.Collections; import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.Session;
@ -85,6 +82,7 @@ public class TradeBotWebSocket extends ApiWebSocket implements Listener {
@Override @Override
public void onWebSocketConnect(Session session) { public void onWebSocketConnect(Session session) {
Map<String, List<String>> queryParams = session.getUpgradeRequest().getParameterMap(); Map<String, List<String>> queryParams = session.getUpgradeRequest().getParameterMap();
final boolean excludeInitialData = queryParams.get("excludeInitialData") != null;
List<String> foreignBlockchains = queryParams.get("foreignBlockchain"); List<String> foreignBlockchains = queryParams.get("foreignBlockchain");
final String foreignBlockchain = foreignBlockchains == null ? null : foreignBlockchains.get(0); 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) // save session's preferred blockchain (if any)
sessionBlockchain.put(session, foreignBlockchain); sessionBlockchain.put(session, foreignBlockchain);
// Send all known trade-bot entries
// Maybe send all known trade-bot entries
try (final Repository repository = RepositoryManager.getRepository()) { try (final Repository repository = RepositoryManager.getRepository()) {
List<TradeBotData> tradeBotEntries = repository.getCrossChainRepository().getAllTradeBotData(); List<TradeBotData> tradeBotEntries = new ArrayList<>();
// Optional filtering // We might need to exclude the initial data from the response
if (foreignBlockchain != null) if (!excludeInitialData) {
tradeBotEntries = tradeBotEntries.stream() tradeBotEntries = repository.getCrossChainRepository().getAllTradeBotData();
.filter(tradeBotData -> tradeBotData.getForeignBlockchain().equals(foreignBlockchain))
.collect(Collectors.toList()); // Optional filtering
if (foreignBlockchain != null)
tradeBotEntries = tradeBotEntries.stream()
.filter(tradeBotData -> tradeBotData.getForeignBlockchain().equals(foreignBlockchain))
.collect(Collectors.toList());
}
if (!sendEntries(session, tradeBotEntries)) { if (!sendEntries(session, tradeBotEntries)) {
session.close(4002, "websocket issue"); session.close(4002, "websocket issue");

26
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) { public void onWebSocketConnect(Session session) {
Map<String, List<String>> queryParams = session.getUpgradeRequest().getParameterMap(); Map<String, List<String>> queryParams = session.getUpgradeRequest().getParameterMap();
final boolean includeHistoric = queryParams.get("includeHistoric") != null; final boolean includeHistoric = queryParams.get("includeHistoric") != null;
final boolean excludeInitialData = queryParams.get("excludeInitialData") != null;
List<String> foreignBlockchains = queryParams.get("foreignBlockchain"); List<String> foreignBlockchains = queryParams.get("foreignBlockchain");
final String foreignBlockchain = foreignBlockchains == null ? null : foreignBlockchains.get(0); final String foreignBlockchain = foreignBlockchains == null ? null : foreignBlockchains.get(0);
@ -189,20 +190,23 @@ public class TradeOffersWebSocket extends ApiWebSocket implements Listener {
List<CrossChainOfferSummary> crossChainOfferSummaries = new ArrayList<>(); List<CrossChainOfferSummary> crossChainOfferSummaries = new ArrayList<>();
synchronized (cachedInfoByBlockchain) { // We might need to exclude the initial data from the response
Collection<CachedOfferInfo> cachedInfos; if (!excludeInitialData) {
synchronized (cachedInfoByBlockchain) {
Collection<CachedOfferInfo> cachedInfos;
if (foreignBlockchain == null) if (foreignBlockchain == null)
// No preferred blockchain, so iterate through all of them // No preferred blockchain, so iterate through all of them
cachedInfos = cachedInfoByBlockchain.values(); cachedInfos = cachedInfoByBlockchain.values();
else else
cachedInfos = Collections.singleton(cachedInfoByBlockchain.computeIfAbsent(foreignBlockchain, k -> new CachedOfferInfo())); cachedInfos = Collections.singleton(cachedInfoByBlockchain.computeIfAbsent(foreignBlockchain, k -> new CachedOfferInfo()));
for (CachedOfferInfo cachedInfo : cachedInfos) { for (CachedOfferInfo cachedInfo : cachedInfos) {
crossChainOfferSummaries.addAll(cachedInfo.currentSummaries.values()); crossChainOfferSummaries.addAll(cachedInfo.currentSummaries.values());
if (includeHistoric) if (includeHistoric)
crossChainOfferSummaries.addAll(cachedInfo.historicSummaries.values()); crossChainOfferSummaries.addAll(cachedInfo.historicSummaries.values());
}
} }
} }

10
src/main/java/org/qortal/api/websocket/TradePresenceWebSocket.java

@ -65,11 +65,15 @@ public class TradePresenceWebSocket extends ApiWebSocket implements Listener {
@Override @Override
public void onWebSocketConnect(Session session) { public void onWebSocketConnect(Session session) {
Map<String, List<String>> queryParams = session.getUpgradeRequest().getParameterMap(); Map<String, List<String>> queryParams = session.getUpgradeRequest().getParameterMap();
final boolean excludeInitialData = queryParams.get("excludeInitialData") != null;
List<TradePresenceData> tradePresences; List<TradePresenceData> tradePresences = new ArrayList<>();
synchronized (currentEntries) { // We might need to exclude the initial data from the response
tradePresences = List.copyOf(currentEntries.values()); if (!excludeInitialData) {
synchronized (currentEntries) {
tradePresences = List.copyOf(currentEntries.values());
}
} }
if (!sendTradePresences(session, tradePresences)) { if (!sendTradePresences(session, tradePresences)) {

Loading…
Cancel
Save