|  |  |  | package signalservice;
 | 
					
						
							|  |  |  | syntax = "proto2";
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message Envelope {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum Type {
 | 
					
						
							|  |  |  |     SESSION_MESSAGE = 6;
 | 
					
						
							|  |  |  |     CLOSED_GROUP_MESSAGE = 7;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required Type   type            = 1;
 | 
					
						
							|  |  |  |   optional string source          = 2;
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required uint64 timestamp       = 5;
 | 
					
						
							|  |  |  |   optional bytes  content         = 8;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message TypingMessage {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     enum Action {
 | 
					
						
							|  |  |  |         STARTED = 0;
 | 
					
						
							|  |  |  |         STOPPED = 1;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     required uint64 timestamp = 1;
 | 
					
						
							|  |  |  |     required Action action    = 2;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message Unsend {
 | 
					
						
							|  |  |  |   required uint64 timestamp = 1;
 | 
					
						
							|  |  |  |   required string author    = 2;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message MessageRequestResponse {
 | 
					
						
							|  |  |  |   required bool                      isApproved                = 1;
 | 
					
						
							|  |  |  |   optional bytes                     profileKey                = 2;
 | 
					
						
							|  |  |  |   optional DataMessage.LokiProfile   profile                   = 3;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message SharedConfigMessage {
 | 
					
						
							|  |  |  |   enum Kind {
 | 
					
						
							|  |  |  |     USER_PROFILE              = 1;
 | 
					
						
							|  |  |  |     CONTACTS                  = 2;
 | 
					
						
							|  |  |  |     CONVO_INFO_VOLATILE       = 3;
 | 
					
						
							|  |  |  |     USER_GROUPS               = 4;
 | 
					
						
							|  |  |  |    // CLOSED_GROUP_INFO       = 5;
 | 
					
						
							|  |  |  |    // CLOSED_GROUP_MEMBERS    = 6;
 | 
					
						
							|  |  |  |    // ENCRYPTION_KEYS         = 7;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   required Kind              kind             = 1;
 | 
					
						
							|  |  |  |   required int64             seqno            = 2;
 | 
					
						
							|  |  |  |   required bytes             data             = 3;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message Content {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum ExpirationType {
 | 
					
						
							|  |  |  |     UNKNOWN             = 0;
 | 
					
						
							|  |  |  |     DELETE_AFTER_READ   = 1;
 | 
					
						
							|  |  |  |     DELETE_AFTER_SEND   = 2;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   optional DataMessage                dataMessage                = 1;
 | 
					
						
							|  |  |  |   optional CallMessage                callMessage                = 3;
 | 
					
						
							|  |  |  |   optional ReceiptMessage             receiptMessage             = 5;
 | 
					
						
							|  |  |  |   optional TypingMessage              typingMessage              = 6;
 | 
					
						
							|  |  |  |   optional ConfigurationMessage       configurationMessage       = 7;
 | 
					
						
							|  |  |  |   optional DataExtractionNotification dataExtractionNotification = 8;
 | 
					
						
							|  |  |  |   optional Unsend                     unsendMessage              = 9;
 | 
					
						
							|  |  |  |   optional MessageRequestResponse     messageRequestResponse     = 10;
 | 
					
						
							|  |  |  |   optional SharedConfigMessage        sharedConfigMessage        = 11;
 | 
					
						
							|  |  |  |   optional ExpirationType             expirationType             = 12;
 | 
					
						
							|  |  |  |   optional uint32                     expirationTimer            = 13;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message KeyPair {
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required bytes publicKey  = 1;
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required bytes privateKey = 2;
 | 
					
						
							| 
									
										
											  
											
												Feature: Blue check marks for read messages if opted in (#1489)
* Refactor delivery receipt event handler
* Rename the delivery receipt event
For less ambiguity with read receipts.
* Rename synced read event
For less ambiguity with read receipts from other Signal users.
* Add support for incoming receipt messages
Handle ReceiptMessages, which may include encrypted delivery receipts or read
receipts from recipients of our sent messages.
// FREEBIE
* Rename ReadReceipts to ReadSyncs
* Render read messages with blue double checks
* Send read receipts to senders of incoming messages
// FREEBIE
* Move ReadSyncs to their own file
// FREEBIE
* Fixup old comments on read receipts (now read syncs)
And some variable renaming for extra clarity.
// FREEBIE
* Add global setting for read receipts
Don't send read receipt messages unless the setting is enabled.
Don't process read receipts if the setting is disabled.
// FREEBIE
* Sync read receipt setting from mobile
Toggling this setting on your mobile device should sync it to Desktop. When
linking, use the setting in the provisioning message.
// FREEBIE
* Send receipt messages silently
Avoid generating phantom messages on ios
// FREEBIE
* Save recipients on the outgoing message models
For accurate tracking and display of sent/delivered/read state, even if group
membership changes later.
// FREEBIE
* Fix conversation type in profile key update handling
// FREEBIE
* Set recipients on synced sent messages
* Render saved recipients in message detail if available
For older messages, where we did not save the intended set of recipients at the
time of sending, fall back to the current group membership.
// FREEBIE
* Record who has been successfully sent to
// FREEBIE
* Record who a message has been delivered to
* Invert the not-clickable class
* Fix readReceipt setting sync when linking
* Render per recipient sent/delivered/read status
In the message detail view for outgoing messages, render each recipient's
individual sent/delivered/read status with respect to this message, as long as
there are no errors associated with the recipient (ie, safety number changes,
user not registered, etc...) since the error icon is displayed in that case.
*Messages sent before this change may not have per-recipient status lists
and will simply show no status icon.
// FREEBIE
* Add configuration sync request
Send these requests in a one-off fashion when:
  1. We have just setup from a chrome app import
  2. We have just upgraded to read-receipt support
// FREEBIE
* Expose sendRequestConfigurationSyncMessage
// FREEBIE
* Fix handling of incoming delivery receipts - union with array
FREEBIE
											
										 
											8 years ago
										 |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message DataExtractionNotification {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum Type {
 | 
					
						
							|  |  |  |     SCREENSHOT  = 1; // no way to know this on Desktop
 | 
					
						
							|  |  |  |     MEDIA_SAVED = 2; // timestamp
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required Type   type      = 1;
 | 
					
						
							|  |  |  |   optional uint64 timestamp = 2;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // message GroupInviteMessage {
 | 
					
						
							|  |  |  | //   required string         name              = 1;
 | 
					
						
							|  |  |  | //   required bytes          memberPrivateKey  = 2;
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // this will replace our closedGroupControlMessage but we will need to keep both for some time
 | 
					
						
							|  |  |  | // message GroupMessage {
 | 
					
						
							|  |  |  |   // optional GroupAdminMessage           adminMessage         = 31;
 | 
					
						
							|  |  |  |   // optional GroupMemberLeftMessage      memberLeftMessage    = 32;
 | 
					
						
							|  |  |  |   // optional GroupInviteMessage          inviteMessage        = 33;
 | 
					
						
							|  |  |  |   // optional GroupPromoteMessage         promoteMessage       = 34;
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // message GroupPromoteMessage {
 | 
					
						
							|  |  |  |   // required bytes          privateKey        = 1; // this is the group admins key
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // message GroupAdminMessage {
 | 
					
						
							|  |  |  |   // enum Type {
 | 
					
						
							|  |  |  |   //   DELETE_GROUP                   = 1; // members, groupSignature
 | 
					
						
							|  |  |  |   //   DELETE_GROUP_ALL_MEMBERS       = 2;  // groupSignature
 | 
					
						
							|  |  |  |   //   DELETE_MESSAGES_ALL_MEMBERS    = 3;  // groupSignature
 | 
					
						
							|  |  |  |   //   DELETE_ATTACHMENTS_ALL_MEMBERS = 4;  // groupSignature
 | 
					
						
							|  |  |  |   // }
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  |   // // @required
 | 
					
						
							|  |  |  |  //  required Type           type              = 1;
 | 
					
						
							|  |  |  |   // repeated bytes          members           = 2;
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |  //  required bytes          groupSignature    = 3; // used by every members to make sure incoming admin action can be trusted
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // message GroupMemberLeftMessage {
 | 
					
						
							|  |  |  |  // the pubkey of the member who left is already in the senderIdentity
 | 
					
						
							|  |  |  | // }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message DataMessage {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum Flags {
 | 
					
						
							|  |  |  |     EXPIRATION_TIMER_UPDATE   = 2;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   message Reaction {
 | 
					
						
							|  |  |  |     enum Action {
 | 
					
						
							|  |  |  |         REACT = 0;
 | 
					
						
							|  |  |  |         REMOVE = 1;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required uint64 id        = 1; // Message timestamp
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required string author    = 2;
 | 
					
						
							|  |  |  |     optional string emoji     = 3;
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required Action action    = 4;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   message Quote {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     message QuotedAttachment {
 | 
					
						
							|  |  |  |       optional string            contentType = 1;
 | 
					
						
							|  |  |  |       optional string            fileName    = 2;
 | 
					
						
							|  |  |  |       optional AttachmentPointer thumbnail   = 3;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required uint64           id          = 1;
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required string           author      = 2;
 | 
					
						
							|  |  |  |     optional string           text        = 3;
 | 
					
						
							|  |  |  |     repeated QuotedAttachment attachments = 4;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   message Preview {
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required string            url   = 1;
 | 
					
						
							|  |  |  |     optional string            title = 2;
 | 
					
						
							|  |  |  |     optional AttachmentPointer image = 3;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   message LokiProfile {
 | 
					
						
							|  |  |  |     optional string displayName = 1;
 | 
					
						
							|  |  |  |     optional string profilePicture = 2;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   message OpenGroupInvitation {
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required string url = 1;
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required string name = 3;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   message ClosedGroupControlMessage {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  enum Type {
 | 
					
						
							|  |  |  | 	    NEW                           = 1;
 | 
					
						
							|  |  |  |       ENCRYPTION_KEY_PAIR           = 3;
 | 
					
						
							|  |  |  |       NAME_CHANGE                   = 4;
 | 
					
						
							|  |  |  |       MEMBERS_ADDED                 = 5;
 | 
					
						
							|  |  |  |       MEMBERS_REMOVED               = 6;
 | 
					
						
							|  |  |  |       MEMBER_LEFT                   = 7;
 | 
					
						
							|  |  |  |       ENCRYPTION_KEY_PAIR_REQUEST   = 8;
 | 
					
						
							|  |  |  |     }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  message KeyPairWrapper {
 | 
					
						
							|  |  |  | 	    // @required
 | 
					
						
							|  |  |  | 	    required bytes publicKey        = 1; // The public key of the user the key pair is meant for
 | 
					
						
							|  |  |  | 	    // @required
 | 
					
						
							|  |  |  | 	    required bytes encryptedKeyPair = 2; // The encrypted key pair
 | 
					
						
							|  |  |  | 	  }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	  // @required
 | 
					
						
							|  |  |  | 	  required Type           type              = 1;
 | 
					
						
							|  |  |  | 	  optional bytes          publicKey         = 2;
 | 
					
						
							|  |  |  | 	  optional string         name              = 3;
 | 
					
						
							|  |  |  | 	  optional KeyPair        encryptionKeyPair = 4;
 | 
					
						
							|  |  |  | 	  repeated bytes          members           = 5;
 | 
					
						
							|  |  |  | 	  repeated bytes          admins            = 6;
 | 
					
						
							|  |  |  | 	  repeated KeyPairWrapper wrappers          = 7;
 | 
					
						
							|  |  |  |     optional uint32         expirationTimer   = 8;
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   optional string                    body                      = 1;
 | 
					
						
							|  |  |  |   repeated AttachmentPointer         attachments               = 2;
 | 
					
						
							|  |  |  |   optional GroupContext              group                     = 3;
 | 
					
						
							|  |  |  |   optional uint32                    flags                     = 4;
 | 
					
						
							|  |  |  |   // TODO legacy messages support will be removed in a future release
 | 
					
						
							|  |  |  |   optional uint32                    expireTimer               = 5;
 | 
					
						
							|  |  |  |   optional bytes                     profileKey                = 6;
 | 
					
						
							|  |  |  |   optional uint64                    timestamp                 = 7;
 | 
					
						
							|  |  |  |   optional Quote                     quote                     = 8;
 | 
					
						
							|  |  |  |   repeated Preview                   preview                   = 10;
 | 
					
						
							|  |  |  |   optional Reaction                  reaction                  = 11;
 | 
					
						
							|  |  |  |   optional LokiProfile               profile                   = 101;
 | 
					
						
							|  |  |  |   optional OpenGroupInvitation       openGroupInvitation       = 102;
 | 
					
						
							|  |  |  |   optional ClosedGroupControlMessage closedGroupControlMessage = 104;
 | 
					
						
							|  |  |  |   optional string                    syncTarget                = 105;
 | 
					
						
							|  |  |  |   optional bool                      blocksCommunityMessageRequests  = 106;
 | 
					
						
							|  |  |  |   // optional GroupMessage              groupMessage              = 120;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message CallMessage {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum Type {
 | 
					
						
							|  |  |  |     PRE_OFFER          = 6;
 | 
					
						
							|  |  |  |     OFFER              = 1;
 | 
					
						
							|  |  |  |     ANSWER             = 2;
 | 
					
						
							|  |  |  |     PROVISIONAL_ANSWER = 3;
 | 
					
						
							|  |  |  |     ICE_CANDIDATES     = 4;
 | 
					
						
							|  |  |  |     END_CALL           = 5;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required Type type              = 1;
 | 
					
						
							|  |  |  |   repeated string sdps            = 2;
 | 
					
						
							|  |  |  |   repeated uint32 sdpMLineIndexes = 3;
 | 
					
						
							|  |  |  |   repeated string sdpMids         = 4;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required string uuid            = 5;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message ConfigurationMessage {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   message ClosedGroup {
 | 
					
						
							|  |  |  |     optional bytes   publicKey         = 1;
 | 
					
						
							|  |  |  |     optional string  name              = 2;
 | 
					
						
							|  |  |  |     optional KeyPair encryptionKeyPair = 3;
 | 
					
						
							|  |  |  |     repeated bytes   members           = 4;
 | 
					
						
							|  |  |  |     repeated bytes   admins            = 5;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   message Contact {
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required bytes  publicKey         = 1;
 | 
					
						
							|  |  |  |     // @required
 | 
					
						
							|  |  |  |     required string name              = 2;
 | 
					
						
							|  |  |  |     optional string profilePicture    = 3;
 | 
					
						
							|  |  |  |     optional bytes  profileKey        = 4;
 | 
					
						
							|  |  |  |     optional bool   isApproved        = 5;
 | 
					
						
							|  |  |  |     optional bool   isBlocked         = 6;
 | 
					
						
							|  |  |  |     optional bool   didApproveMe      = 7;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   repeated ClosedGroup closedGroups    = 1;
 | 
					
						
							|  |  |  |   repeated string      openGroups      = 2;
 | 
					
						
							|  |  |  |   optional string      displayName     = 3;
 | 
					
						
							|  |  |  |   optional string      profilePicture  = 4;
 | 
					
						
							|  |  |  |   optional bytes       profileKey      = 5;
 | 
					
						
							|  |  |  |   repeated Contact     contacts        = 6;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message ReceiptMessage {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum Type {
 | 
					
						
							|  |  |  |     READ     = 1;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required Type   type      = 1;
 | 
					
						
							|  |  |  |   repeated uint64 timestamp = 2;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message AttachmentPointer {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum Flags {
 | 
					
						
							|  |  |  |     VOICE_MESSAGE = 1;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   required fixed64 id          = 1;
 | 
					
						
							|  |  |  |   optional string  contentType = 2;
 | 
					
						
							|  |  |  |   optional bytes   key         = 3;
 | 
					
						
							|  |  |  |   optional uint32  size        = 4;
 | 
					
						
							|  |  |  |   optional bytes   digest      = 6;
 | 
					
						
							|  |  |  |   optional string  fileName    = 7;
 | 
					
						
							|  |  |  |   optional uint32  flags       = 8;
 | 
					
						
							|  |  |  |   optional uint32  width       = 9;
 | 
					
						
							|  |  |  |   optional uint32  height      = 10;
 | 
					
						
							|  |  |  |   optional string  caption     = 11;
 | 
					
						
							|  |  |  |   optional string  url         = 101;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message GroupContext {
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum Type {
 | 
					
						
							|  |  |  |     UNKNOWN      = 0;
 | 
					
						
							|  |  |  |     UPDATE       = 1;
 | 
					
						
							|  |  |  |     DELIVER      = 2;
 | 
					
						
							|  |  |  |     QUIT         = 3;
 | 
					
						
							|  |  |  |     REQUEST_INFO = 4;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   optional bytes             id      = 1;
 | 
					
						
							|  |  |  |   // @required
 | 
					
						
							|  |  |  |   optional Type              type    = 2;
 | 
					
						
							|  |  |  |   optional string            name    = 3;
 | 
					
						
							|  |  |  |   repeated string            members = 4;
 | 
					
						
							|  |  |  |   optional AttachmentPointer avatar  = 5;
 | 
					
						
							|  |  |  |   repeated string            admins  = 6;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message WebSocketRequestMessage {
 | 
					
						
							|  |  |  |   optional string verb    = 1;
 | 
					
						
							|  |  |  |   optional string path    = 2;
 | 
					
						
							|  |  |  |   optional bytes  body    = 3;
 | 
					
						
							|  |  |  |   repeated string headers = 5;
 | 
					
						
							|  |  |  |   optional uint64 id      = 4;
 | 
					
						
							|  |  |  | }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | message WebSocketMessage {
 | 
					
						
							|  |  |  |   enum Type {
 | 
					
						
							|  |  |  |       UNKNOWN  = 0;
 | 
					
						
							|  |  |  |       REQUEST  = 1;
 | 
					
						
							|  |  |  |       RESPONSE = 2;
 | 
					
						
							|  |  |  |   }
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   optional Type                     type     = 1;
 | 
					
						
							|  |  |  |   optional WebSocketRequestMessage  request  = 2;
 | 
					
						
							|  |  |  | }
 |