Add backpressure to web_proxy

Implement things such that the client will send back what it has
currently processed on a given channel. The server will then avoid
sending more than 10000 messages ahead of that point.

Also, fix up some memory management to ensure that data channels
actually get closed/destroyed at the end of a browser session.

Change-Id: Id1795d7496f410332407624a559d6a16a1698702
Signed-off-by: James Kuszmaul <jabukuszmaul@gmail.com>
diff --git a/aos/network/www/proxy.ts b/aos/network/www/proxy.ts
index 3da817c..c52f495 100644
--- a/aos/network/www/proxy.ts
+++ b/aos/network/www/proxy.ts
@@ -15,6 +15,7 @@
 import SubscriberRequest = web_proxy.aos.web_proxy.SubscriberRequest;
 import ChannelRequestFb = web_proxy.aos.web_proxy.ChannelRequest;
 import TransferMethod = web_proxy.aos.web_proxy.TransferMethod;
+import ChannelState = web_proxy.aos.web_proxy.ChannelState;
 
 // There is one handler for each DataChannel, it maintains the state of
 // multi-part messages and delegates to a callback when the message is fully
@@ -34,6 +35,16 @@
     const messageHeader = MessageHeader.getRootAsMessageHeader(
         fbBuffer as unknown as flatbuffers.ByteBuffer);
     const time = messageHeader.monotonicSentTime().toFloat64() * 1e-9;
+
+    const stateBuilder = new Builder(512) as unknown as flatbuffers.Builder;
+    ChannelState.startChannelState(stateBuilder);
+    ChannelState.addQueueIndex(stateBuilder, messageHeader.queueIndex());
+    ChannelState.addPacketIndex(stateBuilder, messageHeader.packetIndex());
+    const state = ChannelState.endChannelState(stateBuilder);
+    stateBuilder.finish(state);
+    const stateArray = stateBuilder.asUint8Array();
+    this.channel.send(stateArray);
+
     // Short circuit if only one packet
     if (messageHeader.packetCount() === 1) {
       this.handlerFunc(messageHeader.dataArray(), time);