import "steammessages_unified_base.steamclient.proto";

option cc_generic_services = true;

enum ESteamPipeWorkType {
	k_ESteamPipeClientWorkType_Invalid = 0;
	k_ESteamPipeClientWorkType_StageFromChunkStores = 1;
}

enum ESteamPipeOperationType {
	k_ESteamPipeOperationType_Invalid = 0;
	k_ESteamPipeOperationType_DecryptCPU = 1;
	k_ESteamPipeOperationType_DiskRead = 2;
	k_ESteamPipeOperationType_DiskWrite = 3;
}

message CClientMetrics_AppInterfaceCreation {
	optional string raw_version = 1;
	optional string requested_interface_type = 2;
}

message CClientMetrics_AppInterfaceMethodCounts {
	optional string interface_name = 1;
	optional string method_name = 2;
	optional uint32 call_count = 3;
}

message CClientMetrics_AppInterfaceStats_Notification {
	optional uint64 game_id = 1;
	repeated .CClientMetrics_AppInterfaceCreation interfaces_created = 2;
	repeated .CClientMetrics_AppInterfaceMethodCounts methods_called = 3;
	optional uint32 session_length_seconds = 4;
}

message CClientMetrics_IPv6Connectivity_Result {
	optional uint32 protocol_tested = 1;
	optional uint32 connectivity_state = 2;
}

message CClientMetrics_IPv6Connectivity_Notification {
	optional uint32 cell_id = 1;
	repeated .CClientMetrics_IPv6Connectivity_Result results = 2;
	optional bool private_ip_is_rfc6598 = 3;
}

message CClientMetrics_SteamPipeWorkStats_Operation {
	optional .ESteamPipeOperationType type = 1 [default = k_ESteamPipeOperationType_Invalid];
	optional uint32 num_ops = 2;
	optional uint64 num_bytes = 3;
	optional uint64 busy_time_ms = 4;
	optional uint64 idle_time_ms = 5;
	optional uint64 sum_run_time_ms = 6;
	optional uint64 sum_wait_time_ms = 7;
}

message CClientMetrics_SteamPipeWorkStats_Notification {
	optional uint32 appid = 1;
	optional uint32 depotid = 2;
	optional .ESteamPipeWorkType work_type = 3 [default = k_ESteamPipeClientWorkType_Invalid];
	repeated .CClientMetrics_SteamPipeWorkStats_Operation operations = 4;
}

message CClientMetrics_ReportClientError_Notification {
	message Error {
		optional string identifier = 1;
		optional string message = 2;
		optional uint32 count = 3;
	}

	optional string product = 1;
	optional string version = 2;
	repeated .CClientMetrics_ReportClientError_Notification.Error errors = 3;
}

service ClientMetrics {
	option (service_description) = "A service for client-reported metrics";

	rpc ClientAppInterfaceStatsReport (.CClientMetrics_AppInterfaceStats_Notification) returns (.NoResponse);
	rpc ClientIPv6ConnectivityReport (.CClientMetrics_IPv6Connectivity_Notification) returns (.NoResponse);
	rpc SteamPipeWorkStatsReport (.CClientMetrics_SteamPipeWorkStats_Notification) returns (.NoResponse);
	rpc ReportClientError (.CClientMetrics_ReportClientError_Notification) returns (.NoResponse);
}
