mirror of
https://github.com/octoleo/syncthing.git
synced 2024-12-23 03:18:59 +00:00
fa0101bd60
This changes the BEP protocol to use protocol buffer serialization instead of XDR, and therefore also the database format. The local discovery protocol is also updated to be protocol buffer format. GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/3276 LGTM: AudriusButkevicius
190 lines
5.7 KiB
Protocol Buffer
190 lines
5.7 KiB
Protocol Buffer
// protoc --proto_path=../../../../../:../../../../gogo/protobuf/protobuf:. --gogofast_out=. message.proto
|
|
|
|
syntax = "proto3";
|
|
|
|
package protocol;
|
|
|
|
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
|
|
|
|
option (gogoproto.goproto_getters_all) = false;
|
|
option (gogoproto.sizer_all) = false;
|
|
option (gogoproto.protosizer_all) = true;
|
|
option (gogoproto.goproto_enum_stringer_all) = true;
|
|
option (gogoproto.goproto_enum_prefix_all) = false;
|
|
|
|
// --- Pre-auth ---
|
|
|
|
message Hello {
|
|
string device_name = 1;
|
|
string client_name = 2;
|
|
string client_version = 3;
|
|
}
|
|
|
|
// --- Header ---
|
|
|
|
message Header {
|
|
MessageType type = 1;
|
|
MessageCompression compression = 2;
|
|
}
|
|
|
|
enum MessageType {
|
|
CLUSTER_CONFIG = 0 [(gogoproto.enumvalue_customname) = "messageTypeClusterConfig"];
|
|
INDEX = 1 [(gogoproto.enumvalue_customname) = "messageTypeIndex"];
|
|
INDEX_UPDATE = 2 [(gogoproto.enumvalue_customname) = "messageTypeIndexUpdate"];
|
|
REQUEST = 3 [(gogoproto.enumvalue_customname) = "messageTypeRequest"];
|
|
RESPONSE = 4 [(gogoproto.enumvalue_customname) = "messageTypeResponse"];
|
|
DOWNLOAD_PROGRESS = 5 [(gogoproto.enumvalue_customname) = "messageTypeDownloadProgress"];
|
|
PING = 6 [(gogoproto.enumvalue_customname) = "messageTypePing"];
|
|
CLOSE = 7 [(gogoproto.enumvalue_customname) = "messageTypeClose"];
|
|
}
|
|
|
|
enum MessageCompression {
|
|
NONE = 0 [(gogoproto.enumvalue_customname) = "MessageCompressionNone"];
|
|
LZ4 = 1 [(gogoproto.enumvalue_customname) = "MessageCompressionLZ4"];
|
|
}
|
|
|
|
// --- Actual messages ---
|
|
|
|
// Cluster Config
|
|
|
|
message ClusterConfig {
|
|
repeated Folder folders = 1 [(gogoproto.nullable) = false];
|
|
}
|
|
|
|
message Folder {
|
|
string id = 1 [(gogoproto.customname) = "ID"];
|
|
string label = 2;
|
|
bool read_only = 3;
|
|
bool ignore_permissions = 4;
|
|
bool ignore_delete = 5;
|
|
bool disable_temp_indexes = 6;
|
|
|
|
repeated Device devices = 16 [(gogoproto.nullable) = false];
|
|
}
|
|
|
|
message Device {
|
|
bytes id = 1 [(gogoproto.customname) = "ID"];
|
|
string name = 2;
|
|
repeated string addresses = 3;
|
|
Compression compression = 4;
|
|
string cert_name = 5;
|
|
int64 max_local_version = 6;
|
|
bool introducer = 7;
|
|
}
|
|
|
|
enum Compression {
|
|
METADATA = 0 [(gogoproto.enumvalue_customname) = "CompressMetadata"];
|
|
NEVER = 1 [(gogoproto.enumvalue_customname) = "CompressNever"];
|
|
ALWAYS = 2 [(gogoproto.enumvalue_customname) = "CompressAlways"];
|
|
}
|
|
|
|
// Index and Index Update
|
|
|
|
message Index {
|
|
string folder = 1;
|
|
repeated FileInfo files = 2 [(gogoproto.nullable) = false];
|
|
}
|
|
|
|
message IndexUpdate {
|
|
string folder = 1;
|
|
repeated FileInfo files = 2 [(gogoproto.nullable) = false];
|
|
}
|
|
|
|
message FileInfo {
|
|
option (gogoproto.goproto_stringer) = false;
|
|
string name = 1;
|
|
FileInfoType type = 2;
|
|
int64 size = 3;
|
|
uint32 permissions = 4;
|
|
int64 modified = 5;
|
|
bool deleted = 6;
|
|
bool invalid = 7;
|
|
bool no_permissions = 8;
|
|
Vector version = 9 [(gogoproto.nullable) = false];
|
|
int64 local_version = 10;
|
|
|
|
repeated BlockInfo Blocks = 16 [(gogoproto.nullable) = false];
|
|
}
|
|
|
|
enum FileInfoType {
|
|
FILE = 0 [(gogoproto.enumvalue_customname) = "FileInfoTypeFile"];
|
|
DIRECTORY = 1 [(gogoproto.enumvalue_customname) = "FileInfoTypeDirectory"];
|
|
SYMLINK_FILE = 2 [(gogoproto.enumvalue_customname) = "FileInfoTypeSymlinkFile"];
|
|
SYMLINK_DIRECTORY = 3 [(gogoproto.enumvalue_customname) = "FileInfoTypeSymlinkDirectory"];
|
|
SYMLINK_UNKNOWN = 4 [(gogoproto.enumvalue_customname) = "FileInfoTypeSymlinkUnknown"];
|
|
}
|
|
|
|
message BlockInfo {
|
|
option (gogoproto.goproto_stringer) = false;
|
|
int64 offset = 1;
|
|
int32 size = 2;
|
|
bytes hash = 3;
|
|
}
|
|
|
|
message Vector {
|
|
repeated Counter counters = 1 [(gogoproto.nullable) = false];
|
|
}
|
|
|
|
message Counter {
|
|
uint64 id = 1 [(gogoproto.customname) = "ID", (gogoproto.customtype) = "ShortID", (gogoproto.nullable) = false];
|
|
uint64 value = 2;
|
|
}
|
|
|
|
// Request
|
|
|
|
message Request {
|
|
int32 id = 1 [(gogoproto.customname) = "ID"];
|
|
string folder = 2;
|
|
string name = 3;
|
|
int64 offset = 4;
|
|
int32 size = 5;
|
|
bytes hash = 6;
|
|
bool from_temporary = 7;
|
|
}
|
|
|
|
// Response
|
|
|
|
message Response {
|
|
int32 id = 1 [(gogoproto.customname) = "ID"];
|
|
bytes data = 2;
|
|
ErrorCode code = 3;
|
|
}
|
|
|
|
enum ErrorCode {
|
|
NO_ERROR = 0 [(gogoproto.enumvalue_customname) = "ErrorCodeNoError"];
|
|
GENERIC = 1 [(gogoproto.enumvalue_customname) = "ErrorCodeGeneric"];
|
|
NO_SUCH_FILE = 2 [(gogoproto.enumvalue_customname) = "ErrorCodeNoSuchFile"];
|
|
INVALID_FILE = 3 [(gogoproto.enumvalue_customname) = "ErrorCodeInvalidFile"];
|
|
}
|
|
|
|
// DownloadProgress
|
|
|
|
message DownloadProgress {
|
|
string folder = 1;
|
|
repeated FileDownloadProgressUpdate updates = 2 [(gogoproto.nullable) = false];
|
|
}
|
|
|
|
message FileDownloadProgressUpdate {
|
|
FileDownloadProgressUpdateType update_type = 1;
|
|
string name = 2;
|
|
Vector version = 3 [(gogoproto.nullable) = false];
|
|
repeated int32 block_indexes = 4;
|
|
}
|
|
|
|
enum FileDownloadProgressUpdateType {
|
|
APPEND = 0 [(gogoproto.enumvalue_customname) = "UpdateTypeAppend"];
|
|
FORGET = 1 [(gogoproto.enumvalue_customname) = "UpdateTypeForget"];
|
|
}
|
|
|
|
// Ping
|
|
|
|
message Ping {
|
|
}
|
|
|
|
// Close
|
|
|
|
message Close {
|
|
string reason = 1;
|
|
}
|
|
|