blob: 091d485a4603b1b6c7c1c51f05c6afde319487a3 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_
#define PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_
#include <functional>
#include <memory>
#include <string>
#include <lib/callback/destruction_sentinel.h>
#include <lib/fit/function.h>
#include <lib/fsl/socket/socket_drainer.h>
#include <lib/fxl/macros.h>
#include <lib/fxl/strings/string_view.h>
#include "peridot/lib/firebase/status.h"
namespace firebase {
// TODO(ppi): Use a client interface instead.
using EventCallback = void(Status status, const std::string& event,
const std::string& data);
using CompletionCallback = void();
// Socket drainer that parses a stream of Server-Sent Events.
// Data format of the stream is specified in http://www.w3.org/TR/eventsource/.
class EventStream : public fsl::SocketDrainer::Client {
public:
EventStream();
~EventStream() override;
void Start(zx::socket source, fit::function<EventCallback> event_callback,
fit::function<CompletionCallback> completion_callback);
private:
friend class EventStreamTest;
// fsl::SocketDrainer::Client:
void OnDataAvailable(const void* data, size_t num_bytes) override;
void OnDataComplete() override;
// Returns false if the object has been destroyed within this method.
bool ProcessLine(fxl::StringView line);
void ProcessField(fxl::StringView field, fxl::StringView value);
fit::function<EventCallback> event_callback_;
fit::function<CompletionCallback> completion_callback_;
// Unprocessed part of the current line.
std::string pending_line_;
std::string data_;
std::string event_type_;
std::unique_ptr<fsl::SocketDrainer> drainer_;
callback::DestructionSentinel destruction_sentinel_;
FXL_DISALLOW_COPY_AND_ASSIGN(EventStream);
};
} // namespace firebase
#endif // PERIDOT_LIB_FIREBASE_EVENT_STREAM_H_