blob: deb4a386bc1ed802f9b62cc96203b44caa80cbdd [file] [log] [blame]
Alex Perry5f474f22020-02-01 12:14:24 -08001#include "aos/network/web_proxy_utils.h"
2
3namespace aos {
4namespace web_proxy {
5
James Kuszmaul1ec74432020-07-30 20:26:45 -07006namespace {
Alex Perry5f474f22020-02-01 12:14:24 -08007// Recommended max size is 64KiB for compatibility reasons. 256KiB theoretically
8// works on chrome but seemed to have some consistency issues. Picked a size in
9// the middle which seems to work.
10constexpr size_t kPacketSize = 125000;
11
James Kuszmaul1ec74432020-07-30 20:26:45 -070012int GetPacketCountFromSize(const int packet_size) {
13 return packet_size / kPacketSize + 1;
14}
15
16flatbuffers::Offset<flatbuffers::Vector<uint8_t>> FillOutPacketVector(
17 flatbuffers::FlatBufferBuilder *fbb, absl::Span<const uint8_t> span,
18 const int packet_index) {
19 flatbuffers::Offset<flatbuffers::Vector<uint8_t>> data_offset;
20 if (kPacketSize * (packet_index + 1) < span.size()) {
21 data_offset = fbb->CreateVector(
22 static_cast<const uint8_t *>(span.data()) + kPacketSize * packet_index,
23 kPacketSize);
24 } else {
25 const int prefix_size = kPacketSize * packet_index;
26 data_offset = fbb->CreateVector(
27 static_cast<const uint8_t *>(span.data()) + prefix_size,
28 span.size() - prefix_size);
29 }
30 return data_offset;
31}
32} // namespace
33
Alex Perry5f474f22020-02-01 12:14:24 -080034int GetPacketCount(const Context &context) {
James Kuszmaul1ec74432020-07-30 20:26:45 -070035 return GetPacketCountFromSize(context.size);
Alex Perry5f474f22020-02-01 12:14:24 -080036}
37
38flatbuffers::Offset<MessageHeader> PackMessage(
39 flatbuffers::FlatBufferBuilder *fbb, const Context &context,
40 int channel_index, int packet_index) {
James Kuszmaul1ec74432020-07-30 20:26:45 -070041 const int packet_count = GetPacketCount(context);
42 const flatbuffers::Offset<flatbuffers::Vector<uint8_t>> data_offset =
43 FillOutPacketVector(
44 fbb,
45 absl::Span<const uint8_t>{static_cast<const uint8_t *>(context.data),
46 context.size},
47 packet_index);
Alex Perry5f474f22020-02-01 12:14:24 -080048
49 MessageHeader::Builder message_header_builder(*fbb);
50 message_header_builder.add_channel_index(channel_index);
51 message_header_builder.add_queue_index(context.queue_index);
52 message_header_builder.add_packet_count(packet_count);
53 message_header_builder.add_packet_index(packet_index);
54 message_header_builder.add_data(data_offset);
55 message_header_builder.add_length(context.size);
James Kuszmaul48413bf2020-09-01 19:19:05 -070056 message_header_builder.add_monotonic_sent_time(
57 context.monotonic_event_time.time_since_epoch().count());
Alex Perry5f474f22020-02-01 12:14:24 -080058
59 return message_header_builder.Finish();
60}
61
James Kuszmaul1ec74432020-07-30 20:26:45 -070062std::vector<FlatbufferDetachedBuffer<MessageHeader>> PackBuffer(
63 absl::Span<const uint8_t> span) {
64 flatbuffers::FlatBufferBuilder fbb;
65 std::vector<FlatbufferDetachedBuffer<MessageHeader>> buffers;
66 const int packet_count = GetPacketCountFromSize(span.size());
67 for (int ii = 0; ii < packet_count; ++ii) {
68 const flatbuffers::Offset<flatbuffers::Vector<uint8_t>> data_offset =
69 FillOutPacketVector(&fbb, span, ii);
70
71 MessageHeader::Builder message_header_builder(fbb);
72 message_header_builder.add_packet_count(packet_count);
73 message_header_builder.add_packet_index(ii);
74 message_header_builder.add_data(data_offset);
75 message_header_builder.add_length(span.size());
76
77 fbb.Finish(message_header_builder.Finish());
78
79 buffers.emplace_back(fbb.Release());
80 }
81 return buffers;
82}
83
Alex Perry5f474f22020-02-01 12:14:24 -080084} // namespace web_proxy
85} // namespace aos