
- Complete NestJS TypeScript implementation with WebSocket support - Direct messaging (DM) and group chat functionality - End-to-end encryption with AES encryption and key pairs - Media file support (images, videos, audio, documents) up to 100MB - Push notifications with Firebase Cloud Messaging integration - Mention alerts and real-time typing indicators - User authentication with JWT and Passport - SQLite database with TypeORM entities and relationships - Comprehensive API documentation with Swagger/OpenAPI - File upload handling with secure access control - Online/offline status tracking and presence management - Message editing, deletion, and reply functionality - Notification management with automatic cleanup - Health check endpoint for monitoring - CORS configuration for cross-origin requests - Environment-based configuration management - Structured for Flutter SDK integration Features implemented: ✅ Real-time messaging with Socket.IO ✅ User registration and authentication ✅ Direct messages and group chats ✅ Media file uploads and management ✅ End-to-end encryption ✅ Push notifications ✅ Mention alerts ✅ Typing indicators ✅ Message read receipts ✅ Online status tracking ✅ File access control ✅ Comprehensive API documentation Ready for Flutter SDK development and production deployment.
534 lines
14 KiB
Protocol Buffer
534 lines
14 KiB
Protocol Buffer
syntax = "proto2";
|
|
|
|
package google.protobuf;
|
|
|
|
option go_package = "google.golang.org/protobuf/types/descriptorpb";
|
|
option java_package = "com.google.protobuf";
|
|
option java_outer_classname = "DescriptorProtos";
|
|
option csharp_namespace = "Google.Protobuf.Reflection";
|
|
option objc_class_prefix = "GPB";
|
|
option cc_enable_arenas = true;
|
|
option optimize_for = "SPEED";
|
|
|
|
message FileDescriptorSet {
|
|
|
|
repeated FileDescriptorProto file = 1;
|
|
|
|
extensions 536000000;
|
|
}
|
|
|
|
enum Edition {
|
|
|
|
EDITION_UNKNOWN = 0;
|
|
EDITION_LEGACY = 900;
|
|
EDITION_PROTO2 = 998;
|
|
EDITION_PROTO3 = 999;
|
|
EDITION_2023 = 1000;
|
|
EDITION_2024 = 1001;
|
|
EDITION_1_TEST_ONLY = 1;
|
|
EDITION_2_TEST_ONLY = 2;
|
|
EDITION_99997_TEST_ONLY = 99997;
|
|
EDITION_99998_TEST_ONLY = 99998;
|
|
EDITION_99999_TEST_ONLY = 99999;
|
|
EDITION_MAX = 2147483647;
|
|
}
|
|
|
|
message FileDescriptorProto {
|
|
|
|
optional string name = 1;
|
|
optional string package = 2;
|
|
repeated string dependency = 3;
|
|
repeated int32 public_dependency = 10;
|
|
repeated int32 weak_dependency = 11;
|
|
repeated string option_dependency = 15;
|
|
repeated DescriptorProto message_type = 4;
|
|
repeated EnumDescriptorProto enum_type = 5;
|
|
repeated ServiceDescriptorProto service = 6;
|
|
repeated FieldDescriptorProto extension = 7;
|
|
optional FileOptions options = 8;
|
|
optional SourceCodeInfo source_code_info = 9;
|
|
optional string syntax = 12;
|
|
optional Edition edition = 14;
|
|
}
|
|
|
|
message DescriptorProto {
|
|
|
|
optional string name = 1;
|
|
repeated FieldDescriptorProto field = 2;
|
|
repeated FieldDescriptorProto extension = 6;
|
|
repeated DescriptorProto nested_type = 3;
|
|
repeated EnumDescriptorProto enum_type = 4;
|
|
repeated ExtensionRange extension_range = 5;
|
|
repeated OneofDescriptorProto oneof_decl = 8;
|
|
optional MessageOptions options = 7;
|
|
repeated ReservedRange reserved_range = 9;
|
|
repeated string reserved_name = 10;
|
|
optional SymbolVisibility visibility = 11;
|
|
|
|
message ExtensionRange {
|
|
|
|
optional int32 start = 1;
|
|
optional int32 end = 2;
|
|
optional ExtensionRangeOptions options = 3;
|
|
}
|
|
|
|
message ReservedRange {
|
|
|
|
optional int32 start = 1;
|
|
optional int32 end = 2;
|
|
}
|
|
}
|
|
|
|
message ExtensionRangeOptions {
|
|
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
repeated Declaration declaration = 2 [retention="RETENTION_SOURCE"];
|
|
optional FeatureSet features = 50;
|
|
optional VerificationState verification = 3 [default=UNVERIFIED, retention="RETENTION_SOURCE"];
|
|
|
|
message Declaration {
|
|
|
|
optional int32 number = 1;
|
|
optional string full_name = 2;
|
|
optional string type = 3;
|
|
optional bool reserved = 5;
|
|
optional bool repeated = 6;
|
|
|
|
reserved 4;
|
|
}
|
|
|
|
enum VerificationState {
|
|
|
|
DECLARATION = 0;
|
|
UNVERIFIED = 1;
|
|
}
|
|
|
|
extensions 1000 to max;
|
|
}
|
|
|
|
message FieldDescriptorProto {
|
|
|
|
optional string name = 1;
|
|
optional int32 number = 3;
|
|
optional Label label = 4;
|
|
optional Type type = 5;
|
|
optional string type_name = 6;
|
|
optional string extendee = 2;
|
|
optional string default_value = 7;
|
|
optional int32 oneof_index = 9;
|
|
optional string json_name = 10;
|
|
optional FieldOptions options = 8;
|
|
optional bool proto3_optional = 17;
|
|
|
|
enum Type {
|
|
|
|
TYPE_DOUBLE = 1;
|
|
TYPE_FLOAT = 2;
|
|
TYPE_INT64 = 3;
|
|
TYPE_UINT64 = 4;
|
|
TYPE_INT32 = 5;
|
|
TYPE_FIXED64 = 6;
|
|
TYPE_FIXED32 = 7;
|
|
TYPE_BOOL = 8;
|
|
TYPE_STRING = 9;
|
|
TYPE_GROUP = 10;
|
|
TYPE_MESSAGE = 11;
|
|
TYPE_BYTES = 12;
|
|
TYPE_UINT32 = 13;
|
|
TYPE_ENUM = 14;
|
|
TYPE_SFIXED32 = 15;
|
|
TYPE_SFIXED64 = 16;
|
|
TYPE_SINT32 = 17;
|
|
TYPE_SINT64 = 18;
|
|
}
|
|
|
|
enum Label {
|
|
|
|
LABEL_OPTIONAL = 1;
|
|
LABEL_REPEATED = 3;
|
|
LABEL_REQUIRED = 2;
|
|
}
|
|
}
|
|
|
|
message OneofDescriptorProto {
|
|
|
|
optional string name = 1;
|
|
optional OneofOptions options = 2;
|
|
}
|
|
|
|
message EnumDescriptorProto {
|
|
|
|
optional string name = 1;
|
|
repeated EnumValueDescriptorProto value = 2;
|
|
optional EnumOptions options = 3;
|
|
repeated EnumReservedRange reserved_range = 4;
|
|
repeated string reserved_name = 5;
|
|
optional SymbolVisibility visibility = 6;
|
|
|
|
message EnumReservedRange {
|
|
|
|
optional int32 start = 1;
|
|
optional int32 end = 2;
|
|
}
|
|
}
|
|
|
|
message EnumValueDescriptorProto {
|
|
|
|
optional string name = 1;
|
|
optional int32 number = 2;
|
|
optional EnumValueOptions options = 3;
|
|
}
|
|
|
|
message ServiceDescriptorProto {
|
|
|
|
optional string name = 1;
|
|
repeated MethodDescriptorProto method = 2;
|
|
optional ServiceOptions options = 3;
|
|
}
|
|
|
|
message MethodDescriptorProto {
|
|
|
|
optional string name = 1;
|
|
optional string input_type = 2;
|
|
optional string output_type = 3;
|
|
optional MethodOptions options = 4;
|
|
optional bool client_streaming = 5;
|
|
optional bool server_streaming = 6;
|
|
}
|
|
|
|
message FileOptions {
|
|
|
|
optional string java_package = 1;
|
|
optional string java_outer_classname = 8;
|
|
optional bool java_multiple_files = 10;
|
|
optional bool java_generate_equals_and_hash = 20 [deprecated=true];
|
|
optional bool java_string_check_utf8 = 27;
|
|
optional OptimizeMode optimize_for = 9 [default=SPEED];
|
|
optional string go_package = 11;
|
|
optional bool cc_generic_services = 16;
|
|
optional bool java_generic_services = 17;
|
|
optional bool py_generic_services = 18;
|
|
optional bool deprecated = 23;
|
|
optional bool cc_enable_arenas = 31 [default=true];
|
|
optional string objc_class_prefix = 36;
|
|
optional string csharp_namespace = 37;
|
|
optional string swift_prefix = 39;
|
|
optional string php_class_prefix = 40;
|
|
optional string php_namespace = 41;
|
|
optional string php_metadata_namespace = 44;
|
|
optional string ruby_package = 45;
|
|
optional FeatureSet features = 50;
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
|
|
enum OptimizeMode {
|
|
|
|
SPEED = 1;
|
|
CODE_SIZE = 2;
|
|
LITE_RUNTIME = 3;
|
|
}
|
|
|
|
extensions 1000 to max;
|
|
|
|
reserved 42, "php_generic_services", 38;
|
|
}
|
|
|
|
message MessageOptions {
|
|
|
|
optional bool message_set_wire_format = 1;
|
|
optional bool no_standard_descriptor_accessor = 2;
|
|
optional bool deprecated = 3;
|
|
optional bool map_entry = 7;
|
|
optional bool deprecated_legacy_json_field_conflicts = 11 [deprecated=true];
|
|
optional FeatureSet features = 12;
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
|
|
extensions 1000 to max;
|
|
|
|
reserved 4, 5, 6, 8, 9;
|
|
}
|
|
|
|
message FieldOptions {
|
|
|
|
optional CType ctype = 1 [default=STRING];
|
|
optional bool packed = 2;
|
|
optional JSType jstype = 6 [default=JS_NORMAL];
|
|
optional bool lazy = 5;
|
|
optional bool unverified_lazy = 15;
|
|
optional bool deprecated = 3;
|
|
optional bool weak = 10 [deprecated=true];
|
|
optional bool debug_redact = 16;
|
|
optional OptionRetention retention = 17;
|
|
repeated OptionTargetType targets = 19;
|
|
repeated EditionDefault edition_defaults = 20;
|
|
optional FeatureSet features = 21;
|
|
optional FeatureSupport feature_support = 22;
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
|
|
enum CType {
|
|
|
|
STRING = 0;
|
|
CORD = 1;
|
|
STRING_PIECE = 2;
|
|
}
|
|
|
|
enum JSType {
|
|
|
|
JS_NORMAL = 0;
|
|
JS_STRING = 1;
|
|
JS_NUMBER = 2;
|
|
}
|
|
|
|
enum OptionRetention {
|
|
|
|
RETENTION_UNKNOWN = 0;
|
|
RETENTION_RUNTIME = 1;
|
|
RETENTION_SOURCE = 2;
|
|
}
|
|
|
|
enum OptionTargetType {
|
|
|
|
TARGET_TYPE_UNKNOWN = 0;
|
|
TARGET_TYPE_FILE = 1;
|
|
TARGET_TYPE_EXTENSION_RANGE = 2;
|
|
TARGET_TYPE_MESSAGE = 3;
|
|
TARGET_TYPE_FIELD = 4;
|
|
TARGET_TYPE_ONEOF = 5;
|
|
TARGET_TYPE_ENUM = 6;
|
|
TARGET_TYPE_ENUM_ENTRY = 7;
|
|
TARGET_TYPE_SERVICE = 8;
|
|
TARGET_TYPE_METHOD = 9;
|
|
}
|
|
|
|
message EditionDefault {
|
|
|
|
optional Edition edition = 3;
|
|
optional string value = 2;
|
|
}
|
|
|
|
message FeatureSupport {
|
|
|
|
optional Edition edition_introduced = 1;
|
|
optional Edition edition_deprecated = 2;
|
|
optional string deprecation_warning = 3;
|
|
optional Edition edition_removed = 4;
|
|
}
|
|
|
|
extensions 1000 to max;
|
|
|
|
reserved 4, 18;
|
|
}
|
|
|
|
message OneofOptions {
|
|
|
|
optional FeatureSet features = 1;
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
|
|
extensions 1000 to max;
|
|
}
|
|
|
|
message EnumOptions {
|
|
|
|
optional bool allow_alias = 2;
|
|
optional bool deprecated = 3;
|
|
optional bool deprecated_legacy_json_field_conflicts = 6 [deprecated=true];
|
|
optional FeatureSet features = 7;
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
|
|
extensions 1000 to max;
|
|
|
|
reserved 5;
|
|
}
|
|
|
|
message EnumValueOptions {
|
|
|
|
optional bool deprecated = 1;
|
|
optional FeatureSet features = 2;
|
|
optional bool debug_redact = 3;
|
|
optional FieldOptions.FeatureSupport feature_support = 4;
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
|
|
extensions 1000 to max;
|
|
}
|
|
|
|
message ServiceOptions {
|
|
|
|
optional FeatureSet features = 34;
|
|
optional bool deprecated = 33;
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
|
|
extensions 1000 to max;
|
|
}
|
|
|
|
message MethodOptions {
|
|
|
|
optional bool deprecated = 33;
|
|
optional IdempotencyLevel idempotency_level = 34 [default=IDEMPOTENCY_UNKNOWN];
|
|
optional FeatureSet features = 35;
|
|
repeated UninterpretedOption uninterpreted_option = 999;
|
|
|
|
enum IdempotencyLevel {
|
|
|
|
IDEMPOTENCY_UNKNOWN = 0;
|
|
NO_SIDE_EFFECTS = 1;
|
|
IDEMPOTENT = 2;
|
|
}
|
|
|
|
extensions 1000 to max;
|
|
}
|
|
|
|
message UninterpretedOption {
|
|
|
|
repeated NamePart name = 2;
|
|
optional string identifier_value = 3;
|
|
optional uint64 positive_int_value = 4;
|
|
optional int64 negative_int_value = 5;
|
|
optional double double_value = 6;
|
|
optional bytes string_value = 7;
|
|
optional string aggregate_value = 8;
|
|
|
|
message NamePart {
|
|
|
|
required string name_part = 1;
|
|
required bool is_extension = 2;
|
|
}
|
|
}
|
|
|
|
message FeatureSet {
|
|
|
|
optional FieldPresence field_presence = 1 [retention="RETENTION_RUNTIME", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2023", edition_defaults.edition="EDITION_2023", edition_defaults.value="EXPLICIT"];
|
|
optional EnumType enum_type = 2 [retention="RETENTION_RUNTIME", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2023", edition_defaults.edition="EDITION_PROTO3", edition_defaults.value="OPEN"];
|
|
optional RepeatedFieldEncoding repeated_field_encoding = 3 [retention="RETENTION_RUNTIME", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2023", edition_defaults.edition="EDITION_PROTO3", edition_defaults.value="PACKED"];
|
|
optional Utf8Validation utf8_validation = 4 [retention="RETENTION_RUNTIME", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2023", edition_defaults.edition="EDITION_PROTO3", edition_defaults.value="VERIFY"];
|
|
optional MessageEncoding message_encoding = 5 [retention="RETENTION_RUNTIME", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2023", edition_defaults.edition="EDITION_LEGACY", edition_defaults.value="LENGTH_PREFIXED"];
|
|
optional JsonFormat json_format = 6 [retention="RETENTION_RUNTIME", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2023", edition_defaults.edition="EDITION_PROTO3", edition_defaults.value="ALLOW"];
|
|
optional EnforceNamingStyle enforce_naming_style = 7 [retention="RETENTION_SOURCE", targets="TARGET_TYPE_METHOD", feature_support.edition_introduced="EDITION_2024", edition_defaults.edition="EDITION_2024", edition_defaults.value="STYLE2024"];
|
|
optional VisibilityFeature.DefaultSymbolVisibility default_symbol_visibility = 8 [retention="RETENTION_SOURCE", targets="TARGET_TYPE_FILE", feature_support.edition_introduced="EDITION_2024", edition_defaults.edition="EDITION_2024", edition_defaults.value="EXPORT_TOP_LEVEL"];
|
|
|
|
enum FieldPresence {
|
|
|
|
FIELD_PRESENCE_UNKNOWN = 0;
|
|
EXPLICIT = 1;
|
|
IMPLICIT = 2;
|
|
LEGACY_REQUIRED = 3;
|
|
}
|
|
|
|
enum EnumType {
|
|
|
|
ENUM_TYPE_UNKNOWN = 0;
|
|
OPEN = 1;
|
|
CLOSED = 2;
|
|
}
|
|
|
|
enum RepeatedFieldEncoding {
|
|
|
|
REPEATED_FIELD_ENCODING_UNKNOWN = 0;
|
|
PACKED = 1;
|
|
EXPANDED = 2;
|
|
}
|
|
|
|
enum Utf8Validation {
|
|
|
|
UTF8_VALIDATION_UNKNOWN = 0;
|
|
VERIFY = 2;
|
|
NONE = 3;
|
|
}
|
|
|
|
enum MessageEncoding {
|
|
|
|
MESSAGE_ENCODING_UNKNOWN = 0;
|
|
LENGTH_PREFIXED = 1;
|
|
DELIMITED = 2;
|
|
}
|
|
|
|
enum JsonFormat {
|
|
|
|
JSON_FORMAT_UNKNOWN = 0;
|
|
ALLOW = 1;
|
|
LEGACY_BEST_EFFORT = 2;
|
|
}
|
|
|
|
enum EnforceNamingStyle {
|
|
|
|
ENFORCE_NAMING_STYLE_UNKNOWN = 0;
|
|
STYLE2024 = 1;
|
|
STYLE_LEGACY = 2;
|
|
}
|
|
|
|
message VisibilityFeature {
|
|
|
|
enum DefaultSymbolVisibility {
|
|
|
|
DEFAULT_SYMBOL_VISIBILITY_UNKNOWN = 0;
|
|
EXPORT_ALL = 1;
|
|
EXPORT_TOP_LEVEL = 2;
|
|
LOCAL_ALL = 3;
|
|
STRICT = 4;
|
|
}
|
|
|
|
reserved 1 to max;
|
|
}
|
|
|
|
extensions 1000 to 9994, 9995 to 9999, 10000;
|
|
|
|
reserved 999;
|
|
}
|
|
|
|
message FeatureSetDefaults {
|
|
|
|
repeated FeatureSetEditionDefault defaults = 1;
|
|
optional Edition minimum_edition = 4;
|
|
optional Edition maximum_edition = 5;
|
|
|
|
message FeatureSetEditionDefault {
|
|
|
|
optional Edition edition = 3;
|
|
optional FeatureSet overridable_features = 4;
|
|
optional FeatureSet fixed_features = 5;
|
|
|
|
reserved 1, 2, "features";
|
|
}
|
|
}
|
|
|
|
message SourceCodeInfo {
|
|
|
|
repeated Location location = 1;
|
|
|
|
message Location {
|
|
|
|
repeated int32 path = 1 [packed=true];
|
|
repeated int32 span = 2 [packed=true];
|
|
optional string leading_comments = 3;
|
|
optional string trailing_comments = 4;
|
|
repeated string leading_detached_comments = 6;
|
|
}
|
|
|
|
extensions 536000000;
|
|
}
|
|
|
|
message GeneratedCodeInfo {
|
|
|
|
repeated Annotation annotation = 1;
|
|
|
|
message Annotation {
|
|
|
|
repeated int32 path = 1 [packed=true];
|
|
optional string source_file = 2;
|
|
optional int32 begin = 3;
|
|
optional int32 end = 4;
|
|
optional Semantic semantic = 5;
|
|
|
|
enum Semantic {
|
|
|
|
NONE = 0;
|
|
SET = 1;
|
|
ALIAS = 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
enum SymbolVisibility {
|
|
|
|
VISIBILITY_UNSET = 0;
|
|
VISIBILITY_LOCAL = 1;
|
|
VISIBILITY_EXPORT = 2;
|
|
} |