// Copyright 2017 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_WEBSOCKET_BUFFERED_AMOUNT_TRACKER_H_
#define COBALT_WEBSOCKET_BUFFERED_AMOUNT_TRACKER_H_

#include <deque>

namespace cobalt {
namespace websocket {

// This class is helper class for implementing the |bufferedAmount| attribute in
// the Websockets API at:
// https://www.w3.org/TR/websockets/#dom-websocket-bufferedamount.
class BufferedAmountTracker {
 public:
  BufferedAmountTracker() : total_payload_inflight_(0) {}

  // The payload in this context only applies to user messages.
  // So even though a close message might have a "payload", for the purposes
  // of the tracker, the |is_user_payload| will be false.
  void Add(const bool is_user_payload, const std::size_t message_size) {
    if (is_user_payload) {
      total_payload_inflight_ += message_size;
    }
    entries_.push_back(Entry(is_user_payload, message_size));
  }

  // Returns the number of user payload bytes popped, these are bytes that were
  // added with |is_user_payload| set to true.
  std::size_t Pop(const std::size_t number_bytes_to_pop);

  std::size_t GetTotalBytesInflight() const { return total_payload_inflight_; }

 private:
  struct Entry {
    Entry(const bool is_user_payload, const std::size_t message_size)
        : is_user_payload_(is_user_payload), message_size_(message_size) {}

    bool is_user_payload_;
    std::size_t message_size_;
  };

  typedef std::deque<Entry> Entries;

  std::size_t total_payload_inflight_;
  Entries entries_;
};

}  // namespace websocket
}  // namespace cobalt

#endif  // COBALT_WEBSOCKET_BUFFERED_AMOUNT_TRACKER_H_
