blob: 3d2f7d827dda5d773fbff57a70df97b9c87e1473 [file] [log] [blame]
// 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);
};
};