From ff83a6daabc60435d2043318558fb5e43d6a3a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= Date: Mon, 29 Oct 2018 12:45:38 -0400 Subject: [PATCH] proxy: support value expiration --- src/dht_proxy_client.cpp | 5 +++-- src/dht_proxy_server.cpp | 11 ++++++++--- tools/proxy_node.html | 14 +++++++++----- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/dht_proxy_client.cpp b/src/dht_proxy_client.cpp index d6d0a354..11e93edf 100644 --- a/src/dht_proxy_client.cpp +++ b/src/dht_proxy_client.cpp @@ -706,11 +706,12 @@ DhtProxyClient::sendListen(const std::shared_ptr& req, const V Json::CharReaderBuilder rbuilder; auto reader = std::unique_ptr(rbuilder.newCharReader()); if (reader->parse(body.data(), body.data() + body.size(), &json, &err)) { + auto expired = json.get("expired", Json::Value(false)).asBool(); auto value = std::make_shared(json); if ((not filter or filter(*value)) and cb) { std::lock_guard lock(lockCallbacks); - callbacks_.emplace_back([cb, value, state]() { - if (not state->cancel and not cb({value}, false)) + callbacks_.emplace_back([cb, value, state, expired]() { + if (not state->cancel and not cb({value}, expired)) state->cancel = true; }); loopSignal_(); diff --git a/src/dht_proxy_server.cpp b/src/dht_proxy_server.cpp index 025aea36..61d87dd1 100644 --- a/src/dht_proxy_server.cpp +++ b/src/dht_proxy_server.cpp @@ -335,7 +335,7 @@ DhtProxyServer::listen(const std::shared_ptr& session) // cache the session to avoid an incrementation of the shared_ptr's counter // else, the session->close() will not close the socket. auto cacheSession = std::weak_ptr(s); - listener.token = dht_->listen(infoHash, [cacheSession](std::shared_ptr value) { + listener.token = dht_->listen(infoHash, [cacheSession](const std::vector>& values, bool expired) { auto s = cacheSession.lock(); if (!s) return false; // Send values as soon as we get them @@ -343,8 +343,13 @@ DhtProxyServer::listen(const std::shared_ptr& session) Json::StreamWriterBuilder wbuilder; wbuilder["commentStyle"] = "None"; wbuilder["indentation"] = ""; - auto output = Json::writeString(wbuilder, value->toJson()) + "\n"; - s->yield(output, [](const std::shared_ptr){ }); + for (const auto& value : values) { + auto val = value->toJson(); + if (expired) + val["expired"] = true; + auto output = Json::writeString(wbuilder, val) + "\n"; + s->yield(output, [](const Sp&){ }); + } } return !s->is_closed(); }); diff --git a/tools/proxy_node.html b/tools/proxy_node.html index 735f0ed7..b23ef4a2 100644 --- a/tools/proxy_node.html +++ b/tools/proxy_node.html @@ -63,11 +63,15 @@ $(function() { if (!element || element.length == 0) return; const o = JSON.parse(element); - const d = window.atob(o.data); - const delay = Math.max(0, start-now); - $('
  • ').append(valueGetElement(o)).appendTo(group).hide().delay(delay).slideDown(100); - lastAppended = i+1; - start = Math.max(start, now)+25; + if (o.expired) { + $('#value'+o.id).slideUp(100, (e) => $(e.target).remove()); + } else { + const d = window.atob(o.data); + const delay = Math.max(0, start-now); + $('
  • ').append(valueGetElement(o)).appendTo(group).hide().delay(delay).slideDown(100); + lastAppended = i+1; + start = Math.max(start, now)+25; + } } } else if (this.status !== 0) { group.empty().append($('
  • ').text("Error loading content: " + this.statusText));