diff --git a/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java b/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java index 5fd191f0..26d131c4 100644 --- a/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java +++ b/src/main/java/org/qortal/api/websocket/PresenceWebSocket.java @@ -32,6 +32,7 @@ import org.qortal.repository.RepositoryManager; import org.qortal.transaction.PresenceTransaction.PresenceType; import org.qortal.transaction.Transaction.TransactionType; import org.qortal.utils.Base58; +import org.qortal.utils.NTP; @WebSocket @SuppressWarnings("serial") @@ -98,7 +99,14 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener { @Override public void listen(Event event) { - if (!(event instanceof Controller.NewTransactionEvent)) + // We use NewBlockEvent as a proxy for 1-minute timer + if (!(event instanceof Controller.NewTransactionEvent) && !(event instanceof Controller.NewBlockEvent)) + return; + + removeOldEntries(); + + if (event instanceof Controller.NewBlockEvent) + // We only wanted a chance to cull old entries return; TransactionData transactionData = ((Controller.NewTransactionEvent) event).getTransactionData(); @@ -224,4 +232,13 @@ public class PresenceWebSocket extends ApiWebSocket implements Listener { return typedPubkeyTimestamps.compute(pubKey58, (somePubKey58, currentTimestamp) -> (currentTimestamp == null || currentTimestamp < ourTimestamp) ? ourTimestamp : currentTimestamp); } + private static void removeOldEntries() { + long now = NTP.getTime(); + + currentEntries.entrySet().forEach(entry -> { + long expiryThreshold = now - entry.getKey().getLifetime(); + entry.getValue().entrySet().removeIf(pubkeyTimestamp -> pubkeyTimestamp.getValue() < expiryThreshold); + }); + } + }