############################################# Google Wave Client-Server Protocol Whitepaper ############################################# .. Use headers in this order #=~-_ :Authors: Joe Gregorio :Version: 2.0 - May 2010 This whitepaper is part of a series. All of the whitepapers can be found on `Google Wave Federation Protocol site`_. .. _Google Wave Federation Protocol site: http://www.waveprotocol.org/whitepapers Editorial Notes ############### To provide feedback on this draft join the wave-protocol mailing list at `http://groups.google.com/group/wave-protocol `_ This current draft only covers a small subset of the functionality that is required to build a full client. Future drafts will expand to cover more functionality. Introduction ############ This document describes the protocol by which a wave client communicates with a wave server in order to create, read, and modify waves. The protocol is defined in terms of JSON messages exchanged over WebSockets. Background ########## There is already a protocol being defined to handle the federation of Waves, however it was designed as a server-to-server protocol and is not well suited for clients. What is needed is a lighter weight protocol that only captures the needs of a client-server communication channel. The WebSockets protocol was chosen because it provides the two-way communication channel needed to efficiently handle wave messages, while being light weight and targeted to browsers, which are considered a primary platform for client developers. Scope ##### This specification only covers the rudiments of the communication between a client and a server. There are many things that are not covered by this specification at this time, such as authentication, authorization, how a client determines which server to talk to, or which port to use. This protocol is a very simple client/server protocol implementation, and does not reflect the Google Wave web client protocol used in production today. Data Model ########## It is important to understand the `Wave Federation Protocol`_ and `Conversation Model`_ as a prerequisite to this specification. .. _Conversation Model: http://www.waveprotocol.org/draft-protocol-specs/wave-conversation-model .. _Wave Federation Protocol: http://www.waveprotocol.org/draft-protocol-specs/draft-protocol-spec Terminology =========== The following terminology is used by this specification: * wave - a collection of wavelets * wavelet - a collection of named documents and participants, and the domain of operational transformation * document - a structured wave document * wave message - a single message sent either from the client to the server or from the server to the client. Wave messages do not include the WebSocket opening handshake messages. Operation ######### This section assumes an elementary understanding of the theory of `Operational Transforms`_. .. _Operational Transforms: http://www.waveprotocol.org/whitepapers/operational-transform Protocol Version ================ In the current implementation the version of the protocol is carried in each message and if the server does not understand the version sent it closes the connection. Future revisions may have the client and server negotiate for an agreed upon protocol version. The version of the protocol used is 1. Transport ========= The protocol begins when a Wave client connects with a Wave server. The connection is handled by the WebSockets protocol. After the connection is initiated Wave messages are sent between the client and server encapsulated in WebSocket frames. Each message occupies a single frame. Transport Error Conditions ========================== WebSocket Errors ~~~~~~~~~~~~~~~~ TBD Timeouts ~~~~~~~~ TBD Error recovery ~~~~~~~~~~~~~~ TDB Message Flow ============ There are two kinds of Wave requests, ProtocolOpenRequest and ProtocolSubmitRequest. Communication begins when a client sends a ProtocolOpenRequest to the server with the id of a Wave it wishes to monitor and/or mutate. After opening a wave the client may send ProtocolSubmitRequests to the server to manipulate the wave. The server will send ProtocolWaveletUpdates to the client as the server representation of the wave changes. Any error messages related to the opening of a wave are sent back from the server in a ProtocolWaveletUpdate. A client may send more than one ProtocolOpenRequest, one for each wave that the client is interested in. The client MUST send a ProtocolOpenRequest for each wave that the client is interested in. A client MUST NOT send mutations for a wave id that it has not issued a ProtocolOpenRequest for. The client must wait for the server to acknowledge the ProtocolOpenRequest before sending ProtocolSubmitRequests for the given wave as it needs to include the document hash with each ProtocolSubmitRequest. ProtocolOpenRequest ~~~~~~~~~~~~~~~~~~~ The ProtocolOpenRequest contains a wave id and a wavelet_id_prefix. Those two determine the set of wavelets that the client will be notified of changes to. The wavelet_id_prefix may be shortened to match a larger subset of wavelets, with the empty string matching all wavelets in the given wave. The client can indicate if it supports snapshots when it sends a ProtocolOpenRequest. It also contains the protocol version number, which is defined as 1, per the previous section on Protocol Version. ProtocolWaveletUpdate ~~~~~~~~~~~~~~~~~~~~~ In response to a ProtocolOpenRequest the server may send any number of ProtocolWaveletUpdate messages. The ProtocolWaveletUpdate may contain a snapshot of the current wave state or it will contain one or more ProtocolWaveletDelta messages that represent deltas to be applied to wavelets that the client is monitoring. The inclusion of the snapshot is determined by the server, it will only be sent on the first ProtocolWaveletUpdate, and will only be sent if the client has indicated in its ProtocolOpenRequest that it supports receiving snapshots. ProtocolWaveletUpdate messages will only be sent for wavelets that the client is an explicit participant in. ProtocolSubmitRequest ~~~~~~~~~~~~~~~~~~~~~ This message contains a ProtocolWaveletDelta which the client requests the server to apply to a wave. Only one submit per wavelet may be outstanding at any one time. The client specifies which version to apply the delta at, and the client is expected to transform deltas pending for submission against deltas received in ProtocolWaveletUpdates from the server. ProtocolWaveletDelta's are applied atomically and either fully succeed, or the whole delta will fail. ProtocolSubmitResponse ~~~~~~~~~~~~~~~~~~~~~~ The ProtocolSubmitResponse acknowledges the ProtocolSubmitRequest and if the delta was successfully applied it also supplies the ProtocolHashedVersion of the wavelet after the delta, which the client will need to successfully submit future deltas to the wavelet. Closing a wave ~~~~~~~~~~~~~~ TBD Specific Flows ############## Search ====== TBD Creating a new wave =================== Creating a new wave is different from other flows since neither the client nor the server have the wave id. The client must generate a unique id for the wave and send a ProtocolOpenRequest for that wave id. Entropy and Wave ID Length ~~~~~~~~~~~~~~~~~~~~~~~~~~ TBD Serializing Protocol Buffers as JSON #################################### There is no standard serialization of Protocol Buffers into JSON. This section will define the serialization that is used to construct Wave Messages from the protocol buffers included in this specification. Protocol buffer messages may be nested, so this serialization algorithm must be applied recursively. The root level message is emitted as a JSON object. Each member of the message will be emitted as a key-value pair in the JSON object. Each member's key name in the JSON serialization is set to normalize(key), where normalize is a function that takes in the protocol buffer member key name and returns a JSON utf-8 string. normalize() =========== TBD Member value serialization ========================== The serialization of a value for the key is dependent on the type and modifiers of that member. If the member is flagged as 'repeated' then the serialized value will be a JSON array. The array will be filled with the serialized values of the repeated members. Modifiers ========= The following modifiers can be applied to message values and they alter how the values are serialized. repeated ~~~~~~~~ For each repeated member value, serialize it as JSON according to the following rules and add the serialization to the JSON array. required ~~~~~~~~ Required parameters are always serialized into JSON. optional ~~~~~~~~ Optional parameters are only serialized if they appear in the protocol buffer. string ====== A string member of a protocol buffer message is serialized as a JSON string. int === An int32 or int64 member of a protocol buffer message is serialized as a JSON number. bool ==== A bool value is serialized as a JSON number with a value of 1 for true and 0 for false. enum ==== An enum value is serialized as a JSON string for the enumeration's value. bytes ===== A bytes value is hex encoded and serialized as a JSON string. message ======= A protocol buffer message is serialized by recursively applying the rules in this section. Security ######## Securing the channel ==================== TBD Authenticating the client ========================= TBD Authorization ============= Authorization is covered in the `Access Control Whitepaper`_. .. _Access Control Whitepaper: http://www.waveprotocol.org/whitepapers/access-control Client-Server Protocol Buffers ############################## While the client server protocol is implemented as JSON over WebSockets, each Wave message is a JSON serialization of a protocol buffer. The protocol buffer definitions are defined as: TBD Example Client-Server Flow ########################## TBD Appendix A - Open Source Implementation Notes ############################################# The current open source implementation of the client-server protocol begins with the client opening the wave "indexwave!indexwave". That is currently an implementation detail and is not documented.