+ MutexLock lock(&mutex);
+ assert(streams.count(stream_id) != 0);
+ Stream *stream = &streams[stream_id];
+ size_t pos = stream->data_size % BACKLOG_SIZE;
+ stream->data_size += bytes;
+
+ if (pos + bytes > BACKLOG_SIZE) {
+ size_t to_copy = BACKLOG_SIZE - pos;
+ memcpy(stream->data + pos, data, to_copy);
+ data += to_copy;
+ bytes -= to_copy;
+ pos = 0;
+ }
+
+ memcpy(stream->data + pos, data, bytes);
+
+ // TODO: wake up clients