// Copyright 2019 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.

library fuchsia.firebase.messaging;

struct Application {
    /// Full package name of the application.
    string name;
    /// Sender ID associated with the firebase project.
    string sender;
    /// Application-defined string.
    string version;
};

/// Connectivity events to sign up for.
bits ConnectivityEvent:uint8 {
    /// Indicates that the client has signed up for connectivity notifications.
    START = 1;

    /// Informs the service on client disconnection.
    DISCONNECT = 2;

    /// Informs the service of heartbeats from the client. May be noisy.
    HEARTBEAT = 4;
};

struct Pair {
    string:4096 key;
    string:4096 val;
};

enum Priority {
    NORMAL = 5;
    HIGH = 10;
};

/// Data wrapper for FCM.
table Message {
    /// This parameter specifies the recipient of a message.
    ///
    /// For example it can be a registration token, a topic name, a IID or
    /// project ID.
    ///
    /// For upstream messages, `PROJECT_ID@gcm.googleapis.com` or the more general
    /// IID format are accepted.
    1: string to;

    /// The metadata, including all original key/value pairs. Includes some of
    /// the HTTP headers used when sending the message. `gcm`, `google` and
    /// `goog` prefixes are reserved for internal use.
    2: vector<Pair>:4096 metadata;

    /// Binary payload. For webpush and non-json messages, this is the body of
    /// the request entity.
    3: bytes:4096 payload;

    /// Message ID. This can be specified by sender. Internally a hash of the
    /// message ID and other elements will be used for storage. The ID must be
    /// unique for each topic subscription - using the same ID may result in
    /// overriding the original message or duplicate delivery.
    4: string id;
};

table DownstreamMessage {
    1: Message message;

    /// Authenticated ID of the sender. This is a project number in most cases.
    2: string from;

    /// The collapse key used for collapsible messages.
    3: string collapse_key;

    /// Equivalent with a content-type.
    /// Special types:
    /// "ack" and "nack" are used for flow control and error handling.
    /// "control" is used for connection control.
    4: string type;

    /// Priority level. By default messages are sent with normal priority.
    5: Priority priority;

    /// Time to live, in seconds.
    6: uint32 time_to_live;
};
