Make web proxy use EventLoop instead of ShmEventLoop

Change-Id: Ibee5190b51fae46ae40c9234cbf5e34b60f77bca
diff --git a/aos/network/web_proxy.cc b/aos/network/web_proxy.cc
index 3e9cd8f..507f73f 100644
--- a/aos/network/web_proxy.cc
+++ b/aos/network/web_proxy.cc
@@ -26,11 +26,35 @@
 
 }  // namespace
 
-WebsocketHandler::WebsocketHandler(
-    ::seasocks::Server *server,
-    const std::vector<std::unique_ptr<Subscriber>> &subscribers,
-    const aos::FlatbufferDetachedBuffer<aos::Configuration> &config)
-    : server_(server), subscribers_(subscribers), config_(config) {}
+WebsocketHandler::WebsocketHandler(::seasocks::Server *server,
+                                   aos::EventLoop *event_loop)
+    : server_(server),
+      config_(aos::CopyFlatBuffer(event_loop->configuration())) {
+  const bool is_multi_node =
+      aos::configuration::MultiNode(event_loop->configuration());
+  const aos::Node *self =
+      is_multi_node ? aos::configuration::GetMyNode(event_loop->configuration())
+                    : nullptr;
+
+  for (uint i = 0; i < event_loop->configuration()->channels()->size(); ++i) {
+    auto channel = event_loop->configuration()->channels()->Get(i);
+    if (aos::configuration::ChannelIsReadableOnNode(channel, self)) {
+      auto fetcher = event_loop->MakeRawFetcher(channel);
+      subscribers_.emplace_back(
+          std::make_unique<aos::web_proxy::Subscriber>(std::move(fetcher), i));
+    }
+  }
+
+  TimerHandler *const timer = event_loop->AddTimer([this]() {
+    for (auto &subscriber : subscribers_) {
+      subscriber->RunIteration();
+    }
+  });
+
+  event_loop->OnRun([timer, event_loop]() {
+    timer->Setup(event_loop->monotonic_now(), std::chrono::milliseconds(100));
+  });
+}
 
 void WebsocketHandler::onConnect(::seasocks::WebSocket *sock) {
   std::unique_ptr<Connection> conn =
@@ -224,11 +248,6 @@
       flatbuffers::GetRoot<message_bridge::Connect>(buffer.data.data());
   VLOG(2) << "Got a connect message " << aos::FlatbufferToJson(message);
   for (auto &subscriber : subscribers_) {
-    // Make sure the subscriber is for a channel on this node.
-    if (subscriber.get() == nullptr) {
-      VLOG(2) << ": Null subscriber";
-      continue;
-    }
     bool found_match = false;
     for (auto channel : *message->channels_to_transfer()) {
       if (subscriber->Compare(channel)) {