// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// API for communicating with a Google Cast device over an authenticated
// channel.
namespace cast.channel {

  // The state of the channel.
  enum ReadyState {
    // The channel is connecting.
    connecting,
    // The channel is open and available for messaging.
    open,
    // The channel is closing.
    closing,
    // The channel is closed.
    closed
  };

  // Error conditions that the channel may encounter.  All error conditions
  // are terminal.  When an error condition is encountered the API will:
  // (1) Transition the channel to readyState == 'closed'.
  // (2) Set ChannelInfo.lastError to the error condition.
  // (3) Fire an onError event with the error condition.
  // (4) Fire an onClose event.
  enum ChannelError {
    // cast.channel.send() was called when ChannelInfo.readyState != 'open'.
    channel_not_open,
    // Authentication was requested and the receiver could not be
    // authenticated (invalid signature, invalid handhake, TLS error, etc.)
    authentication_error,
    // A new channel could not be created for reasons unrelated to
    // authentication (e.g., there is already an open channel to the same URL).
    connect_error,
    // There was an error writing or reading from the underlying socket.
    socket_error,
    // A transport level occurred (like an unparseable message).
    transport_error,
    // The client attempted to send an unsupported message type through the
    // channel.
    invalid_message,
    // An invalid channel id was passed.
    invalid_channel_id,
    // The connection could not be established before timing out.
    connect_timeout,
    // Unspecified error.
    unknown
  };

  // Authentication methods that may be required to connect to a Cast receiver.
  enum ChannelAuthType {
    // SSL over TCP.
    ssl,
    // SSL over TCP with challenge and receiver signature verification.
    ssl_verified
  };

  // Describes the information needed to connect to a Cast receiver.
  // This replaces the prior use of cast:// and casts:// URLs.
  dictionary ConnectInfo {
    // The IPV4 address of the Cast receiver, e.g. '198.1.0.2'.
    // TODO(mfoltz): Investigate whether IPV6 addresses "just work."
    DOMString ipAddress;

    // The port number to connect to, 0-65535.
    long port;

    // The amount of time to wait in milliseconds before stopping the
    // connection process. Timeouts are disabled if the value is zero.
    // The default timeout is 8000ms.
    long? timeout;

    // The authentication method required for the channel.
    ChannelAuthType auth;
  };

  // Describes the state of a channel to a Cast receiver.
  dictionary ChannelInfo {
    // Id for the channel.
    long channelId;

    // DEPRECATED: The URL to the receiver.  This field will be removed in a
    // future release.
    DOMString url;

    // Connection information that was used to establish the channel to the
    // receiver.
    ConnectInfo connectInfo;

    // The current state of the channel.
    ReadyState readyState;
      
    // If set, the last error condition encountered by the channel.
    ChannelError? errorState;
  };

  // Describes a message sent or received over the channel.  Currently only
  // string messages are supported, although ArrayBuffer and Blob types may be
  // supported in the future.
  dictionary MessageInfo {
    // The message namespace.  A namespace is a URN of the form
    // urn:cast-x:<namespace> that is used to interpret and route Cast messages.
    DOMString namespace_;

    // source and destination ids identify the origin and destination of the
    // message.  They are used to route messages between endpoints that share a
    // device-to-device channel.
    //
    // For messages between applications:
    //   - The sender application id is a unique identifier generated on behalf
    //     of the sender application.
    //   - The receiver id is always the the session id for the application.
    //
    // For messages to or from the sender or receiver platform, the special ids
    // 'sender-0' and 'receiver-0' can be used.
    // 
    // For messages intended for all endpoints using a given channel, the
    // wildcard destination_id '*' can be used.
    DOMString sourceId;
    DOMString destinationId;

    // The content of the message.  Must be either a string or an ArrayBuffer.
    any data;
  };

  // Describes a terminal error encountered by the channel with details of the
  // error that caused the channel to be closed.  One or more of the optional
  // fields may be set with specific error codes from the underlying
  // implementation.
  dictionary ErrorInfo {
    // The type of error encountered by the channel.
    ChannelError errorState;

    // The event that was occurring when the error happened.  Values are defined
    // in the enum EventType in logging.proto.
    long? eventType;

    // An error encountered when processing the authentication handshake.
    // Values are defined in the enum ChallengeReplyErrorType in logging.proto.
    long? challengeReplyErrorType;

    // A return value from the underlying net:: socket libraries. Values are
    // defined in net/base/net_error_list.h.
    long? netReturnValue;

    // An error code returned by NSS. Values are defined in secerr.h.
    long? nssErrorCode;
  };

  // Callback holding the result of a channel operation.
  callback ChannelInfoCallback = void (ChannelInfo result);

  // Callback from <code>getLogs</code> method.
  // |log|: compressed serialized raw bytes containing the logs.
  // The log is formatted using protocol buffer.
  // See extensions/browser/api/cast_channel/logging.proto for definition.
  // Compression is in gzip format.
  callback GetLogsCallback = void (ArrayBuffer log);
  
  interface Functions {
    // Opens a new channel to the Cast receiver specified by connectInfo.  Only
    // one channel may be connected to same receiver from the same extension at
    // a time.  If the open request is successful, the callback will be invoked
    // with a ChannelInfo with readyState == 'connecting'.  If unsuccessful, the
    // callback will be invoked with a ChannelInfo with channel.readyState ==
    // 'closed', channel.errorState will be set to the error condition, and
    // onError will be fired with error details.
    //
    // TODO(mfoltz): Convert 'any' to ConnectInfo once all clients are updated
    // to not send URLs.
    static void open(any connectInfo,
                     ChannelInfoCallback callback);

    // Sends a message on the channel and invokes callback with the resulting
    // channel status.  The channel must be in readyState == 'open'.  If
    // unsuccessful, channel.readyState will be set to 'closed',
    // channel.errorState will be set to the error condition, and onError will
    // be fired with error details.
    static void send(ChannelInfo channel,
                     MessageInfo message,
                     ChannelInfoCallback callback);

    // Requests that the channel be closed and invokes callback with the
    // resulting channel status.  The channel must be in readyState == 'open' or
    // 'connecting'.  If successful, onClose will be fired with readyState ==
    // 'closed'.  If unsuccessful, channel.readyState will be set to 'closed',
    // and channel.errorState will be set to the error condition.
    static void close(ChannelInfo channel,
                      ChannelInfoCallback callback);
      
    // Get logs in compressed serialized format. See GetLogsCallback for
    // details.  
    // |callback|: If successful, |callback| is invoked with data. Otherwise,
    // an error will be raised.                
    static void getLogs(GetLogsCallback callback);
  };

  // Events on the channel.
  interface Events {
    // Fired when a message is received on an open channel.
    static void onMessage(ChannelInfo channel,
                          MessageInfo message);

    // Fired when an error occurs as a result of a channel operation or a
    // network event. |error| contains details of the error.
    static void onError(ChannelInfo channel, ErrorInfo error);
  };
};
