Home | History | Annotate | Download | only in api
      1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 /**
      7  * This file defines the <code>PPB_WebSocket</code> interface providing
      8  * bi-directional, full-duplex, communications over a single TCP socket.
      9  */
     10 
     11 [generate_thunk]
     12 
     13 label Chrome {
     14   M18 = 1.0
     15 };
     16 
     17 /**
     18  * This enumeration contains the types representing the WebSocket ready state
     19  * and these states are based on the JavaScript WebSocket API specification.
     20  * GetReadyState() returns one of these states.
     21  */
     22 [assert_size(4)]
     23 enum PP_WebSocketReadyState {
     24   /**
     25    * Ready state is queried on an invalid resource.
     26    */
     27   PP_WEBSOCKETREADYSTATE_INVALID = -1,
     28 
     29   /**
     30    * Ready state that the connection has not yet been established.
     31    */
     32   PP_WEBSOCKETREADYSTATE_CONNECTING = 0,
     33 
     34   /**
     35    * Ready state that the WebSocket connection is established and communication
     36    * is possible.
     37    */
     38   PP_WEBSOCKETREADYSTATE_OPEN = 1,
     39 
     40   /**
     41    * Ready state that the connection is going through the closing handshake.
     42    */
     43   PP_WEBSOCKETREADYSTATE_CLOSING = 2,
     44 
     45   /**
     46    * Ready state that the connection has been closed or could not be opened.
     47    */
     48   PP_WEBSOCKETREADYSTATE_CLOSED = 3
     49 };
     50 
     51 /**
     52  * This enumeration contains status codes. These codes are used in Close() and
     53  * GetCloseCode(). Refer to RFC 6455, The WebSocket Protocol, for further
     54  * information.
     55  * <code>PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE</code> and codes in the range
     56  * <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN</code> to
     57  * <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MAX</code>, and
     58  * <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MIN</code> to
     59  * <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX</code> are valid for Close().
     60  */
     61 [assert_size(4)]
     62 enum PP_WebSocketCloseCode {
     63   /**
     64    * Indicates to request closing connection without status code and reason.
     65    *
     66    * (Note that the code 1005 is forbidden to send in actual close frames by
     67    * the RFC. PP_WebSocket reuses this code internally and the code will never
     68    * appear in the actual close frames.)
     69    */
     70   PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED = 1005,
     71 
     72   /**
     73    * Status codes in the range 0-999 are not used.
     74    */
     75 
     76   /**
     77    * Indicates a normal closure.
     78    */
     79   PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE = 1000,
     80 
     81   /**
     82    * Indicates that an endpoint is "going away", such as a server going down.
     83    */
     84   PP_WEBSOCKETSTATUSCODE_GOING_AWAY = 1001,
     85 
     86   /**
     87    * Indicates that an endpoint is terminating the connection due to a protocol
     88    * error.
     89    */
     90   PP_WEBSOCKETSTATUSCODE_PROTOCOL_ERROR = 1002,
     91 
     92   /**
     93    * Indicates that an endpoint is terminating the connection because it has
     94    * received a type of data it cannot accept.
     95    */
     96   PP_WEBSOCKETSTATUSCODE_UNSUPPORTED_DATA = 1003,
     97 
     98   /**
     99    * Status code 1004 is reserved.
    100    */
    101 
    102   /**
    103    * Pseudo code to indicate that receiving close frame doesn't contain any
    104    * status code.
    105    */
    106   PP_WEBSOCKETSTATUSCODE_NO_STATUS_RECEIVED = 1005,
    107 
    108   /**
    109    * Pseudo code to indicate that connection was closed abnormally, e.g.,
    110    * without closing handshake.
    111    */
    112   PP_WEBSOCKETSTATUSCODE_ABNORMAL_CLOSURE = 1006,
    113 
    114   /**
    115    * Indicates that an endpoint is terminating the connection because it has
    116    * received data within a message that was not consistent with the type of
    117    * the message (e.g., non-UTF-8 data within a text message).
    118    */
    119   PP_WEBSOCKETSTATUSCODE_INVALID_FRAME_PAYLOAD_DATA = 1007,
    120 
    121   /**
    122    * Indicates that an endpoint is terminating the connection because it has
    123    * received a message that violates its policy.
    124    */
    125   PP_WEBSOCKETSTATUSCODE_POLICY_VIOLATION = 1008,
    126 
    127   /**
    128    * Indicates that an endpoint is terminating the connection because it has
    129    * received a message that is too big for it to process.
    130    */
    131   PP_WEBSOCKETSTATUSCODE_MESSAGE_TOO_BIG = 1009,
    132 
    133   /**
    134    * Indicates that an endpoint (client) is terminating the connection because
    135    * it has expected the server to negotiate one or more extension, but the
    136    * server didn't return them in the response message of the WebSocket
    137    * handshake.
    138    */
    139   PP_WEBSOCKETSTATUSCODE_MANDATORY_EXTENSION = 1010,
    140 
    141   /**
    142    * Indicates that a server is terminating the connection because it
    143    * encountered an unexpected condition.
    144    */
    145   PP_WEBSOCKETSTATUSCODE_INTERNAL_SERVER_ERROR = 1011,
    146 
    147   /**
    148    * Status codes in the range 1012-1014 are reserved.
    149    */
    150 
    151   /**
    152    * Pseudo code to indicate that the connection was closed due to a failure to
    153    * perform a TLS handshake.
    154    */
    155   PP_WEBSOCKETSTATUSCODE_TLS_HANDSHAKE = 1015,
    156 
    157   /**
    158    * Status codes in the range 1016-2999 are reserved.
    159    */
    160 
    161   /**
    162    * Status codes in the range 3000-3999 are reserved for use by libraries,
    163    * frameworks, and applications. These codes are registered directly with
    164    * IANA.
    165    */
    166   PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN = 3000,
    167   PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MAX = 3999,
    168 
    169   /**
    170    * Status codes in the range 4000-4999 are reserved for private use.
    171    * Application can use these codes for application specific purposes freely.
    172    */
    173   PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MIN = 4000,
    174   PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX = 4999
    175 };
    176 
    177 /**
    178  * The <code>PPB_WebSocket</code> interface provides bi-directional,
    179  * full-duplex, communications over a single TCP socket.
    180  */
    181 interface PPB_WebSocket {
    182   /**
    183    * Create() creates a WebSocket instance.
    184    *
    185    * @param[in] instance A <code>PP_Instance</code> identifying the instance
    186    * with the WebSocket.
    187    *
    188    * @return A <code>PP_Resource</code> corresponding to a WebSocket if
    189    * successful.
    190    */
    191   PP_Resource Create([in] PP_Instance instance);
    192 
    193   /**
    194    * IsWebSocket() determines if the provided <code>resource</code> is a
    195    * WebSocket instance.
    196    *
    197    * @param[in] resource A <code>PP_Resource</code> corresponding to a
    198    * WebSocket.
    199    *
    200    * @return Returns <code>PP_TRUE</code> if <code>resource</code> is a
    201    * <code>PPB_WebSocket</code>, <code>PP_FALSE</code> if the
    202    * <code>resource</code> is invalid or some type other than
    203    * <code>PPB_WebSocket</code>.
    204    */
    205   PP_Bool IsWebSocket([in] PP_Resource resource);
    206 
    207   /**
    208    * Connect() connects to the specified WebSocket server. You can call this
    209    * function once for a <code>web_socket</code>.
    210    *
    211    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    212    * WebSocket.
    213    *
    214    * @param[in] url A <code>PP_Var</code> representing a WebSocket server URL.
    215    * The <code>PP_VarType</code> must be <code>PP_VARTYPE_STRING</code>.
    216    *
    217    * @param[in] protocols A pointer to an array of <code>PP_Var</code>
    218    * specifying sub-protocols. Each <code>PP_Var</code> represents one
    219    * sub-protocol and its <code>PP_VarType</code> must be
    220    * <code>PP_VARTYPE_STRING</code>. This argument can be null only if
    221    * <code>protocol_count</code> is 0.
    222    *
    223    * @param[in] protocol_count The number of sub-protocols in
    224    * <code>protocols</code>.
    225    *
    226    * @param[in] callback A <code>PP_CompletionCallback</code> called
    227    * when a connection is established or an error occurs in establishing
    228    * connection.
    229    *
    230    * @return An int32_t containing an error code from <code>pp_errors.h</code>.
    231    * Returns <code>PP_ERROR_BADARGUMENT</code> if the specified
    232    * <code>url</code>, or <code>protocols</code> contain an invalid string as
    233    * defined in the WebSocket API specification.
    234    * <code>PP_ERROR_BADARGUMENT</code> corresponds to a SyntaxError in the
    235    * WebSocket API specification.
    236    * Returns <code>PP_ERROR_NOACCESS</code> if the protocol specified in the
    237    * <code>url</code> is not a secure protocol, but the origin of the caller
    238    * has a secure scheme. Also returns <code>PP_ERROR_NOACCESS</code> if the
    239    * port specified in the <code>url</code> is a port that the user agent
    240    * is configured to block access to because it is a well-known port like
    241    * SMTP. <code>PP_ERROR_NOACCESS</code> corresponds to a SecurityError of the
    242    * specification.
    243    * Returns <code>PP_ERROR_INPROGRESS</code> if this is not the first call to
    244    * Connect().
    245    */
    246   [report_errors=False]
    247   int32_t Connect([in] PP_Resource web_socket,
    248                   [in] PP_Var url,
    249                   [in, size_as=protocol_count] PP_Var[] protocols,
    250                   [in] uint32_t protocol_count,
    251                   [in] PP_CompletionCallback callback);
    252 
    253   /**
    254    * Close() closes the specified WebSocket connection by specifying
    255    * <code>code</code> and <code>reason</code>.
    256    *
    257    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    258    * WebSocket.
    259    *
    260    * @param[in] code The WebSocket close code. This is ignored if it is
    261    * <code>PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED</code>.
    262    * <code>PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE</code> must be used for the
    263    * usual case. To indicate some specific error cases, codes in the range
    264    * <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN</code> to
    265    * <code>PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MAX</code>, and in the range
    266    * <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MIN</code> to
    267    * <code>PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX</code> are available.
    268    *
    269    * @param[in] reason A <code>PP_Var</code> representing the WebSocket
    270    * close reason. This is ignored if it is <code>PP_VARTYPE_UNDEFINED</code>.
    271    * Otherwise, its <code>PP_VarType</code> must be
    272    * <code>PP_VARTYPE_STRING</code>.
    273    *
    274    * @param[in] callback A <code>PP_CompletionCallback</code> called
    275    * when the connection is closed or an error occurs in closing the
    276    * connection.
    277    *
    278    * @return An int32_t containing an error code from <code>pp_errors.h</code>.
    279    * Returns <code>PP_ERROR_BADARGUMENT</code> if <code>reason</code> contains
    280    * an invalid character as a UTF-8 string, or is longer than 123 bytes.
    281    * <code>PP_ERROR_BADARGUMENT</code> corresponds to a JavaScript SyntaxError
    282    * in the WebSocket API specification.
    283    * Returns <code>PP_ERROR_NOACCESS</code> if the code is not an integer
    284    * equal to 1000 or in the range 3000 to 4999. <code>PP_ERROR_NOACCESS</code>
    285    * corresponds to an InvalidAccessError in the WebSocket API specification.
    286    * Returns <code>PP_ERROR_INPROGRESS</code> if a previous call to Close() is
    287    * not finished.
    288    */
    289   [report_errors=False]
    290   int32_t Close([in] PP_Resource web_socket,
    291                 [in] uint16_t code,
    292                 [in] PP_Var reason,
    293                 [in] PP_CompletionCallback callback);
    294 
    295   /**
    296    * ReceiveMessage() receives a message from the WebSocket server.
    297    * This interface only returns a single message. That is, this interface must
    298    * be called at least N times to receive N messages, no matter the size of
    299    * each message.
    300    *
    301    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    302    * WebSocket.
    303    *
    304    * @param[out] message The received message is copied to provided
    305    * <code>message</code>. The <code>message</code> must remain valid until
    306    * ReceiveMessage() completes. Its received <code>PP_VarType</code> will be
    307    * <code>PP_VARTYPE_STRING</code> or <code>PP_VARTYPE_ARRAY_BUFFER</code>.
    308    *
    309    * @param[in] callback A <code>PP_CompletionCallback</code> called
    310    * when ReceiveMessage() completes. This callback is ignored if
    311    * ReceiveMessage() completes synchronously and returns <code>PP_OK</code>.
    312    *
    313    * @return An int32_t containing an error code from <code>pp_errors.h</code>.
    314    * If an error is detected or connection is closed, ReceiveMessage() returns
    315    * <code>PP_ERROR_FAILED</code> after all buffered messages are received.
    316    * Until buffered message become empty, ReceiveMessage() continues to return
    317    * <code>PP_OK</code> as if connection is still established without errors.
    318    */
    319   [report_errors=False]
    320   int32_t ReceiveMessage([in] PP_Resource web_socket,
    321                          [out] PP_Var message,
    322                          [in] PP_CompletionCallback callback);
    323 
    324   /**
    325    * SendMessage() sends a message to the WebSocket server.
    326    *
    327    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    328    * WebSocket.
    329    *
    330    * @param[in] message A message to send. The message is copied to an internal
    331    * buffer, so the caller can free <code>message</code> safely after returning
    332    * from the function. Its sent <code>PP_VarType</code> must be
    333    * <code>PP_VARTYPE_STRING</code> or <code>PP_VARTYPE_ARRAY_BUFFER</code>.
    334    *
    335    * @return An int32_t containing an error code from <code>pp_errors.h</code>.
    336    * Returns <code>PP_ERROR_FAILED</code> if the ReadyState is
    337    * <code>PP_WEBSOCKETREADYSTATE_CONNECTING</code>.
    338    * <code>PP_ERROR_FAILED</code> corresponds to a JavaScript
    339    * InvalidStateError in the WebSocket API specification.
    340    * Returns <code>PP_ERROR_BADARGUMENT</code> if the provided
    341    * <code>message</code> contains an invalid character as a UTF-8 string.
    342    * <code>PP_ERROR_BADARGUMENT</code> corresponds to a JavaScript
    343    * SyntaxError in the WebSocket API specification.
    344    * Otherwise, returns <code>PP_OK</code>, which doesn't necessarily mean
    345    * that the server received the message.
    346    */
    347   [report_errors=False]
    348   int32_t SendMessage([in] PP_Resource web_socket,
    349                       [in] PP_Var message);
    350 
    351   /**
    352    * GetBufferedAmount() returns the number of bytes of text and binary
    353    * messages that have been queued for the WebSocket connection to send, but
    354    * have not been transmitted to the network yet.
    355    *
    356    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    357    * WebSocket.
    358    *
    359    * @return Returns the number of bytes.
    360    */
    361   [report_errors=False]
    362   uint64_t GetBufferedAmount([in] PP_Resource web_socket);
    363 
    364   /**
    365    * GetCloseCode() returns the connection close code for the WebSocket
    366    * connection.
    367    *
    368    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    369    * WebSocket.
    370    *
    371    * @return Returns 0 if called before the close code is set.
    372    */
    373   [report_errors=False]
    374   uint16_t GetCloseCode([in] PP_Resource web_socket);
    375 
    376   /**
    377    * GetCloseReason() returns the connection close reason for the WebSocket
    378    * connection.
    379    *
    380    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    381    * WebSocket.
    382    *
    383    * @return Returns a <code>PP_VARTYPE_STRING</code> var. If called before the
    384    * close reason is set, the return value contains an empty string. Returns a
    385    * <code>PP_VARTYPE_UNDEFINED</code> if called on an invalid resource.
    386    */
    387   [report_errors=False]
    388   PP_Var GetCloseReason([in] PP_Resource web_socket);
    389 
    390   /**
    391    * GetCloseWasClean() returns if the connection was closed cleanly for the
    392    * specified WebSocket connection.
    393    *
    394    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    395    * WebSocket.
    396    *
    397    * @return Returns <code>PP_FALSE</code> if called before the connection is
    398    * closed, called on an invalid resource, or closed for abnormal reasons.
    399    * Otherwise, returns <code>PP_TRUE</code> if the connection was closed
    400    * cleanly.
    401    */
    402   [report_errors=False]
    403   PP_Bool GetCloseWasClean([in] PP_Resource web_socket);
    404 
    405   /**
    406    * GetExtensions() returns the extensions selected by the server for the
    407    * specified WebSocket connection.
    408    *
    409    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    410    * WebSocket.
    411    *
    412    * @return Returns a <code>PP_VARTYPE_STRING</code> var. If called before the
    413    * connection is established, the var's data is an empty string. Returns a
    414    * <code>PP_VARTYPE_UNDEFINED</code> if called on an invalid resource.
    415    */
    416   [report_errors=False]
    417   PP_Var GetExtensions([in] PP_Resource web_socket);
    418 
    419   /**
    420    * GetProtocol() returns the sub-protocol chosen by the server for the
    421    * specified WebSocket connection.
    422    *
    423    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    424    * WebSocket.
    425    *
    426    * @return Returns a <code>PP_VARTYPE_STRING</code> var. If called before the
    427    * connection is established, the var contains the empty string. Returns a
    428    * <code>PP_VARTYPE_UNDEFINED</code> if called on an invalid resource.
    429    */
    430   [report_errors=False]
    431   PP_Var GetProtocol([in] PP_Resource web_socket);
    432 
    433   /**
    434    * GetReadyState() returns the ready state of the specified WebSocket
    435    * connection.
    436    *
    437    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    438    * WebSocket.
    439    *
    440    * @return Returns <code>PP_WEBSOCKETREADYSTATE_INVALID</code> if called
    441    * before Connect() is called, or if this function is called on an
    442    * invalid resource.
    443    */
    444   [on_failure=PP_WEBSOCKETREADYSTATE_INVALID, report_errors=False]
    445   PP_WebSocketReadyState GetReadyState([in] PP_Resource web_socket);
    446 
    447   /**
    448    * GetURL() returns the URL associated with specified WebSocket connection.
    449    *
    450    * @param[in] web_socket A <code>PP_Resource</code> corresponding to a
    451    * WebSocket.
    452    *
    453    * @return Returns a <code>PP_VARTYPE_STRING</code> var. If called before the
    454    * connection is established, the var contains the empty string. Returns a
    455    * <code>PP_VARTYPE_UNDEFINED</code> if this function is called on an
    456    * invalid resource.
    457    */
    458   [report_errors=False]
    459   PP_Var GetURL([in] PP_Resource web_socket);
    460 };
    461