diff --git a/apigrpc/apigrpc.pb.go b/apigrpc/apigrpc.pb.go index b027916f94..d6d8d7dc5e 100644 --- a/apigrpc/apigrpc.pb.go +++ b/apigrpc/apigrpc.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.24.2 +// protoc v4.24.4 // source: apigrpc.proto package apigrpc @@ -54,7 +54,7 @@ var file_apigrpc_proto_rawDesc = []byte{ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x8c, 0x4c, 0x0a, 0x06, 0x4e, 0x61, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0xb7, 0x4d, 0x0a, 0x06, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x12, 0x57, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x64, 0x64, 0x46, 0x72, 0x69, 0x65, 0x6e, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, @@ -634,63 +634,74 @@ var file_apigrpc_proto_rawDesc = []byte{ 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x76, 0x32, 0x2f, 0x69, 0x61, 0x70, 0x2f, 0x70, - 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x2f, 0x68, 0x75, 0x61, 0x77, 0x65, 0x69, 0x12, 0x94, - 0x01, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x06, 0x72, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x22, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, - 0x64, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x74, 0x0a, 0x13, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, - 0x63, 0x6b, 0x73, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x1a, 0x0b, - 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0xba, 0x01, 0x0a, 0x15, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x28, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x2f, 0x68, 0x75, 0x61, 0x77, 0x65, 0x69, 0x12, 0xa8, + 0x01, 0x0a, 0x1f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, + 0x61, 0x73, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x74, 0x12, 0x32, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, + 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, + 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x32, 0x2f, 0x69, 0x61, 0x70, + 0x2f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x2f, 0x66, 0x61, 0x63, 0x65, 0x62, 0x6f, + 0x6f, 0x6b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x94, 0x01, 0x0a, 0x16, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x12, 0x29, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x58, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x3a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5a, 0x28, - 0x3a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x6f, - 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x1a, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x6f, - 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x7d, 0x42, 0xa7, 0x03, 0x92, 0x41, 0xbc, 0x02, 0x12, - 0x75, 0x0a, 0x0d, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, - 0x22, 0x5f, 0x0a, 0x21, 0x54, 0x68, 0x65, 0x20, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x41, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x20, 0x26, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x24, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, - 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x1a, 0x14, 0x68, 0x65, 0x6c, - 0x6c, 0x6f, 0x40, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x63, 0x6f, - 0x6d, 0x32, 0x03, 0x32, 0x2e, 0x30, 0x1a, 0x0e, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, - 0x31, 0x3a, 0x37, 0x33, 0x35, 0x30, 0x2a, 0x01, 0x01, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x5a, 0x3f, 0x0a, - 0x0f, 0x0a, 0x09, 0x42, 0x61, 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x02, 0x08, 0x01, - 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x4a, 0x77, 0x74, 0x12, 0x00, 0x0a, - 0x1d, 0x0a, 0x0b, 0x48, 0x74, 0x74, 0x70, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x0e, - 0x08, 0x02, 0x1a, 0x08, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x20, 0x02, 0x62, 0x0f, - 0x0a, 0x0d, 0x0a, 0x09, 0x42, 0x65, 0x61, 0x72, 0x65, 0x72, 0x4a, 0x77, 0x74, 0x12, 0x00, 0x72, - 0x3a, 0x0a, 0x1b, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, - 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, - 0x62, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x0a, 0x19, 0x63, 0x6f, 0x6d, - 0x2e, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x0d, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x41, 0x70, - 0x69, 0x47, 0x72, 0x70, 0x63, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x70, 0x69, 0x67, 0x72, 0x70, 0x63, - 0xaa, 0x02, 0x0f, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x30, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x20, + 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x2f, + 0x7b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x7d, + 0x12, 0x74, 0x0a, 0x13, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, + 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x41, 0x63, 0x6b, 0x73, 0x22, 0x16, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x10, 0x3a, 0x01, 0x2a, 0x1a, 0x0b, 0x2f, 0x76, 0x32, 0x2f, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x12, 0xba, 0x01, 0x0a, 0x15, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x12, 0x28, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x52, 0x3a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5a, 0x28, 0x3a, 0x06, 0x72, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x22, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x7d, 0x1a, 0x1e, 0x2f, 0x76, 0x32, 0x2f, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x2f, 0x7b, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x7d, 0x42, 0xa7, 0x03, 0x92, 0x41, 0xbc, 0x02, 0x12, 0x75, 0x0a, 0x0d, 0x4e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x41, 0x50, 0x49, 0x20, 0x76, 0x32, 0x22, 0x5f, 0x0a, 0x21, 0x54, + 0x68, 0x65, 0x20, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x73, 0x20, 0x26, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x24, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x1a, 0x14, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x40, 0x68, 0x65, + 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x32, 0x03, 0x32, 0x2e, + 0x30, 0x1a, 0x0e, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x2e, 0x30, 0x2e, 0x31, 0x3a, 0x37, 0x33, 0x35, + 0x30, 0x2a, 0x01, 0x01, 0x32, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x5a, 0x3f, 0x0a, 0x0f, 0x0a, 0x09, 0x42, 0x61, + 0x73, 0x69, 0x63, 0x41, 0x75, 0x74, 0x68, 0x12, 0x02, 0x08, 0x01, 0x0a, 0x0d, 0x0a, 0x09, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x4a, 0x77, 0x74, 0x12, 0x00, 0x0a, 0x1d, 0x0a, 0x0b, 0x48, 0x74, + 0x74, 0x70, 0x4b, 0x65, 0x79, 0x41, 0x75, 0x74, 0x68, 0x12, 0x0e, 0x08, 0x02, 0x1a, 0x08, 0x68, + 0x74, 0x74, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x20, 0x02, 0x62, 0x0f, 0x0a, 0x0d, 0x0a, 0x09, 0x42, + 0x65, 0x61, 0x72, 0x65, 0x72, 0x4a, 0x77, 0x74, 0x12, 0x00, 0x72, 0x3a, 0x0a, 0x1b, 0x4e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x68, 0x74, 0x74, 0x70, 0x73, + 0x3a, 0x2f, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x64, 0x6f, 0x63, 0x73, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x65, 0x72, 0x6f, + 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x42, 0x0d, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x41, 0x70, 0x69, 0x47, 0x72, 0x70, 0x63, + 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, + 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2f, 0x76, 0x33, 0x2f, 0x61, 0x70, 0x69, 0x67, 0x72, 0x70, 0x63, 0xaa, 0x02, 0x0f, 0x4e, 0x61, + 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_apigrpc_proto_goTypes = []interface{}{ @@ -762,31 +773,32 @@ var file_apigrpc_proto_goTypes = []interface{}{ (*api.ValidatePurchaseGoogleRequest)(nil), // 65: nakama.api.ValidatePurchaseGoogleRequest (*api.ValidateSubscriptionGoogleRequest)(nil), // 66: nakama.api.ValidateSubscriptionGoogleRequest (*api.ValidatePurchaseHuaweiRequest)(nil), // 67: nakama.api.ValidatePurchaseHuaweiRequest - (*api.WriteLeaderboardRecordRequest)(nil), // 68: nakama.api.WriteLeaderboardRecordRequest - (*api.WriteStorageObjectsRequest)(nil), // 69: nakama.api.WriteStorageObjectsRequest - (*api.WriteTournamentRecordRequest)(nil), // 70: nakama.api.WriteTournamentRecordRequest - (*api.Session)(nil), // 71: nakama.api.Session - (*api.Group)(nil), // 72: nakama.api.Group - (*api.Account)(nil), // 73: nakama.api.Account - (*api.Users)(nil), // 74: nakama.api.Users - (*api.ValidatedSubscription)(nil), // 75: nakama.api.ValidatedSubscription - (*api.ChannelMessageList)(nil), // 76: nakama.api.ChannelMessageList - (*api.FriendList)(nil), // 77: nakama.api.FriendList - (*api.GroupList)(nil), // 78: nakama.api.GroupList - (*api.GroupUserList)(nil), // 79: nakama.api.GroupUserList - (*api.LeaderboardRecordList)(nil), // 80: nakama.api.LeaderboardRecordList - (*api.MatchList)(nil), // 81: nakama.api.MatchList - (*api.NotificationList)(nil), // 82: nakama.api.NotificationList - (*api.StorageObjectList)(nil), // 83: nakama.api.StorageObjectList - (*api.SubscriptionList)(nil), // 84: nakama.api.SubscriptionList - (*api.TournamentList)(nil), // 85: nakama.api.TournamentList - (*api.TournamentRecordList)(nil), // 86: nakama.api.TournamentRecordList - (*api.UserGroupList)(nil), // 87: nakama.api.UserGroupList - (*api.StorageObjects)(nil), // 88: nakama.api.StorageObjects - (*api.ValidatePurchaseResponse)(nil), // 89: nakama.api.ValidatePurchaseResponse - (*api.ValidateSubscriptionResponse)(nil), // 90: nakama.api.ValidateSubscriptionResponse - (*api.LeaderboardRecord)(nil), // 91: nakama.api.LeaderboardRecord - (*api.StorageObjectAcks)(nil), // 92: nakama.api.StorageObjectAcks + (*api.ValidatePurchaseFacebookInstantRequest)(nil), // 68: nakama.api.ValidatePurchaseFacebookInstantRequest + (*api.WriteLeaderboardRecordRequest)(nil), // 69: nakama.api.WriteLeaderboardRecordRequest + (*api.WriteStorageObjectsRequest)(nil), // 70: nakama.api.WriteStorageObjectsRequest + (*api.WriteTournamentRecordRequest)(nil), // 71: nakama.api.WriteTournamentRecordRequest + (*api.Session)(nil), // 72: nakama.api.Session + (*api.Group)(nil), // 73: nakama.api.Group + (*api.Account)(nil), // 74: nakama.api.Account + (*api.Users)(nil), // 75: nakama.api.Users + (*api.ValidatedSubscription)(nil), // 76: nakama.api.ValidatedSubscription + (*api.ChannelMessageList)(nil), // 77: nakama.api.ChannelMessageList + (*api.FriendList)(nil), // 78: nakama.api.FriendList + (*api.GroupList)(nil), // 79: nakama.api.GroupList + (*api.GroupUserList)(nil), // 80: nakama.api.GroupUserList + (*api.LeaderboardRecordList)(nil), // 81: nakama.api.LeaderboardRecordList + (*api.MatchList)(nil), // 82: nakama.api.MatchList + (*api.NotificationList)(nil), // 83: nakama.api.NotificationList + (*api.StorageObjectList)(nil), // 84: nakama.api.StorageObjectList + (*api.SubscriptionList)(nil), // 85: nakama.api.SubscriptionList + (*api.TournamentList)(nil), // 86: nakama.api.TournamentList + (*api.TournamentRecordList)(nil), // 87: nakama.api.TournamentRecordList + (*api.UserGroupList)(nil), // 88: nakama.api.UserGroupList + (*api.StorageObjects)(nil), // 89: nakama.api.StorageObjects + (*api.ValidatePurchaseResponse)(nil), // 90: nakama.api.ValidatePurchaseResponse + (*api.ValidateSubscriptionResponse)(nil), // 91: nakama.api.ValidateSubscriptionResponse + (*api.LeaderboardRecord)(nil), // 92: nakama.api.LeaderboardRecord + (*api.StorageObjectAcks)(nil), // 93: nakama.api.StorageObjectAcks } var file_apigrpc_proto_depIdxs = []int32{ 0, // 0: nakama.api.Nakama.AddFriends:input_type -> nakama.api.AddFriendsRequest @@ -866,91 +878,93 @@ var file_apigrpc_proto_depIdxs = []int32{ 65, // 74: nakama.api.Nakama.ValidatePurchaseGoogle:input_type -> nakama.api.ValidatePurchaseGoogleRequest 66, // 75: nakama.api.Nakama.ValidateSubscriptionGoogle:input_type -> nakama.api.ValidateSubscriptionGoogleRequest 67, // 76: nakama.api.Nakama.ValidatePurchaseHuawei:input_type -> nakama.api.ValidatePurchaseHuaweiRequest - 68, // 77: nakama.api.Nakama.WriteLeaderboardRecord:input_type -> nakama.api.WriteLeaderboardRecordRequest - 69, // 78: nakama.api.Nakama.WriteStorageObjects:input_type -> nakama.api.WriteStorageObjectsRequest - 70, // 79: nakama.api.Nakama.WriteTournamentRecord:input_type -> nakama.api.WriteTournamentRecordRequest - 16, // 80: nakama.api.Nakama.AddFriends:output_type -> google.protobuf.Empty - 16, // 81: nakama.api.Nakama.AddGroupUsers:output_type -> google.protobuf.Empty - 71, // 82: nakama.api.Nakama.SessionRefresh:output_type -> nakama.api.Session - 16, // 83: nakama.api.Nakama.SessionLogout:output_type -> google.protobuf.Empty - 71, // 84: nakama.api.Nakama.AuthenticateApple:output_type -> nakama.api.Session - 71, // 85: nakama.api.Nakama.AuthenticateCustom:output_type -> nakama.api.Session - 71, // 86: nakama.api.Nakama.AuthenticateDevice:output_type -> nakama.api.Session - 71, // 87: nakama.api.Nakama.AuthenticateEmail:output_type -> nakama.api.Session - 71, // 88: nakama.api.Nakama.AuthenticateFacebook:output_type -> nakama.api.Session - 71, // 89: nakama.api.Nakama.AuthenticateFacebookInstantGame:output_type -> nakama.api.Session - 71, // 90: nakama.api.Nakama.AuthenticateGameCenter:output_type -> nakama.api.Session - 71, // 91: nakama.api.Nakama.AuthenticateGoogle:output_type -> nakama.api.Session - 71, // 92: nakama.api.Nakama.AuthenticateSteam:output_type -> nakama.api.Session - 16, // 93: nakama.api.Nakama.BanGroupUsers:output_type -> google.protobuf.Empty - 16, // 94: nakama.api.Nakama.BlockFriends:output_type -> google.protobuf.Empty - 72, // 95: nakama.api.Nakama.CreateGroup:output_type -> nakama.api.Group - 16, // 96: nakama.api.Nakama.DeleteAccount:output_type -> google.protobuf.Empty - 16, // 97: nakama.api.Nakama.DeleteFriends:output_type -> google.protobuf.Empty - 16, // 98: nakama.api.Nakama.DeleteGroup:output_type -> google.protobuf.Empty - 16, // 99: nakama.api.Nakama.DeleteLeaderboardRecord:output_type -> google.protobuf.Empty - 16, // 100: nakama.api.Nakama.DeleteNotifications:output_type -> google.protobuf.Empty - 16, // 101: nakama.api.Nakama.DeleteTournamentRecord:output_type -> google.protobuf.Empty - 16, // 102: nakama.api.Nakama.DeleteStorageObjects:output_type -> google.protobuf.Empty - 16, // 103: nakama.api.Nakama.Event:output_type -> google.protobuf.Empty - 73, // 104: nakama.api.Nakama.GetAccount:output_type -> nakama.api.Account - 74, // 105: nakama.api.Nakama.GetUsers:output_type -> nakama.api.Users - 75, // 106: nakama.api.Nakama.GetSubscription:output_type -> nakama.api.ValidatedSubscription - 16, // 107: nakama.api.Nakama.Healthcheck:output_type -> google.protobuf.Empty - 16, // 108: nakama.api.Nakama.ImportFacebookFriends:output_type -> google.protobuf.Empty - 16, // 109: nakama.api.Nakama.ImportSteamFriends:output_type -> google.protobuf.Empty - 16, // 110: nakama.api.Nakama.JoinGroup:output_type -> google.protobuf.Empty - 16, // 111: nakama.api.Nakama.JoinTournament:output_type -> google.protobuf.Empty - 16, // 112: nakama.api.Nakama.KickGroupUsers:output_type -> google.protobuf.Empty - 16, // 113: nakama.api.Nakama.LeaveGroup:output_type -> google.protobuf.Empty - 16, // 114: nakama.api.Nakama.LinkApple:output_type -> google.protobuf.Empty - 16, // 115: nakama.api.Nakama.LinkCustom:output_type -> google.protobuf.Empty - 16, // 116: nakama.api.Nakama.LinkDevice:output_type -> google.protobuf.Empty - 16, // 117: nakama.api.Nakama.LinkEmail:output_type -> google.protobuf.Empty - 16, // 118: nakama.api.Nakama.LinkFacebook:output_type -> google.protobuf.Empty - 16, // 119: nakama.api.Nakama.LinkFacebookInstantGame:output_type -> google.protobuf.Empty - 16, // 120: nakama.api.Nakama.LinkGameCenter:output_type -> google.protobuf.Empty - 16, // 121: nakama.api.Nakama.LinkGoogle:output_type -> google.protobuf.Empty - 16, // 122: nakama.api.Nakama.LinkSteam:output_type -> google.protobuf.Empty - 76, // 123: nakama.api.Nakama.ListChannelMessages:output_type -> nakama.api.ChannelMessageList - 77, // 124: nakama.api.Nakama.ListFriends:output_type -> nakama.api.FriendList - 78, // 125: nakama.api.Nakama.ListGroups:output_type -> nakama.api.GroupList - 79, // 126: nakama.api.Nakama.ListGroupUsers:output_type -> nakama.api.GroupUserList - 80, // 127: nakama.api.Nakama.ListLeaderboardRecords:output_type -> nakama.api.LeaderboardRecordList - 80, // 128: nakama.api.Nakama.ListLeaderboardRecordsAroundOwner:output_type -> nakama.api.LeaderboardRecordList - 81, // 129: nakama.api.Nakama.ListMatches:output_type -> nakama.api.MatchList - 82, // 130: nakama.api.Nakama.ListNotifications:output_type -> nakama.api.NotificationList - 83, // 131: nakama.api.Nakama.ListStorageObjects:output_type -> nakama.api.StorageObjectList - 84, // 132: nakama.api.Nakama.ListSubscriptions:output_type -> nakama.api.SubscriptionList - 85, // 133: nakama.api.Nakama.ListTournaments:output_type -> nakama.api.TournamentList - 86, // 134: nakama.api.Nakama.ListTournamentRecords:output_type -> nakama.api.TournamentRecordList - 86, // 135: nakama.api.Nakama.ListTournamentRecordsAroundOwner:output_type -> nakama.api.TournamentRecordList - 87, // 136: nakama.api.Nakama.ListUserGroups:output_type -> nakama.api.UserGroupList - 16, // 137: nakama.api.Nakama.PromoteGroupUsers:output_type -> google.protobuf.Empty - 16, // 138: nakama.api.Nakama.DemoteGroupUsers:output_type -> google.protobuf.Empty - 88, // 139: nakama.api.Nakama.ReadStorageObjects:output_type -> nakama.api.StorageObjects - 58, // 140: nakama.api.Nakama.RpcFunc:output_type -> nakama.api.Rpc - 16, // 141: nakama.api.Nakama.UnlinkApple:output_type -> google.protobuf.Empty - 16, // 142: nakama.api.Nakama.UnlinkCustom:output_type -> google.protobuf.Empty - 16, // 143: nakama.api.Nakama.UnlinkDevice:output_type -> google.protobuf.Empty - 16, // 144: nakama.api.Nakama.UnlinkEmail:output_type -> google.protobuf.Empty - 16, // 145: nakama.api.Nakama.UnlinkFacebook:output_type -> google.protobuf.Empty - 16, // 146: nakama.api.Nakama.UnlinkFacebookInstantGame:output_type -> google.protobuf.Empty - 16, // 147: nakama.api.Nakama.UnlinkGameCenter:output_type -> google.protobuf.Empty - 16, // 148: nakama.api.Nakama.UnlinkGoogle:output_type -> google.protobuf.Empty - 16, // 149: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty - 16, // 150: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty - 16, // 151: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty - 89, // 152: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse - 90, // 153: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse - 89, // 154: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse - 90, // 155: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse - 89, // 156: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse - 91, // 157: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord - 92, // 158: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks - 91, // 159: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord - 80, // [80:160] is the sub-list for method output_type - 0, // [0:80] is the sub-list for method input_type + 68, // 77: nakama.api.Nakama.ValidatePurchaseFacebookInstant:input_type -> nakama.api.ValidatePurchaseFacebookInstantRequest + 69, // 78: nakama.api.Nakama.WriteLeaderboardRecord:input_type -> nakama.api.WriteLeaderboardRecordRequest + 70, // 79: nakama.api.Nakama.WriteStorageObjects:input_type -> nakama.api.WriteStorageObjectsRequest + 71, // 80: nakama.api.Nakama.WriteTournamentRecord:input_type -> nakama.api.WriteTournamentRecordRequest + 16, // 81: nakama.api.Nakama.AddFriends:output_type -> google.protobuf.Empty + 16, // 82: nakama.api.Nakama.AddGroupUsers:output_type -> google.protobuf.Empty + 72, // 83: nakama.api.Nakama.SessionRefresh:output_type -> nakama.api.Session + 16, // 84: nakama.api.Nakama.SessionLogout:output_type -> google.protobuf.Empty + 72, // 85: nakama.api.Nakama.AuthenticateApple:output_type -> nakama.api.Session + 72, // 86: nakama.api.Nakama.AuthenticateCustom:output_type -> nakama.api.Session + 72, // 87: nakama.api.Nakama.AuthenticateDevice:output_type -> nakama.api.Session + 72, // 88: nakama.api.Nakama.AuthenticateEmail:output_type -> nakama.api.Session + 72, // 89: nakama.api.Nakama.AuthenticateFacebook:output_type -> nakama.api.Session + 72, // 90: nakama.api.Nakama.AuthenticateFacebookInstantGame:output_type -> nakama.api.Session + 72, // 91: nakama.api.Nakama.AuthenticateGameCenter:output_type -> nakama.api.Session + 72, // 92: nakama.api.Nakama.AuthenticateGoogle:output_type -> nakama.api.Session + 72, // 93: nakama.api.Nakama.AuthenticateSteam:output_type -> nakama.api.Session + 16, // 94: nakama.api.Nakama.BanGroupUsers:output_type -> google.protobuf.Empty + 16, // 95: nakama.api.Nakama.BlockFriends:output_type -> google.protobuf.Empty + 73, // 96: nakama.api.Nakama.CreateGroup:output_type -> nakama.api.Group + 16, // 97: nakama.api.Nakama.DeleteAccount:output_type -> google.protobuf.Empty + 16, // 98: nakama.api.Nakama.DeleteFriends:output_type -> google.protobuf.Empty + 16, // 99: nakama.api.Nakama.DeleteGroup:output_type -> google.protobuf.Empty + 16, // 100: nakama.api.Nakama.DeleteLeaderboardRecord:output_type -> google.protobuf.Empty + 16, // 101: nakama.api.Nakama.DeleteNotifications:output_type -> google.protobuf.Empty + 16, // 102: nakama.api.Nakama.DeleteTournamentRecord:output_type -> google.protobuf.Empty + 16, // 103: nakama.api.Nakama.DeleteStorageObjects:output_type -> google.protobuf.Empty + 16, // 104: nakama.api.Nakama.Event:output_type -> google.protobuf.Empty + 74, // 105: nakama.api.Nakama.GetAccount:output_type -> nakama.api.Account + 75, // 106: nakama.api.Nakama.GetUsers:output_type -> nakama.api.Users + 76, // 107: nakama.api.Nakama.GetSubscription:output_type -> nakama.api.ValidatedSubscription + 16, // 108: nakama.api.Nakama.Healthcheck:output_type -> google.protobuf.Empty + 16, // 109: nakama.api.Nakama.ImportFacebookFriends:output_type -> google.protobuf.Empty + 16, // 110: nakama.api.Nakama.ImportSteamFriends:output_type -> google.protobuf.Empty + 16, // 111: nakama.api.Nakama.JoinGroup:output_type -> google.protobuf.Empty + 16, // 112: nakama.api.Nakama.JoinTournament:output_type -> google.protobuf.Empty + 16, // 113: nakama.api.Nakama.KickGroupUsers:output_type -> google.protobuf.Empty + 16, // 114: nakama.api.Nakama.LeaveGroup:output_type -> google.protobuf.Empty + 16, // 115: nakama.api.Nakama.LinkApple:output_type -> google.protobuf.Empty + 16, // 116: nakama.api.Nakama.LinkCustom:output_type -> google.protobuf.Empty + 16, // 117: nakama.api.Nakama.LinkDevice:output_type -> google.protobuf.Empty + 16, // 118: nakama.api.Nakama.LinkEmail:output_type -> google.protobuf.Empty + 16, // 119: nakama.api.Nakama.LinkFacebook:output_type -> google.protobuf.Empty + 16, // 120: nakama.api.Nakama.LinkFacebookInstantGame:output_type -> google.protobuf.Empty + 16, // 121: nakama.api.Nakama.LinkGameCenter:output_type -> google.protobuf.Empty + 16, // 122: nakama.api.Nakama.LinkGoogle:output_type -> google.protobuf.Empty + 16, // 123: nakama.api.Nakama.LinkSteam:output_type -> google.protobuf.Empty + 77, // 124: nakama.api.Nakama.ListChannelMessages:output_type -> nakama.api.ChannelMessageList + 78, // 125: nakama.api.Nakama.ListFriends:output_type -> nakama.api.FriendList + 79, // 126: nakama.api.Nakama.ListGroups:output_type -> nakama.api.GroupList + 80, // 127: nakama.api.Nakama.ListGroupUsers:output_type -> nakama.api.GroupUserList + 81, // 128: nakama.api.Nakama.ListLeaderboardRecords:output_type -> nakama.api.LeaderboardRecordList + 81, // 129: nakama.api.Nakama.ListLeaderboardRecordsAroundOwner:output_type -> nakama.api.LeaderboardRecordList + 82, // 130: nakama.api.Nakama.ListMatches:output_type -> nakama.api.MatchList + 83, // 131: nakama.api.Nakama.ListNotifications:output_type -> nakama.api.NotificationList + 84, // 132: nakama.api.Nakama.ListStorageObjects:output_type -> nakama.api.StorageObjectList + 85, // 133: nakama.api.Nakama.ListSubscriptions:output_type -> nakama.api.SubscriptionList + 86, // 134: nakama.api.Nakama.ListTournaments:output_type -> nakama.api.TournamentList + 87, // 135: nakama.api.Nakama.ListTournamentRecords:output_type -> nakama.api.TournamentRecordList + 87, // 136: nakama.api.Nakama.ListTournamentRecordsAroundOwner:output_type -> nakama.api.TournamentRecordList + 88, // 137: nakama.api.Nakama.ListUserGroups:output_type -> nakama.api.UserGroupList + 16, // 138: nakama.api.Nakama.PromoteGroupUsers:output_type -> google.protobuf.Empty + 16, // 139: nakama.api.Nakama.DemoteGroupUsers:output_type -> google.protobuf.Empty + 89, // 140: nakama.api.Nakama.ReadStorageObjects:output_type -> nakama.api.StorageObjects + 58, // 141: nakama.api.Nakama.RpcFunc:output_type -> nakama.api.Rpc + 16, // 142: nakama.api.Nakama.UnlinkApple:output_type -> google.protobuf.Empty + 16, // 143: nakama.api.Nakama.UnlinkCustom:output_type -> google.protobuf.Empty + 16, // 144: nakama.api.Nakama.UnlinkDevice:output_type -> google.protobuf.Empty + 16, // 145: nakama.api.Nakama.UnlinkEmail:output_type -> google.protobuf.Empty + 16, // 146: nakama.api.Nakama.UnlinkFacebook:output_type -> google.protobuf.Empty + 16, // 147: nakama.api.Nakama.UnlinkFacebookInstantGame:output_type -> google.protobuf.Empty + 16, // 148: nakama.api.Nakama.UnlinkGameCenter:output_type -> google.protobuf.Empty + 16, // 149: nakama.api.Nakama.UnlinkGoogle:output_type -> google.protobuf.Empty + 16, // 150: nakama.api.Nakama.UnlinkSteam:output_type -> google.protobuf.Empty + 16, // 151: nakama.api.Nakama.UpdateAccount:output_type -> google.protobuf.Empty + 16, // 152: nakama.api.Nakama.UpdateGroup:output_type -> google.protobuf.Empty + 90, // 153: nakama.api.Nakama.ValidatePurchaseApple:output_type -> nakama.api.ValidatePurchaseResponse + 91, // 154: nakama.api.Nakama.ValidateSubscriptionApple:output_type -> nakama.api.ValidateSubscriptionResponse + 90, // 155: nakama.api.Nakama.ValidatePurchaseGoogle:output_type -> nakama.api.ValidatePurchaseResponse + 91, // 156: nakama.api.Nakama.ValidateSubscriptionGoogle:output_type -> nakama.api.ValidateSubscriptionResponse + 90, // 157: nakama.api.Nakama.ValidatePurchaseHuawei:output_type -> nakama.api.ValidatePurchaseResponse + 90, // 158: nakama.api.Nakama.ValidatePurchaseFacebookInstant:output_type -> nakama.api.ValidatePurchaseResponse + 92, // 159: nakama.api.Nakama.WriteLeaderboardRecord:output_type -> nakama.api.LeaderboardRecord + 93, // 160: nakama.api.Nakama.WriteStorageObjects:output_type -> nakama.api.StorageObjectAcks + 92, // 161: nakama.api.Nakama.WriteTournamentRecord:output_type -> nakama.api.LeaderboardRecord + 81, // [81:162] is the sub-list for method output_type + 0, // [0:81] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/apigrpc/apigrpc.pb.gw.go b/apigrpc/apigrpc.pb.gw.go index 35fdbca07b..9afc5be2c4 100644 --- a/apigrpc/apigrpc.pb.gw.go +++ b/apigrpc/apigrpc.pb.gw.go @@ -3719,6 +3719,40 @@ func local_request_Nakama_ValidatePurchaseHuawei_0(ctx context.Context, marshale } +func request_Nakama_ValidatePurchaseFacebookInstant_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq api.ValidatePurchaseFacebookInstantRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ValidatePurchaseFacebookInstant(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Nakama_ValidatePurchaseFacebookInstant_0(ctx context.Context, marshaler runtime.Marshaler, server NakamaServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq api.ValidatePurchaseFacebookInstantRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ValidatePurchaseFacebookInstant(ctx, &protoReq) + return msg, metadata, err + +} + func request_Nakama_WriteLeaderboardRecord_0(ctx context.Context, marshaler runtime.Marshaler, client NakamaClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq api.WriteLeaderboardRecordRequest var metadata runtime.ServerMetadata @@ -5938,6 +5972,31 @@ func RegisterNakamaHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser }) + mux.Handle("POST", pattern_Nakama_ValidatePurchaseFacebookInstant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseFacebookInstant", runtime.WithHTTPPathPattern("/v2/iap/purchase/facebookinstant")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -7817,6 +7876,28 @@ func RegisterNakamaHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) + mux.Handle("POST", pattern_Nakama_ValidatePurchaseFacebookInstant_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/nakama.api.Nakama/ValidatePurchaseFacebookInstant", runtime.WithHTTPPathPattern("/v2/iap/purchase/facebookinstant")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Nakama_ValidatePurchaseFacebookInstant_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Nakama_WriteLeaderboardRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -8067,6 +8148,8 @@ var ( pattern_Nakama_ValidatePurchaseHuawei_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "huawei"}, "")) + pattern_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "iap", "purchase", "facebookinstant"}, "")) + pattern_Nakama_WriteLeaderboardRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v2", "leaderboard", "leaderboard_id"}, "")) pattern_Nakama_WriteStorageObjects_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v2", "storage"}, "")) @@ -8235,6 +8318,8 @@ var ( forward_Nakama_ValidatePurchaseHuawei_0 = runtime.ForwardResponseMessage + forward_Nakama_ValidatePurchaseFacebookInstant_0 = runtime.ForwardResponseMessage + forward_Nakama_WriteLeaderboardRecord_0 = runtime.ForwardResponseMessage forward_Nakama_WriteStorageObjects_0 = runtime.ForwardResponseMessage diff --git a/apigrpc/apigrpc.proto b/apigrpc/apigrpc.proto index d6632d9160..6ac8cd2df4 100644 --- a/apigrpc/apigrpc.proto +++ b/apigrpc/apigrpc.proto @@ -706,6 +706,14 @@ service Nakama { }; } + // Validate FB Instant IAP Receipt + rpc ValidatePurchaseFacebookInstant (api.ValidatePurchaseFacebookInstantRequest) returns (api.ValidatePurchaseResponse) { + option (google.api.http) = { + post: "/v2/iap/purchase/facebookinstant", + body: "*" + }; + } + // Write a record to a leaderboard. rpc WriteLeaderboardRecord (api.WriteLeaderboardRecordRequest) returns (api.LeaderboardRecord) { option (google.api.http) = { diff --git a/apigrpc/apigrpc.swagger.json b/apigrpc/apigrpc.swagger.json index 3bdecc08f8..31e4e5febf 100644 --- a/apigrpc/apigrpc.swagger.json +++ b/apigrpc/apigrpc.swagger.json @@ -2225,6 +2225,39 @@ ] } }, + "/v2/iap/purchase/facebookinstant": { + "post": { + "summary": "Validate FB Instant IAP Receipt", + "operationId": "Nakama_ValidatePurchaseFacebookInstant", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/apiValidatePurchaseResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/apiValidatePurchaseFacebookInstantRequest" + } + } + ], + "tags": [ + "Nakama" + ] + } + }, "/v2/iap/purchase/google": { "post": { "summary": "Validate Google IAP Receipt", @@ -4652,10 +4685,11 @@ "enum": [ "APPLE_APP_STORE", "GOOGLE_PLAY_STORE", - "HUAWEI_APP_GALLERY" + "HUAWEI_APP_GALLERY", + "FACEBOOK_INSTANT_STORE" ], "default": "APPLE_APP_STORE", - "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery", + "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store", "title": "Validation Provider," }, "apiSubscriptionList": { @@ -4989,6 +5023,20 @@ }, "title": "Apple IAP Purchases validation request" }, + "apiValidatePurchaseFacebookInstantRequest": { + "type": "object", + "properties": { + "signedRequest": { + "type": "string", + "description": "Base64 encoded Facebook Instant signedRequest receipt data payload." + }, + "persist": { + "type": "boolean", + "title": "Persist the purchase" + } + }, + "title": "Facebook Instant IAP Purchase validation request" + }, "apiValidatePurchaseGoogleRequest": { "type": "object", "properties": { diff --git a/apigrpc/apigrpc_grpc.pb.go b/apigrpc/apigrpc_grpc.pb.go index acf68766ca..439f7a6099 100644 --- a/apigrpc/apigrpc_grpc.pb.go +++ b/apigrpc/apigrpc_grpc.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.24.2 +// - protoc v4.24.4 // source: apigrpc.proto package apigrpc @@ -115,6 +115,7 @@ const ( Nakama_ValidatePurchaseGoogle_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseGoogle" Nakama_ValidateSubscriptionGoogle_FullMethodName = "/nakama.api.Nakama/ValidateSubscriptionGoogle" Nakama_ValidatePurchaseHuawei_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseHuawei" + Nakama_ValidatePurchaseFacebookInstant_FullMethodName = "/nakama.api.Nakama/ValidatePurchaseFacebookInstant" Nakama_WriteLeaderboardRecord_FullMethodName = "/nakama.api.Nakama/WriteLeaderboardRecord" Nakama_WriteStorageObjects_FullMethodName = "/nakama.api.Nakama/WriteStorageObjects" Nakama_WriteTournamentRecord_FullMethodName = "/nakama.api.Nakama/WriteTournamentRecord" @@ -278,6 +279,8 @@ type NakamaClient interface { ValidateSubscriptionGoogle(ctx context.Context, in *api.ValidateSubscriptionGoogleRequest, opts ...grpc.CallOption) (*api.ValidateSubscriptionResponse, error) // Validate Huawei IAP Receipt ValidatePurchaseHuawei(ctx context.Context, in *api.ValidatePurchaseHuaweiRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) + // Validate FB Instant IAP Receipt + ValidatePurchaseFacebookInstant(ctx context.Context, in *api.ValidatePurchaseFacebookInstantRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) // Write a record to a leaderboard. WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) // Write objects into the storage engine. @@ -987,6 +990,15 @@ func (c *nakamaClient) ValidatePurchaseHuawei(ctx context.Context, in *api.Valid return out, nil } +func (c *nakamaClient) ValidatePurchaseFacebookInstant(ctx context.Context, in *api.ValidatePurchaseFacebookInstantRequest, opts ...grpc.CallOption) (*api.ValidatePurchaseResponse, error) { + out := new(api.ValidatePurchaseResponse) + err := c.cc.Invoke(ctx, Nakama_ValidatePurchaseFacebookInstant_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *nakamaClient) WriteLeaderboardRecord(ctx context.Context, in *api.WriteLeaderboardRecordRequest, opts ...grpc.CallOption) (*api.LeaderboardRecord, error) { out := new(api.LeaderboardRecord) err := c.cc.Invoke(ctx, Nakama_WriteLeaderboardRecord_FullMethodName, in, out, opts...) @@ -1172,6 +1184,8 @@ type NakamaServer interface { ValidateSubscriptionGoogle(context.Context, *api.ValidateSubscriptionGoogleRequest) (*api.ValidateSubscriptionResponse, error) // Validate Huawei IAP Receipt ValidatePurchaseHuawei(context.Context, *api.ValidatePurchaseHuaweiRequest) (*api.ValidatePurchaseResponse, error) + // Validate FB Instant IAP Receipt + ValidatePurchaseFacebookInstant(context.Context, *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error) // Write a record to a leaderboard. WriteLeaderboardRecord(context.Context, *api.WriteLeaderboardRecordRequest) (*api.LeaderboardRecord, error) // Write objects into the storage engine. @@ -1416,6 +1430,9 @@ func (UnimplementedNakamaServer) ValidateSubscriptionGoogle(context.Context, *ap func (UnimplementedNakamaServer) ValidatePurchaseHuawei(context.Context, *api.ValidatePurchaseHuaweiRequest) (*api.ValidatePurchaseResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseHuawei not implemented") } +func (UnimplementedNakamaServer) ValidatePurchaseFacebookInstant(context.Context, *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ValidatePurchaseFacebookInstant not implemented") +} func (UnimplementedNakamaServer) WriteLeaderboardRecord(context.Context, *api.WriteLeaderboardRecordRequest) (*api.LeaderboardRecord, error) { return nil, status.Errorf(codes.Unimplemented, "method WriteLeaderboardRecord not implemented") } @@ -2824,6 +2841,24 @@ func _Nakama_ValidatePurchaseHuawei_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _Nakama_ValidatePurchaseFacebookInstant_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(api.ValidatePurchaseFacebookInstantRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NakamaServer).ValidatePurchaseFacebookInstant(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Nakama_ValidatePurchaseFacebookInstant_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NakamaServer).ValidatePurchaseFacebookInstant(ctx, req.(*api.ValidatePurchaseFacebookInstantRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Nakama_WriteLeaderboardRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(api.WriteLeaderboardRecordRequest) if err := dec(in); err != nil { @@ -3193,6 +3228,10 @@ var Nakama_ServiceDesc = grpc.ServiceDesc{ MethodName: "ValidatePurchaseHuawei", Handler: _Nakama_ValidatePurchaseHuawei_Handler, }, + { + MethodName: "ValidatePurchaseFacebookInstant", + Handler: _Nakama_ValidatePurchaseFacebookInstant_Handler, + }, { MethodName: "WriteLeaderboardRecord", Handler: _Nakama_WriteLeaderboardRecord_Handler, diff --git a/console/console.pb.go b/console/console.pb.go index 12dd128ab6..565070855f 100644 --- a/console/console.pb.go +++ b/console/console.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.24.2 +// protoc v4.24.4 // source: console.proto package console diff --git a/console/console.swagger.json b/console/console.swagger.json index a7c9097875..7930bab89d 100644 --- a/console/console.swagger.json +++ b/console/console.swagger.json @@ -3017,10 +3017,11 @@ "enum": [ "APPLE_APP_STORE", "GOOGLE_PLAY_STORE", - "HUAWEI_APP_GALLERY" + "HUAWEI_APP_GALLERY", + "FACEBOOK_INSTANT_STORE" ], "default": "APPLE_APP_STORE", - "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery", + "description": "- APPLE_APP_STORE: Apple App Store\n - GOOGLE_PLAY_STORE: Google Play Store\n - HUAWEI_APP_GALLERY: Huawei App Gallery\n - FACEBOOK_INSTANT_STORE: Facebook Instant Store", "title": "Validation Provider," }, "apiSubscriptionList": { diff --git a/console/console_grpc.pb.go b/console/console_grpc.pb.go index c46b488997..a4d16b9c76 100644 --- a/console/console_grpc.pb.go +++ b/console/console_grpc.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.24.2 +// - protoc v4.24.4 // source: console.proto package console diff --git a/console/ui/src/app/console.service.ts b/console/ui/src/app/console.service.ts index 6a2870a5b9..d237ce2ec5 100644 --- a/console/ui/src/app/console.service.ts +++ b/console/ui/src/app/console.service.ts @@ -697,6 +697,7 @@ export enum ApiStoreProvider { APPLE_APP_STORE = 0, GOOGLE_PLAY_STORE = 1, HUAWEI_APP_GALLERY = 2, + FACEBOOK_INSTANT_STORE = 3, } /** A list of validated subscriptions stored by Nakama. */ diff --git a/go.mod b/go.mod index c3f4a80bc1..e58eec1faf 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,8 @@ require ( gopkg.in/yaml.v3 v3.0.1 ) +replace github.com/heroiclabs/nakama-common => ../nakama-common + require ( cloud.google.com/go/compute v1.20.1 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect diff --git a/go.sum b/go.sum index 129039b11f..cdb30b0158 100644 --- a/go.sum +++ b/go.sum @@ -298,8 +298,6 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/heroiclabs/nakama-common v1.29.0 h1:UVeKSwPHHt7918hZly+ZglT2tXW+p0cF41Xxr07x/aE= -github.com/heroiclabs/nakama-common v1.29.0/go.mod h1:Os8XeXGvHAap/p6M/8fQ3gle4eEXDGRQmoRNcPQTjXs= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= diff --git a/iap/iap.go b/iap/iap.go index 48e9e5b9e3..8560f8effc 100644 --- a/iap/iap.go +++ b/iap/iap.go @@ -15,6 +15,7 @@ import ( "bytes" "context" "crypto" + "crypto/hmac" "crypto/rsa" "crypto/sha256" "crypto/x509" @@ -897,3 +898,59 @@ func verifySignatureHuawei(base64EncodedPublicKey string, data string, signature } return rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.SHA256, hashed[:], signatureByte) } + +type FacebookInstantPaymentInfo struct { + Algorithm string `json:"algorithm"` + AppId string `json:"app_id"` + IsConsumed bool `json:"is_consumed"` + IssuedAt float64 `json:"issued_at"` + PaymentActionType string `json:"payment_action_type"` + PaymentId string `json:"payment_id"` + ProductId string `json:"product_id"` + PurchasePrice struct { + Amount string `json:"amount"` + Currency string `json:"currency"` + } `json:"purchase_price"` + PurchaseTime float64 `json:"purchase_time"` + PurchaseToken string `json:"purchase_token"` +} + +// ValidateReceiptFacebookInstant from: https://developers.facebook.com/docs/games/monetize/in-app-purchases/instant-games#verification +func ValidateReceiptFacebookInstant(appSecret, signedRequest string) (*FacebookInstantPaymentInfo, string, error) { + parts := strings.Split(signedRequest, ".") + if len(parts) != 2 { + return nil, "", errors.New("invalid signedRequest format") + } + + // Decode the first part (SHA256 hash of the payment information) + signature, err := base64.RawURLEncoding.DecodeString(parts[0]) + if err != nil { + return nil, "", errors.New("error decoding signedRequest first part:" + err.Error()) + } + + // Compute the HMAC-SHA256 hash of the payload using the app secret + hmacHash := hmac.New(sha256.New, []byte(appSecret)) + hmacHash.Write([]byte(parts[1])) + computedSignature := hmacHash.Sum(nil) + + // Compare the computed signature with the received signature + isValid := hmac.Equal(signature, computedSignature) + + if !isValid { + return nil, "", errors.New("signedRequest verification failed") + } + + // Decode the second part (payment information) + payload, err := base64.RawURLEncoding.DecodeString(parts[1]) + if err != nil { + return nil, "", errors.New("error decoding signedRequest second part:" + err.Error()) + } + + // Parse the JSON payment information + var payment *FacebookInstantPaymentInfo + if err := json.Unmarshal(payload, &payment); err != nil { + return nil, "", errors.New("error parsing JSON payload:" + err.Error()) + } + + return payment, string(payload), nil +} diff --git a/server/api_purchase.go b/server/api_purchase.go index 0673d1aad8..25e5fa3090 100644 --- a/server/api_purchase.go +++ b/server/api_purchase.go @@ -200,3 +200,60 @@ func (s *ApiServer) ValidatePurchaseHuawei(ctx context.Context, in *api.Validate return validation, err } + +func (s *ApiServer) ValidatePurchaseFacebookInstant(ctx context.Context, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseResponse, error) { + userID := ctx.Value(ctxUserIDKey{}).(uuid.UUID) + + // Before hook. + if fn := s.runtime.BeforeValidatePurchaseFacebookInstant(); fn != nil { + beforeFn := func(clientIP, clientPort string) error { + result, err, code := fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, in) + if err != nil { + return status.Error(code, err.Error()) + } + if result == nil { + // If result is nil, requested resource is disabled. + s.logger.Warn("Intercepted a disabled resource.", zap.Any("resource", ctx.Value(ctxFullMethodKey{}).(string)), zap.String("uid", userID.String())) + return status.Error(codes.NotFound, "Requested resource was not found.") + } + in = result + return nil + } + + // Execute the before function lambda wrapped in a trace for stats measurement. + err := traceApiBefore(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), beforeFn) + if err != nil { + return nil, err + } + } + + if s.config.GetIAP().FacebookInstant.AppSecret == "" { + return nil, status.Error(codes.FailedPrecondition, "Facebook Instant IAP is not configured.") + } + + if len(in.SignedRequest) < 1 { + return nil, status.Error(codes.InvalidArgument, "SignedRequest cannot be empty.") + } + + persist := true + if in.Persist != nil { + persist = in.Persist.GetValue() + } + + validation, err := ValidatePurchaseFacebookInstant(ctx, s.logger, s.db, userID, s.config.GetIAP().FacebookInstant, in.SignedRequest, persist) + if err != nil { + return nil, err + } + + // After hook. + if fn := s.runtime.AfterValidatePurchaseFacebookInstant(); fn != nil { + afterFn := func(clientIP, clientPort string) error { + return fn(ctx, s.logger, userID.String(), ctx.Value(ctxUsernameKey{}).(string), ctx.Value(ctxVarsKey{}).(map[string]string), ctx.Value(ctxExpiryKey{}).(int64), clientIP, clientPort, validation, in) + } + + // Execute the after function lambda wrapped in a trace for stats measurement. + traceApiAfter(ctx, s.logger, s.metrics, ctx.Value(ctxFullMethodKey{}).(string), afterFn) + } + + return validation, err +} diff --git a/server/config.go b/server/config.go index 1e1f347369..acad03c15a 100644 --- a/server/config.go +++ b/server/config.go @@ -1000,16 +1000,18 @@ func NewMatchmakerConfig() *MatchmakerConfig { } type IAPConfig struct { - Apple *IAPAppleConfig `yaml:"apple" json:"apple" usage:"Apple App Store purchase validation configuration."` - Google *IAPGoogleConfig `yaml:"google" json:"google" usage:"Google Play Store purchase validation configuration."` - Huawei *IAPHuaweiConfig `yaml:"huawei" json:"huawei" usage:"Huawei purchase validation configuration."` + Apple *IAPAppleConfig `yaml:"apple" json:"apple" usage:"Apple App Store purchase validation configuration."` + Google *IAPGoogleConfig `yaml:"google" json:"google" usage:"Google Play Store purchase validation configuration."` + Huawei *IAPHuaweiConfig `yaml:"huawei" json:"huawei" usage:"Huawei purchase validation configuration."` + FacebookInstant *IAPFacebookInstantConfig `yaml:"facebook_instant" json:"facebook_instant" usage:"Facebook Instant purchase validation configuration."` } func NewIAPConfig() *IAPConfig { return &IAPConfig{ - Apple: &IAPAppleConfig{}, - Google: &IAPGoogleConfig{}, - Huawei: &IAPHuaweiConfig{}, + Apple: &IAPAppleConfig{}, + Google: &IAPGoogleConfig{}, + Huawei: &IAPHuaweiConfig{}, + FacebookInstant: &IAPFacebookInstantConfig{}, } } @@ -1071,6 +1073,10 @@ type IAPHuaweiConfig struct { ClientSecret string `yaml:"client_secret" json:"client_secret" usage:"Huawei OAuth app client secret."` } +type IAPFacebookInstantConfig struct { + AppSecret string `yaml:"app_secret" json:"app_secret" usage:"Facebook Instant OAuth app client secret."` +} + type GoogleAuthConfig struct { CredentialsJSON string `yaml:"credentials_json" json:"credentials_json" usage:"Google's Access Credentials."` OAuthConfig *oauth2.Config `yaml:"-" json:"-"` diff --git a/server/core_purchase.go b/server/core_purchase.go index 744ad6c09a..e2b7afd7a4 100644 --- a/server/core_purchase.go +++ b/server/core_purchase.go @@ -303,6 +303,74 @@ func ValidatePurchaseHuawei(ctx context.Context, logger *zap.Logger, db *sql.DB, }, nil } +func ValidatePurchaseFacebookInstant(ctx context.Context, logger *zap.Logger, db *sql.DB, userID uuid.UUID, config *IAPFacebookInstantConfig, signedRequest string, persist bool) (*api.ValidatePurchaseResponse, error) { + payment, rawResponse, err := iap.ValidateReceiptFacebookInstant(config.AppSecret, signedRequest) + if err != nil { + if err != context.Canceled { + logger.Error("Error validating Facebook Instant receipt", zap.Error(err)) + } + return nil, err + } + + sPurchase := &storagePurchase{ + userID: userID, + store: api.StoreProvider_FACEBOOK_INSTANT_STORE, + productId: payment.ProductId, + transactionId: payment.PurchaseToken, + rawResponse: rawResponse, + purchaseTime: time.Unix(int64(payment.PurchaseTime), 0), + environment: api.StoreEnvironment_PRODUCTION, + } + + if !persist { + validatedPurchases := []*api.ValidatedPurchase{ + { + UserId: userID.String(), + ProductId: sPurchase.productId, + TransactionId: sPurchase.transactionId, + Store: sPurchase.store, + PurchaseTime: timestamppb.New(sPurchase.purchaseTime), + ProviderResponse: rawResponse, + Environment: sPurchase.environment, + }, + } + + return &api.ValidatePurchaseResponse{ValidatedPurchases: validatedPurchases}, nil + } + + purchases, err := upsertPurchases(ctx, db, []*storagePurchase{sPurchase}) + if err != nil { + if err != context.Canceled { + logger.Error("Error storing Facebook Instant receipt", zap.Error(err)) + } + return nil, err + } + + validatedPurchases := make([]*api.ValidatedPurchase, 0, len(purchases)) + for _, p := range purchases { + suid := p.userID.String() + if p.userID.IsNil() { + suid = "" + } + validatedPurchases = append(validatedPurchases, &api.ValidatedPurchase{ + UserId: suid, + ProductId: p.productId, + TransactionId: p.transactionId, + Store: p.store, + PurchaseTime: timestamppb.New(p.purchaseTime), + CreateTime: timestamppb.New(p.createTime), + UpdateTime: timestamppb.New(p.updateTime), + ProviderResponse: rawResponse, + SeenBefore: p.seenBefore, + Environment: p.environment, + }) + } + + return &api.ValidatePurchaseResponse{ + ValidatedPurchases: validatedPurchases, + }, nil +} + func GetPurchaseByTransactionId(ctx context.Context, db *sql.DB, transactionID string) (*api.ValidatedPurchase, error) { var ( dbTransactionId string diff --git a/server/runtime.go b/server/runtime.go index 2b4bcdf124..fb6a3930df 100644 --- a/server/runtime.go +++ b/server/runtime.go @@ -203,6 +203,8 @@ type ( RuntimeAfterValidateSubscriptionGoogleFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidateSubscriptionResponse, in *api.ValidateSubscriptionGoogleRequest) error RuntimeBeforeValidatePurchaseHuaweiFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseHuaweiRequest) (*api.ValidatePurchaseHuaweiRequest, error, codes.Code) RuntimeAfterValidatePurchaseHuaweiFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseHuaweiRequest) error + RuntimeBeforeValidatePurchaseFacebookInstantFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseFacebookInstantRequest, error, codes.Code) + RuntimeAfterValidatePurchaseFacebookInstantFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error RuntimeBeforeListSubscriptionsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ListSubscriptionsRequest) (*api.ListSubscriptionsRequest, error, codes.Code) RuntimeAfterListSubscriptionsFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.SubscriptionList, in *api.ListSubscriptionsRequest) error RuntimeBeforeGetSubscriptionFunction func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.GetSubscriptionRequest) (*api.GetSubscriptionRequest, error, codes.Code) @@ -410,6 +412,7 @@ type RuntimeBeforeReqFunctions struct { beforeValidatePurchaseGoogleFunction RuntimeBeforeValidatePurchaseGoogleFunction beforeValidateSubscriptionGoogleFunction RuntimeBeforeValidateSubscriptionGoogleFunction beforeValidatePurchaseHuaweiFunction RuntimeBeforeValidatePurchaseHuaweiFunction + beforeValidatePurchaseFacebookInstantFunction RuntimeBeforeValidatePurchaseFacebookInstantFunction beforeListSubscriptionsFunction RuntimeBeforeListSubscriptionsFunction beforeGetSubscriptionFunction RuntimeBeforeGetSubscriptionFunction } @@ -491,6 +494,7 @@ type RuntimeAfterReqFunctions struct { afterValidatePurchaseGoogleFunction RuntimeAfterValidatePurchaseGoogleFunction afterValidateSubscriptionGoogleFunction RuntimeAfterValidateSubscriptionGoogleFunction afterValidatePurchaseHuaweiFunction RuntimeAfterValidatePurchaseHuaweiFunction + afterValidatePurchaseFacebookInstantFunction RuntimeAfterValidatePurchaseFacebookInstantFunction afterListSubscriptionsFunction RuntimeAfterListSubscriptionsFunction afterGetSubscriptionFunction RuntimeAfterGetSubscriptionFunction } @@ -942,6 +946,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allBeforeReqFunctions.beforeValidatePurchaseHuaweiFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchasehuawei")) } + if allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction != nil { + startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) + } if allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -1247,6 +1254,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseHuaweiFunction = luaBeforeReqFns.beforeValidatePurchaseHuaweiFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchasehuawei")) } + if luaBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction != nil { + allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = luaBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction + startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) + } if luaBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = luaBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1561,6 +1572,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allBeforeReqFunctions.beforeValidatePurchaseHuaweiFunction = goBeforeReqFns.beforeValidatePurchaseHuaweiFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchasehuawei")) } + if goBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction != nil { + allBeforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = goBeforeReqFns.beforeValidatePurchaseFacebookInstantFunction + startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatepurchasefacebookinstant")) + } if goBeforeReqFns.beforeValidateSubscriptionAppleFunction != nil { allBeforeReqFunctions.beforeValidateSubscriptionAppleFunction = goBeforeReqFns.beforeValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -1803,6 +1818,9 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. if allAfterReqFunctions.afterValidatePurchaseHuaweiFunction != nil { startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchasehuawei")) } + if allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction != nil { + startupLogger.Info("Registered JavaScript runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) + } if allAfterReqFunctions.afterValidateSubscriptionAppleFunction != nil { startupLogger.Info("Registered JavaScript runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) } @@ -2108,6 +2126,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseHuaweiFunction = luaAfterReqFns.afterValidatePurchaseHuaweiFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchasehuawei")) } + if luaAfterReqFns.afterValidatePurchaseFacebookInstantFunction != nil { + allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction = luaAfterReqFns.afterValidatePurchaseFacebookInstantFunction + startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) + } if luaAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = luaAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Lua runtime After function invocation", zap.String("id", "validatesubscriptionapple")) @@ -2422,6 +2444,10 @@ func NewRuntime(ctx context.Context, logger, startupLogger *zap.Logger, db *sql. allAfterReqFunctions.afterValidatePurchaseHuaweiFunction = goAfterReqFns.afterValidatePurchaseHuaweiFunction startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchasehuawei")) } + if goAfterReqFns.afterValidatePurchaseFacebookInstantFunction != nil { + allAfterReqFunctions.afterValidatePurchaseFacebookInstantFunction = goAfterReqFns.afterValidatePurchaseFacebookInstantFunction + startupLogger.Info("Registered Go runtime After function invocation", zap.String("id", "validatepurchasefacebookinstant")) + } if goAfterReqFns.afterValidateSubscriptionAppleFunction != nil { allAfterReqFunctions.afterValidateSubscriptionAppleFunction = goAfterReqFns.afterValidateSubscriptionAppleFunction startupLogger.Info("Registered Go runtime Before function invocation", zap.String("id", "validatesubscriptionapple")) @@ -3308,6 +3334,14 @@ func (r *Runtime) AfterValidatePurchaseHuawei() RuntimeAfterValidatePurchaseHuaw return r.afterReqFunctions.afterValidatePurchaseHuaweiFunction } +func (r *Runtime) BeforeValidatePurchaseFacebookInstant() RuntimeBeforeValidatePurchaseFacebookInstantFunction { + return r.beforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction +} + +func (r *Runtime) AfterValidatePurchaseFacebookInstant() RuntimeAfterValidatePurchaseFacebookInstantFunction { + return r.afterReqFunctions.afterValidatePurchaseFacebookInstantFunction +} + func (r *Runtime) BeforeEvent() RuntimeBeforeEventFunction { return r.beforeReqFunctions.beforeEventFunction } diff --git a/server/runtime_go.go b/server/runtime_go.go index 250b54631b..388f0321b5 100644 --- a/server/runtime_go.go +++ b/server/runtime_go.go @@ -2439,6 +2439,36 @@ func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchaseHuawei(fn func(ctx return nil } +func (ri *RuntimeGoInitializer) RegisterBeforeValidatePurchaseFacebookInstant(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseFacebookInstantRequest, error)) error { + ri.beforeReq.beforeValidatePurchaseFacebookInstantFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseFacebookInstantRequest, error, codes.Code) { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatepurchasefacebookinstant", "mode": RuntimeExecutionModeBefore.String()} + result, fnErr := fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, in) + if fnErr != nil { + if runtimeErr, ok := fnErr.(*runtime.Error); ok { + if runtimeErr.Code <= 0 || runtimeErr.Code >= 17 { + // If error is present but code is invalid then default to 13 (Internal) as the error code. + return result, runtimeErr, codes.Internal + } + return result, runtimeErr, codes.Code(runtimeErr.Code) + } + // Not a runtime error that contains a code. + return result, fnErr, codes.Internal + } + return result, nil, codes.OK + } + return nil +} + +func (ri *RuntimeGoInitializer) RegisterAfterValidatePurchaseFacebookInstant(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error) error { + ri.afterReq.afterValidatePurchaseFacebookInstantFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error { + ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeAfter, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") + loggerFields := map[string]interface{}{"api_id": "validatepurchasefacebookinstant", "mode": RuntimeExecutionModeAfter.String()} + return fn(ctx, ri.logger.WithFields(loggerFields), ri.db, ri.nk, out, in) + } + return nil +} + func (ri *RuntimeGoInitializer) RegisterBeforeEvent(fn func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, in *api.Event) (*api.Event, error)) error { ri.beforeReq.beforeEventFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.Event) (*api.Event, error, codes.Code) { ctx = NewRuntimeGoContext(ctx, ri.node, ri.version, ri.env, RuntimeExecutionModeBefore, nil, nil, expiry, userID, username, vars, "", clientIP, clientPort, "") diff --git a/server/runtime_go_nakama.go b/server/runtime_go_nakama.go index ab2880b1f3..50db19cfe9 100644 --- a/server/runtime_go_nakama.go +++ b/server/runtime_go_nakama.go @@ -3001,6 +3001,36 @@ func (n *RuntimeGoNakamaModule) PurchaseValidateHuawei(ctx context.Context, user return validation, nil } +// @group purchases +// @summary Validates and stores a purchase receipt from the Huawei App Gallery. +// @param ctx(type=context.Context) The context object represents information about the server and requester. +// @param userId(type=string) The user ID of the owner of the receipt. +// @param signedRequest(type=string) The Facebook Instant signedRequest receipt data. +// @param persist(type=bool) Persist the purchase so that seenBefore can be computed to protect against replay attacks. +// @return validation(*api.ValidatePurchaseResponse) The resulting successfully validated purchases. Any previously validated purchases are returned with a seenBefore flag. +// @return error(error) An optional error value if an error occurred. +func (n *RuntimeGoNakamaModule) PurchaseValidateFacebookInstant(ctx context.Context, userID, signedRequest string, persist bool) (*api.ValidatePurchaseResponse, error) { + if n.config.GetIAP().FacebookInstant.AppSecret == "" { + return nil, errors.New("facebook instant IAP is not configured") + } + + uid, err := uuid.FromString(userID) + if err != nil { + return nil, errors.New("user ID must be a valid id string") + } + + if len(signedRequest) < 1 { + return nil, errors.New("signedRequest cannot be empty string") + } + + validation, err := ValidatePurchaseFacebookInstant(ctx, n.logger, n.db, uid, n.config.GetIAP().FacebookInstant, signedRequest, persist) + if err != nil { + return nil, err + } + + return validation, nil +} + // @group purchases // @summary List stored validated purchase receipts. // @param ctx(type=context.Context) The context object represents information about the server and requester. diff --git a/server/runtime_javascript.go b/server/runtime_javascript.go index dd080dfc05..b9618bdf38 100644 --- a/server/runtime_javascript.go +++ b/server/runtime_javascript.go @@ -1284,6 +1284,14 @@ func NewRuntimeProviderJS(logger, startupLogger *zap.Logger, db *sql.DB, protojs } return result.(*api.ValidatePurchaseHuaweiRequest), nil, 0 } + case "validatepurchasefacebookinstant": + beforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseFacebookInstantRequest, error, codes.Code) { + result, err, code := runtimeProviderJS.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) + if result == nil || err != nil { + return nil, err, code + } + return result.(*api.ValidatePurchaseFacebookInstantRequest), nil, 0 + } case "validatesubscriptionapple": beforeReqFunctions.beforeValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) { result, err, code := runtimeProviderJS.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) @@ -1618,6 +1626,10 @@ func NewRuntimeProviderJS(logger, startupLogger *zap.Logger, db *sql.DB, protojs afterReqFunctions.afterValidatePurchaseHuaweiFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseHuaweiRequest) error { return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) } + case "validatepurchasefacebookinstant": + afterReqFunctions.afterValidatePurchaseFacebookInstantFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error { + return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) + } case "validatesubscriptionapple": afterReqFunctions.afterValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidateSubscriptionResponse, in *api.ValidateSubscriptionAppleRequest) error { return runtimeProviderJS.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) diff --git a/server/runtime_javascript_init.go b/server/runtime_javascript_init.go index 44d603a747..daf39b84d0 100644 --- a/server/runtime_javascript_init.go +++ b/server/runtime_javascript_init.go @@ -255,6 +255,8 @@ func (im *RuntimeJavascriptInitModule) mappings(r *goja.Runtime) map[string]func "registerAfterValidateSubscriptionGoogle": im.registerAfterValidateSubscriptionGoogle(r), "registerBeforeValidatePurchaseHuawei": im.registerBeforeValidatePurchaseHuawei(r), "registerAfterValidatePurchaseHuawei": im.registerAfterValidatePurchaseHuawei(r), + "registerBeforeValidatePurchaseFacebookInstant": im.registerBeforeValidatePurchaseFacebookInstant(r), + "registerAfterValidatePurchaseFacebookInstant": im.registerAfterValidatePurchaseFacebookInstant(r), "registerBeforeListSubscriptions": im.registerBeforeListSubscriptions(r), "registerAfterListSubscriptions": im.registerAfterListSubscriptions(r), "registerBeforeGetSubscription": im.registerBeforeGetSubscription(r), @@ -967,6 +969,14 @@ func (im *RuntimeJavascriptInitModule) registerAfterValidatePurchaseHuawei(r *go return im.registerHook(r, RuntimeExecutionModeAfter, "registerAfterValidatePurchaseHuawei", "validatepurchasehuawei") } +func (im *RuntimeJavascriptInitModule) registerBeforeValidatePurchaseFacebookInstant(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return im.registerHook(r, RuntimeExecutionModeBefore, "registerBeforeValidatePurchaseFacebookInstant", "validatepurchasefacebookinstant") +} + +func (im *RuntimeJavascriptInitModule) registerAfterValidatePurchaseFacebookInstant(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return im.registerHook(r, RuntimeExecutionModeAfter, "registerAfterValidatePurchaseFacebookInstant", "validatepurchasefacebookinstant") +} + func (im *RuntimeJavascriptInitModule) registerBeforeListSubscriptions(r *goja.Runtime) func(goja.FunctionCall) goja.Value { return im.registerHook(r, RuntimeExecutionModeBefore, "registerBeforeListSubscriptions", "listsubscriptions") } diff --git a/server/runtime_javascript_nakama.go b/server/runtime_javascript_nakama.go index 44d3a030cd..ec416a53ec 100644 --- a/server/runtime_javascript_nakama.go +++ b/server/runtime_javascript_nakama.go @@ -247,6 +247,7 @@ func (n *runtimeJavascriptNakamaModule) mappings(r *goja.Runtime) map[string]fun "purchaseValidateApple": n.purchaseValidateApple(r), "purchaseValidateGoogle": n.purchaseValidateGoogle(r), "purchaseValidateHuawei": n.purchaseValidateHuawei(r), + "purchaseValidateFacebookInstant": n.purchaseValidateFacebookInstant(r), "purchaseGetByTransactionId": n.purchaseGetByTransactionId(r), "purchasesList": n.purchasesList(r), "subscriptionValidateApple": n.subscriptionValidateApple(r), @@ -5588,7 +5589,7 @@ func (n *runtimeJavascriptNakamaModule) purchaseValidateHuawei(r *goja.Runtime) if n.config.GetIAP().Huawei.ClientID == "" || n.config.GetIAP().Huawei.ClientSecret == "" || n.config.GetIAP().Huawei.PublicKey == "" { - panic(r.NewGoError(errors.New("Huawei IAP is not configured."))) + panic(r.NewGoError(errors.New("huawei IAP is not configured"))) } userID := getJsString(r, f.Argument(0)) @@ -5626,6 +5627,49 @@ func (n *runtimeJavascriptNakamaModule) purchaseValidateHuawei(r *goja.Runtime) } } +// @group purchases +// @summary Validates and stores a purchase receipt from the Huawei App Gallery. +// @param userId(type=string) The user ID of the owner of the receipt. +// @param signedRequest(type=string) The Facebook Instant signedRequest receipt data. +// @param persist(type=bool, optional=true, default=true) Persist the purchase so that seenBefore can be computed to protect against replay attacks. +// @return validation(nkruntime.ValidatePurchaseResponse) The resulting successfully validated purchases. Any previously validated purchases are returned with a seenBefore flag. +// @return error(error) An optional error value if an error occurred. +func (n *runtimeJavascriptNakamaModule) purchaseValidateFacebookInstant(r *goja.Runtime) func(goja.FunctionCall) goja.Value { + return func(f goja.FunctionCall) goja.Value { + if n.config.GetIAP().FacebookInstant.AppSecret == "" { + panic(r.NewGoError(errors.New("facebook instant IAP is not configured"))) + } + + userID := getJsString(r, f.Argument(0)) + if userID == "" { + panic(r.NewTypeError("expects a user ID string")) + } + uid, err := uuid.FromString(userID) + if err != nil { + panic(r.NewTypeError("expects user ID to be a valid identifier")) + } + + signedRequest := getJsString(r, f.Argument(1)) + if signedRequest == "" { + panic(r.NewTypeError("expects signedRequest")) + } + + persist := true + if f.Argument(2) != goja.Undefined() && f.Argument(2) != goja.Null() { + persist = getJsBool(r, f.Argument(2)) + } + + validation, err := ValidatePurchaseFacebookInstant(n.ctx, n.logger, n.db, uid, n.config.GetIAP().FacebookInstant, signedRequest, persist) + if err != nil { + panic(r.NewGoError(fmt.Errorf("error validating Facebook Instant receipt: %s", err.Error()))) + } + + validationResult := purchaseResponseToJsObject(validation) + + return r.ToValue(validationResult) + } +} + // @group purchases // @summary Look up a purchase receipt by transaction ID. // @param transactionId(type=string) Transaction ID of the purchase to look up. diff --git a/server/runtime_lua.go b/server/runtime_lua.go index e35299754d..56c91d99bd 100644 --- a/server/runtime_lua.go +++ b/server/runtime_lua.go @@ -755,6 +755,14 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, protoj } return result.(*api.ValidatePurchaseHuaweiRequest), nil, 0 } + case "validatepurchasefacebookinstant": + beforeReqFunctions.beforeValidatePurchaseFacebookInstantFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseFacebookInstantRequest, error, codes.Code) { + result, err, code := runtimeProviderLua.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) + if result == nil || err != nil { + return nil, err, code + } + return result.(*api.ValidatePurchaseFacebookInstantRequest), nil, 0 + } case "validatesubscriptionapple": beforeReqFunctions.beforeValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, in *api.ValidateSubscriptionAppleRequest) (*api.ValidateSubscriptionAppleRequest, error, codes.Code) { result, err, code := runtimeProviderLua.BeforeReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, in) @@ -1089,6 +1097,10 @@ func NewRuntimeProviderLua(logger, startupLogger *zap.Logger, db *sql.DB, protoj afterReqFunctions.afterValidatePurchaseHuaweiFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseHuaweiRequest) error { return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) } + case "validatepurchasefacebookinstant": + afterReqFunctions.afterValidatePurchaseFacebookInstantFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error { + return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) + } case "validatesubscriptionapple": afterReqFunctions.afterValidateSubscriptionAppleFunction = func(ctx context.Context, logger *zap.Logger, userID, username string, vars map[string]string, expiry int64, clientIP, clientPort string, out *api.ValidateSubscriptionResponse, in *api.ValidateSubscriptionAppleRequest) error { return runtimeProviderLua.AfterReq(ctx, id, logger, userID, username, vars, expiry, clientIP, clientPort, out, in) diff --git a/server/runtime_lua_nakama.go b/server/runtime_lua_nakama.go index 8bd2b1b568..8b04688f1e 100644 --- a/server/runtime_lua_nakama.go +++ b/server/runtime_lua_nakama.go @@ -262,10 +262,11 @@ func (n *RuntimeLuaNakamaModule) Loader(l *lua.LState) int { "purchase_validate_apple": n.purchaseValidateApple, "purchase_validate_google": n.purchaseValidateGoogle, "purchase_validate_huawei": n.purchaseValidateHuawei, + "purchase_validate_facebook_instant": n.purchaseValidateFacebookInstant, "purchase_get_by_transaction_id": n.purchaseGetByTransactionId, "purchases_list": n.purchasesList, "subscription_validate_apple": n.subscriptionValidateApple, - "subscription_validate_gogle": n.subscriptionValidateGoogle, + "subscription_validate_google": n.subscriptionValidateGoogle, "subscription_get_by_product_id": n.subscriptionGetByProductId, "subscriptions_list": n.subscriptionsList, "tournament_create": n.tournamentCreate, @@ -7184,6 +7185,48 @@ func (n *RuntimeLuaNakamaModule) purchaseValidateHuawei(l *lua.LState) int { return 1 } +// @group purchases +// @summary Validates and stores a purchase receipt from the Huawei App Gallery. +// @param userId(type=string) The user ID of the owner of the receipt. +// @param signedRequest(type=string) The Facebook Instant signedRequest receipt data. +// @param persist(type=bool, optional=true, default=true) Persist the purchase so that seenBefore can be computed to protect against replay attacks. +// @return validation(table) The resulting successfully validated purchases. Any previously validated purchases are returned with a seenBefore flag. +// @return error(error) An optional error value if an error occurred. +func (n *RuntimeLuaNakamaModule) purchaseValidateFacebookInstant(l *lua.LState) int { + if n.config.GetIAP().FacebookInstant.AppSecret == "" { + l.RaiseError("Facebook Instant IAP is not configured.") + return 0 + } + + input := l.CheckString(1) + if input == "" { + l.ArgError(1, "expects user id") + return 0 + } + userID, err := uuid.FromString(input) + if err != nil { + l.ArgError(1, "invalid user id") + return 0 + } + + signedRequest := l.CheckString(2) + if input == "" { + l.ArgError(2, "expects signedRequest") + return 0 + } + + persist := l.OptBool(3, true) + + validation, err := ValidatePurchaseFacebookInstant(l.Context(), n.logger, n.db, userID, n.config.GetIAP().FacebookInstant, signedRequest, persist) + if err != nil { + l.RaiseError("error validating Facebook Instant receipt: %v", err.Error()) + return 0 + } + + l.Push(purchaseValidationToLuaTable(l, validation)) + return 1 +} + // @group purchases // @summary Look up a purchase receipt by transaction ID. // @param transactionId(type=string) Transaction ID of the purchase to look up. diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go index 5bc1fe3cd9..e1924a041c 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.24.2 +// protoc v4.24.4 // source: api.proto package api @@ -49,6 +49,8 @@ const ( StoreProvider_GOOGLE_PLAY_STORE StoreProvider = 1 // Huawei App Gallery StoreProvider_HUAWEI_APP_GALLERY StoreProvider = 2 + // Facebook Instant Store + StoreProvider_FACEBOOK_INSTANT_STORE StoreProvider = 3 ) // Enum value maps for StoreProvider. @@ -57,11 +59,13 @@ var ( 0: "APPLE_APP_STORE", 1: "GOOGLE_PLAY_STORE", 2: "HUAWEI_APP_GALLERY", + 3: "FACEBOOK_INSTANT_STORE", } StoreProvider_value = map[string]int32{ - "APPLE_APP_STORE": 0, - "GOOGLE_PLAY_STORE": 1, - "HUAWEI_APP_GALLERY": 2, + "APPLE_APP_STORE": 0, + "GOOGLE_PLAY_STORE": 1, + "HUAWEI_APP_GALLERY": 2, + "FACEBOOK_INSTANT_STORE": 3, } ) @@ -7510,6 +7514,64 @@ func (x *ValidatePurchaseHuaweiRequest) GetPersist() *wrapperspb.BoolValue { return nil } +// Facebook Instant IAP Purchase validation request +type ValidatePurchaseFacebookInstantRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Base64 encoded Facebook Instant signedRequest receipt data payload. + SignedRequest string `protobuf:"bytes,1,opt,name=signed_request,json=signedRequest,proto3" json:"signed_request,omitempty"` + // Persist the purchase + Persist *wrapperspb.BoolValue `protobuf:"bytes,2,opt,name=persist,proto3" json:"persist,omitempty"` +} + +func (x *ValidatePurchaseFacebookInstantRequest) Reset() { + *x = ValidatePurchaseFacebookInstantRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_msgTypes[98] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidatePurchaseFacebookInstantRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatePurchaseFacebookInstantRequest) ProtoMessage() {} + +func (x *ValidatePurchaseFacebookInstantRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_msgTypes[98] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidatePurchaseFacebookInstantRequest.ProtoReflect.Descriptor instead. +func (*ValidatePurchaseFacebookInstantRequest) Descriptor() ([]byte, []int) { + return file_api_proto_rawDescGZIP(), []int{98} +} + +func (x *ValidatePurchaseFacebookInstantRequest) GetSignedRequest() string { + if x != nil { + return x.SignedRequest + } + return "" +} + +func (x *ValidatePurchaseFacebookInstantRequest) GetPersist() *wrapperspb.BoolValue { + if x != nil { + return x.Persist + } + return nil +} + // Validated Purchase stored by Nakama. type ValidatedPurchase struct { state protoimpl.MessageState @@ -7543,7 +7605,7 @@ type ValidatedPurchase struct { func (x *ValidatedPurchase) Reset() { *x = ValidatedPurchase{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[98] + mi := &file_api_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7556,7 +7618,7 @@ func (x *ValidatedPurchase) String() string { func (*ValidatedPurchase) ProtoMessage() {} func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[98] + mi := &file_api_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7569,7 +7631,7 @@ func (x *ValidatedPurchase) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedPurchase.ProtoReflect.Descriptor instead. func (*ValidatedPurchase) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{98} + return file_api_proto_rawDescGZIP(), []int{99} } func (x *ValidatedPurchase) GetUserId() string { @@ -7662,7 +7724,7 @@ type ValidatePurchaseResponse struct { func (x *ValidatePurchaseResponse) Reset() { *x = ValidatePurchaseResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[99] + mi := &file_api_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7675,7 +7737,7 @@ func (x *ValidatePurchaseResponse) String() string { func (*ValidatePurchaseResponse) ProtoMessage() {} func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[99] + mi := &file_api_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7688,7 +7750,7 @@ func (x *ValidatePurchaseResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatePurchaseResponse.ProtoReflect.Descriptor instead. func (*ValidatePurchaseResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{99} + return file_api_proto_rawDescGZIP(), []int{100} } func (x *ValidatePurchaseResponse) GetValidatedPurchases() []*ValidatedPurchase { @@ -7710,7 +7772,7 @@ type ValidateSubscriptionResponse struct { func (x *ValidateSubscriptionResponse) Reset() { *x = ValidateSubscriptionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[100] + mi := &file_api_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7723,7 +7785,7 @@ func (x *ValidateSubscriptionResponse) String() string { func (*ValidateSubscriptionResponse) ProtoMessage() {} func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[100] + mi := &file_api_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7736,7 +7798,7 @@ func (x *ValidateSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateSubscriptionResponse.ProtoReflect.Descriptor instead. func (*ValidateSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{100} + return file_api_proto_rawDescGZIP(), []int{101} } func (x *ValidateSubscriptionResponse) GetValidatedSubscription() *ValidatedSubscription { @@ -7782,7 +7844,7 @@ type ValidatedSubscription struct { func (x *ValidatedSubscription) Reset() { *x = ValidatedSubscription{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[101] + mi := &file_api_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7795,7 +7857,7 @@ func (x *ValidatedSubscription) String() string { func (*ValidatedSubscription) ProtoMessage() {} func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[101] + mi := &file_api_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7808,7 +7870,7 @@ func (x *ValidatedSubscription) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidatedSubscription.ProtoReflect.Descriptor instead. func (*ValidatedSubscription) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{101} + return file_api_proto_rawDescGZIP(), []int{102} } func (x *ValidatedSubscription) GetUserId() string { @@ -7919,7 +7981,7 @@ type PurchaseList struct { func (x *PurchaseList) Reset() { *x = PurchaseList{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[102] + mi := &file_api_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7932,7 +7994,7 @@ func (x *PurchaseList) String() string { func (*PurchaseList) ProtoMessage() {} func (x *PurchaseList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[102] + mi := &file_api_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7945,7 +8007,7 @@ func (x *PurchaseList) ProtoReflect() protoreflect.Message { // Deprecated: Use PurchaseList.ProtoReflect.Descriptor instead. func (*PurchaseList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{102} + return file_api_proto_rawDescGZIP(), []int{103} } func (x *PurchaseList) GetValidatedPurchases() []*ValidatedPurchase { @@ -7986,7 +8048,7 @@ type SubscriptionList struct { func (x *SubscriptionList) Reset() { *x = SubscriptionList{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[103] + mi := &file_api_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7999,7 +8061,7 @@ func (x *SubscriptionList) String() string { func (*SubscriptionList) ProtoMessage() {} func (x *SubscriptionList) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[103] + mi := &file_api_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8012,7 +8074,7 @@ func (x *SubscriptionList) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionList.ProtoReflect.Descriptor instead. func (*SubscriptionList) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{103} + return file_api_proto_rawDescGZIP(), []int{104} } func (x *SubscriptionList) GetValidatedSubscriptions() []*ValidatedSubscription { @@ -8051,7 +8113,7 @@ type WriteLeaderboardRecordRequest struct { func (x *WriteLeaderboardRecordRequest) Reset() { *x = WriteLeaderboardRecordRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[104] + mi := &file_api_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8064,7 +8126,7 @@ func (x *WriteLeaderboardRecordRequest) String() string { func (*WriteLeaderboardRecordRequest) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[104] + mi := &file_api_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8077,7 +8139,7 @@ func (x *WriteLeaderboardRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteLeaderboardRecordRequest.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{104} + return file_api_proto_rawDescGZIP(), []int{105} } func (x *WriteLeaderboardRecordRequest) GetLeaderboardId() string { @@ -8117,7 +8179,7 @@ type WriteStorageObject struct { func (x *WriteStorageObject) Reset() { *x = WriteStorageObject{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[105] + mi := &file_api_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8130,7 +8192,7 @@ func (x *WriteStorageObject) String() string { func (*WriteStorageObject) ProtoMessage() {} func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[105] + mi := &file_api_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8143,7 +8205,7 @@ func (x *WriteStorageObject) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObject.ProtoReflect.Descriptor instead. func (*WriteStorageObject) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{105} + return file_api_proto_rawDescGZIP(), []int{106} } func (x *WriteStorageObject) GetCollection() string { @@ -8201,7 +8263,7 @@ type WriteStorageObjectsRequest struct { func (x *WriteStorageObjectsRequest) Reset() { *x = WriteStorageObjectsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[106] + mi := &file_api_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8214,7 +8276,7 @@ func (x *WriteStorageObjectsRequest) String() string { func (*WriteStorageObjectsRequest) ProtoMessage() {} func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[106] + mi := &file_api_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8227,7 +8289,7 @@ func (x *WriteStorageObjectsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteStorageObjectsRequest.ProtoReflect.Descriptor instead. func (*WriteStorageObjectsRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{106} + return file_api_proto_rawDescGZIP(), []int{107} } func (x *WriteStorageObjectsRequest) GetObjects() []*WriteStorageObject { @@ -8252,7 +8314,7 @@ type WriteTournamentRecordRequest struct { func (x *WriteTournamentRecordRequest) Reset() { *x = WriteTournamentRecordRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[107] + mi := &file_api_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8265,7 +8327,7 @@ func (x *WriteTournamentRecordRequest) String() string { func (*WriteTournamentRecordRequest) ProtoMessage() {} func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[107] + mi := &file_api_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8278,7 +8340,7 @@ func (x *WriteTournamentRecordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteTournamentRecordRequest.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{107} + return file_api_proto_rawDescGZIP(), []int{108} } func (x *WriteTournamentRecordRequest) GetTournamentId() string { @@ -8310,7 +8372,7 @@ type GroupUserList_GroupUser struct { func (x *GroupUserList_GroupUser) Reset() { *x = GroupUserList_GroupUser{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[120] + mi := &file_api_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8323,7 +8385,7 @@ func (x *GroupUserList_GroupUser) String() string { func (*GroupUserList_GroupUser) ProtoMessage() {} func (x *GroupUserList_GroupUser) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[120] + mi := &file_api_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8368,7 +8430,7 @@ type UserGroupList_UserGroup struct { func (x *UserGroupList_UserGroup) Reset() { *x = UserGroupList_UserGroup{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[121] + mi := &file_api_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8381,7 +8443,7 @@ func (x *UserGroupList_UserGroup) String() string { func (*UserGroupList_UserGroup) ProtoMessage() {} func (x *UserGroupList_UserGroup) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[121] + mi := &file_api_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8430,7 +8492,7 @@ type WriteLeaderboardRecordRequest_LeaderboardRecordWrite struct { func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Reset() { *x = WriteLeaderboardRecordRequest_LeaderboardRecordWrite{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[122] + mi := &file_api_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8443,7 +8505,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) String() string { func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoMessage() {} func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[122] + mi := &file_api_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8456,7 +8518,7 @@ func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) ProtoReflect() pr // Deprecated: Use WriteLeaderboardRecordRequest_LeaderboardRecordWrite.ProtoReflect.Descriptor instead. func (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{104, 0} + return file_api_proto_rawDescGZIP(), []int{105, 0} } func (x *WriteLeaderboardRecordRequest_LeaderboardRecordWrite) GetScore() int64 { @@ -8506,7 +8568,7 @@ type WriteTournamentRecordRequest_TournamentRecordWrite struct { func (x *WriteTournamentRecordRequest_TournamentRecordWrite) Reset() { *x = WriteTournamentRecordRequest_TournamentRecordWrite{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_msgTypes[123] + mi := &file_api_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8519,7 +8581,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) String() string { func (*WriteTournamentRecordRequest_TournamentRecordWrite) ProtoMessage() {} func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_msgTypes[123] + mi := &file_api_proto_msgTypes[124] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8532,7 +8594,7 @@ func (x *WriteTournamentRecordRequest_TournamentRecordWrite) ProtoReflect() prot // Deprecated: Use WriteTournamentRecordRequest_TournamentRecordWrite.ProtoReflect.Descriptor instead. func (*WriteTournamentRecordRequest_TournamentRecordWrite) Descriptor() ([]byte, []int) { - return file_api_proto_rawDescGZIP(), []int{107, 0} + return file_api_proto_rawDescGZIP(), []int{108, 0} } func (x *WriteTournamentRecordRequest_TournamentRecordWrite) GetScore() int64 { @@ -9653,201 +9715,211 @@ var file_api_proto_rawDesc = []byte{ 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x22, 0xa9, 0x04, 0x0a, 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x75, - 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x70, - 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x65, 0x6e, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x65, 0x65, 0x6e, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, - 0x22, 0x6a, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, - 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x13, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, - 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x22, 0x78, 0x0a, 0x1c, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x16, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, - 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa7, 0x05, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x73, 0x69, 0x73, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x26, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x46, 0x61, 0x63, 0x65, 0x62, 0x6f, 0x6f, + 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x25, 0x0a, 0x0e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x22, 0xa9, 0x04, 0x0a, + 0x11, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, + 0x73, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0b, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x66, - 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x75, - 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x22, 0x97, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x4e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, - 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, 0x76, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, + 0x0b, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, + 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, + 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x65, 0x65, 0x6e, 0x5f, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x65, + 0x65, 0x6e, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x22, 0x6a, 0x0a, 0x18, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, - 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, - 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xa7, 0x01, 0x0a, 0x10, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x5a, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x22, 0xbb, 0x02, 0x0a, 0x1d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x58, 0x0a, - 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, - 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x98, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, 0x73, - 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x22, 0x84, 0x02, 0x0a, 0x12, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0f, 0x70, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, - 0x64, 0x12, 0x46, 0x0a, 0x10, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, - 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x22, 0x56, 0x0a, 0x1a, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, - 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x1c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x56, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, + 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, 0x63, 0x68, + 0x61, 0x73, 0x65, 0x73, 0x22, 0x78, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x15, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa7, + 0x05, 0x0a, 0x15, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x49, 0x64, + 0x12, 0x36, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x70, 0x75, 0x72, + 0x63, 0x68, 0x61, 0x73, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x70, 0x75, + 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6e, 0x61, 0x6b, 0x61, + 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x75, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2b, + 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x15, 0x70, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x72, + 0x63, 0x68, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x4e, 0x0a, 0x13, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x50, 0x75, 0x72, + 0x63, 0x68, 0x61, 0x73, 0x65, 0x52, 0x12, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x50, 0x75, 0x72, 0x63, 0x68, 0x61, 0x73, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, + 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, + 0x6f, 0x72, 0x22, 0xa7, 0x01, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x16, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, + 0x72, 0x65, 0x76, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x70, 0x72, 0x65, 0x76, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xbb, 0x02, 0x0a, + 0x1d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, + 0x0a, 0x0e, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x49, 0x64, 0x12, 0x58, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, - 0x97, 0x01, 0x0a, 0x15, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, - 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, - 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x2a, 0x53, 0x0a, 0x0d, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x50, - 0x50, 0x4c, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x00, 0x12, - 0x15, 0x0a, 0x11, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x5f, 0x53, - 0x54, 0x4f, 0x52, 0x45, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x48, 0x55, 0x41, 0x57, 0x45, 0x49, - 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x47, 0x41, 0x4c, 0x4c, 0x45, 0x52, 0x59, 0x10, 0x02, 0x2a, 0x3c, - 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x0b, 0x0a, 0x07, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, - 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x2a, 0x4c, 0x0a, 0x08, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, 0x4e, 0x4f, 0x5f, 0x4f, - 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x42, 0x45, 0x53, - 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x44, - 0x45, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x42, 0x63, 0x0a, 0x19, 0x63, 0x6f, - 0x6d, 0x2e, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2e, 0x6e, 0x61, 0x6b, - 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x09, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x41, - 0x70, 0x69, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6e, 0x61, 0x6b, 0x61, - 0x6d, 0x61, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x70, 0x69, 0xaa, 0x02, 0x0f, - 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x98, 0x01, 0x0a, 0x16, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x84, 0x02, 0x0a, 0x12, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x12, 0x46, 0x0a, 0x10, 0x70, 0x65, 0x72, + 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x0f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x22, 0x56, 0x0a, 0x1a, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x1c, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, + 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x56, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x3e, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, + 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x97, 0x01, 0x0a, 0x15, 0x54, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x30, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x14, 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x2a, 0x6f, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x13, 0x0a, 0x0f, 0x41, 0x50, 0x50, 0x4c, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x5f, + 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x47, 0x4f, 0x4f, 0x47, 0x4c, + 0x45, 0x5f, 0x50, 0x4c, 0x41, 0x59, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0x01, 0x12, 0x16, + 0x0a, 0x12, 0x48, 0x55, 0x41, 0x57, 0x45, 0x49, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x47, 0x41, 0x4c, + 0x4c, 0x45, 0x52, 0x59, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x46, 0x41, 0x43, 0x45, 0x42, 0x4f, + 0x4f, 0x4b, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x45, + 0x10, 0x03, 0x2a, 0x3c, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x01, + 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, + 0x2a, 0x4c, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0f, 0x0a, 0x0b, + 0x4e, 0x4f, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x52, 0x49, 0x44, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, + 0x04, 0x42, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x45, 0x54, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x44, 0x45, 0x43, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x42, 0x63, + 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, + 0x2e, 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x42, 0x09, 0x4e, 0x61, 0x6b, + 0x61, 0x6d, 0x61, 0x41, 0x70, 0x69, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x68, 0x65, 0x72, 0x6f, 0x69, 0x63, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x6e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x61, 0x70, + 0x69, 0xaa, 0x02, 0x0f, 0x4e, 0x61, 0x6b, 0x61, 0x6d, 0x61, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -9863,7 +9935,7 @@ func file_api_proto_rawDescGZIP() []byte { } var file_api_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 124) +var file_api_proto_msgTypes = make([]protoimpl.MessageInfo, 125) var file_api_proto_goTypes = []interface{}{ (StoreProvider)(0), // 0: nakama.api.StoreProvider (StoreEnvironment)(0), // 1: nakama.api.StoreEnvironment @@ -9969,214 +10041,216 @@ var file_api_proto_goTypes = []interface{}{ (*ValidatePurchaseGoogleRequest)(nil), // 101: nakama.api.ValidatePurchaseGoogleRequest (*ValidateSubscriptionGoogleRequest)(nil), // 102: nakama.api.ValidateSubscriptionGoogleRequest (*ValidatePurchaseHuaweiRequest)(nil), // 103: nakama.api.ValidatePurchaseHuaweiRequest - (*ValidatedPurchase)(nil), // 104: nakama.api.ValidatedPurchase - (*ValidatePurchaseResponse)(nil), // 105: nakama.api.ValidatePurchaseResponse - (*ValidateSubscriptionResponse)(nil), // 106: nakama.api.ValidateSubscriptionResponse - (*ValidatedSubscription)(nil), // 107: nakama.api.ValidatedSubscription - (*PurchaseList)(nil), // 108: nakama.api.PurchaseList - (*SubscriptionList)(nil), // 109: nakama.api.SubscriptionList - (*WriteLeaderboardRecordRequest)(nil), // 110: nakama.api.WriteLeaderboardRecordRequest - (*WriteStorageObject)(nil), // 111: nakama.api.WriteStorageObject - (*WriteStorageObjectsRequest)(nil), // 112: nakama.api.WriteStorageObjectsRequest - (*WriteTournamentRecordRequest)(nil), // 113: nakama.api.WriteTournamentRecordRequest - nil, // 114: nakama.api.AccountRefresh.VarsEntry - nil, // 115: nakama.api.AccountApple.VarsEntry - nil, // 116: nakama.api.AccountCustom.VarsEntry - nil, // 117: nakama.api.AccountDevice.VarsEntry - nil, // 118: nakama.api.AccountEmail.VarsEntry - nil, // 119: nakama.api.AccountFacebook.VarsEntry - nil, // 120: nakama.api.AccountFacebookInstantGame.VarsEntry - nil, // 121: nakama.api.AccountGameCenter.VarsEntry - nil, // 122: nakama.api.AccountGoogle.VarsEntry - nil, // 123: nakama.api.AccountSteam.VarsEntry - nil, // 124: nakama.api.SessionRefreshRequest.VarsEntry - nil, // 125: nakama.api.Event.PropertiesEntry - (*GroupUserList_GroupUser)(nil), // 126: nakama.api.GroupUserList.GroupUser - (*UserGroupList_UserGroup)(nil), // 127: nakama.api.UserGroupList.UserGroup - (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 128: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 129: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - (*timestamppb.Timestamp)(nil), // 130: google.protobuf.Timestamp - (*wrapperspb.BoolValue)(nil), // 131: google.protobuf.BoolValue - (*wrapperspb.Int32Value)(nil), // 132: google.protobuf.Int32Value - (*wrapperspb.StringValue)(nil), // 133: google.protobuf.StringValue - (*wrapperspb.UInt32Value)(nil), // 134: google.protobuf.UInt32Value - (*wrapperspb.Int64Value)(nil), // 135: google.protobuf.Int64Value + (*ValidatePurchaseFacebookInstantRequest)(nil), // 104: nakama.api.ValidatePurchaseFacebookInstantRequest + (*ValidatedPurchase)(nil), // 105: nakama.api.ValidatedPurchase + (*ValidatePurchaseResponse)(nil), // 106: nakama.api.ValidatePurchaseResponse + (*ValidateSubscriptionResponse)(nil), // 107: nakama.api.ValidateSubscriptionResponse + (*ValidatedSubscription)(nil), // 108: nakama.api.ValidatedSubscription + (*PurchaseList)(nil), // 109: nakama.api.PurchaseList + (*SubscriptionList)(nil), // 110: nakama.api.SubscriptionList + (*WriteLeaderboardRecordRequest)(nil), // 111: nakama.api.WriteLeaderboardRecordRequest + (*WriteStorageObject)(nil), // 112: nakama.api.WriteStorageObject + (*WriteStorageObjectsRequest)(nil), // 113: nakama.api.WriteStorageObjectsRequest + (*WriteTournamentRecordRequest)(nil), // 114: nakama.api.WriteTournamentRecordRequest + nil, // 115: nakama.api.AccountRefresh.VarsEntry + nil, // 116: nakama.api.AccountApple.VarsEntry + nil, // 117: nakama.api.AccountCustom.VarsEntry + nil, // 118: nakama.api.AccountDevice.VarsEntry + nil, // 119: nakama.api.AccountEmail.VarsEntry + nil, // 120: nakama.api.AccountFacebook.VarsEntry + nil, // 121: nakama.api.AccountFacebookInstantGame.VarsEntry + nil, // 122: nakama.api.AccountGameCenter.VarsEntry + nil, // 123: nakama.api.AccountGoogle.VarsEntry + nil, // 124: nakama.api.AccountSteam.VarsEntry + nil, // 125: nakama.api.SessionRefreshRequest.VarsEntry + nil, // 126: nakama.api.Event.PropertiesEntry + (*GroupUserList_GroupUser)(nil), // 127: nakama.api.GroupUserList.GroupUser + (*UserGroupList_UserGroup)(nil), // 128: nakama.api.UserGroupList.UserGroup + (*WriteLeaderboardRecordRequest_LeaderboardRecordWrite)(nil), // 129: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + (*WriteTournamentRecordRequest_TournamentRecordWrite)(nil), // 130: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + (*timestamppb.Timestamp)(nil), // 131: google.protobuf.Timestamp + (*wrapperspb.BoolValue)(nil), // 132: google.protobuf.BoolValue + (*wrapperspb.Int32Value)(nil), // 133: google.protobuf.Int32Value + (*wrapperspb.StringValue)(nil), // 134: google.protobuf.StringValue + (*wrapperspb.UInt32Value)(nil), // 135: google.protobuf.UInt32Value + (*wrapperspb.Int64Value)(nil), // 136: google.protobuf.Int64Value } var file_api_proto_depIdxs = []int32{ 96, // 0: nakama.api.Account.user:type_name -> nakama.api.User 10, // 1: nakama.api.Account.devices:type_name -> nakama.api.AccountDevice - 130, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp - 130, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp - 114, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry - 115, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry - 116, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry - 117, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry - 118, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry - 119, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry - 120, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry - 121, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry - 122, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry - 123, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry - 124, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry + 131, // 2: nakama.api.Account.verify_time:type_name -> google.protobuf.Timestamp + 131, // 3: nakama.api.Account.disable_time:type_name -> google.protobuf.Timestamp + 115, // 4: nakama.api.AccountRefresh.vars:type_name -> nakama.api.AccountRefresh.VarsEntry + 116, // 5: nakama.api.AccountApple.vars:type_name -> nakama.api.AccountApple.VarsEntry + 117, // 6: nakama.api.AccountCustom.vars:type_name -> nakama.api.AccountCustom.VarsEntry + 118, // 7: nakama.api.AccountDevice.vars:type_name -> nakama.api.AccountDevice.VarsEntry + 119, // 8: nakama.api.AccountEmail.vars:type_name -> nakama.api.AccountEmail.VarsEntry + 120, // 9: nakama.api.AccountFacebook.vars:type_name -> nakama.api.AccountFacebook.VarsEntry + 121, // 10: nakama.api.AccountFacebookInstantGame.vars:type_name -> nakama.api.AccountFacebookInstantGame.VarsEntry + 122, // 11: nakama.api.AccountGameCenter.vars:type_name -> nakama.api.AccountGameCenter.VarsEntry + 123, // 12: nakama.api.AccountGoogle.vars:type_name -> nakama.api.AccountGoogle.VarsEntry + 124, // 13: nakama.api.AccountSteam.vars:type_name -> nakama.api.AccountSteam.VarsEntry + 125, // 14: nakama.api.SessionRefreshRequest.vars:type_name -> nakama.api.SessionRefreshRequest.VarsEntry 8, // 15: nakama.api.AuthenticateAppleRequest.account:type_name -> nakama.api.AccountApple - 131, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue + 132, // 16: nakama.api.AuthenticateAppleRequest.create:type_name -> google.protobuf.BoolValue 9, // 17: nakama.api.AuthenticateCustomRequest.account:type_name -> nakama.api.AccountCustom - 131, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue + 132, // 18: nakama.api.AuthenticateCustomRequest.create:type_name -> google.protobuf.BoolValue 10, // 19: nakama.api.AuthenticateDeviceRequest.account:type_name -> nakama.api.AccountDevice - 131, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue + 132, // 20: nakama.api.AuthenticateDeviceRequest.create:type_name -> google.protobuf.BoolValue 11, // 21: nakama.api.AuthenticateEmailRequest.account:type_name -> nakama.api.AccountEmail - 131, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue + 132, // 22: nakama.api.AuthenticateEmailRequest.create:type_name -> google.protobuf.BoolValue 12, // 23: nakama.api.AuthenticateFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 131, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue - 131, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 132, // 24: nakama.api.AuthenticateFacebookRequest.create:type_name -> google.protobuf.BoolValue + 132, // 25: nakama.api.AuthenticateFacebookRequest.sync:type_name -> google.protobuf.BoolValue 13, // 26: nakama.api.AuthenticateFacebookInstantGameRequest.account:type_name -> nakama.api.AccountFacebookInstantGame - 131, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue + 132, // 27: nakama.api.AuthenticateFacebookInstantGameRequest.create:type_name -> google.protobuf.BoolValue 14, // 28: nakama.api.AuthenticateGameCenterRequest.account:type_name -> nakama.api.AccountGameCenter - 131, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue + 132, // 29: nakama.api.AuthenticateGameCenterRequest.create:type_name -> google.protobuf.BoolValue 15, // 30: nakama.api.AuthenticateGoogleRequest.account:type_name -> nakama.api.AccountGoogle - 131, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue + 132, // 31: nakama.api.AuthenticateGoogleRequest.create:type_name -> google.protobuf.BoolValue 16, // 32: nakama.api.AuthenticateSteamRequest.account:type_name -> nakama.api.AccountSteam - 131, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue - 131, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue - 132, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value - 130, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp - 130, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp - 131, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue + 132, // 33: nakama.api.AuthenticateSteamRequest.create:type_name -> google.protobuf.BoolValue + 132, // 34: nakama.api.AuthenticateSteamRequest.sync:type_name -> google.protobuf.BoolValue + 133, // 35: nakama.api.ChannelMessage.code:type_name -> google.protobuf.Int32Value + 131, // 36: nakama.api.ChannelMessage.create_time:type_name -> google.protobuf.Timestamp + 131, // 37: nakama.api.ChannelMessage.update_time:type_name -> google.protobuf.Timestamp + 132, // 38: nakama.api.ChannelMessage.persistent:type_name -> google.protobuf.BoolValue 32, // 39: nakama.api.ChannelMessageList.messages:type_name -> nakama.api.ChannelMessage 40, // 40: nakama.api.DeleteStorageObjectsRequest.object_ids:type_name -> nakama.api.DeleteStorageObjectId - 125, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry - 130, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp + 126, // 41: nakama.api.Event.properties:type_name -> nakama.api.Event.PropertiesEntry + 131, // 42: nakama.api.Event.timestamp:type_name -> google.protobuf.Timestamp 96, // 43: nakama.api.Friend.user:type_name -> nakama.api.User - 132, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value - 130, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp + 133, // 44: nakama.api.Friend.state:type_name -> google.protobuf.Int32Value + 131, // 45: nakama.api.Friend.update_time:type_name -> google.protobuf.Timestamp 43, // 46: nakama.api.FriendList.friends:type_name -> nakama.api.Friend - 131, // 47: nakama.api.Group.open:type_name -> google.protobuf.BoolValue - 130, // 48: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp - 130, // 49: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp + 132, // 47: nakama.api.Group.open:type_name -> google.protobuf.BoolValue + 131, // 48: nakama.api.Group.create_time:type_name -> google.protobuf.Timestamp + 131, // 49: nakama.api.Group.update_time:type_name -> google.protobuf.Timestamp 47, // 50: nakama.api.GroupList.groups:type_name -> nakama.api.Group - 126, // 51: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser + 127, // 51: nakama.api.GroupUserList.group_users:type_name -> nakama.api.GroupUserList.GroupUser 12, // 52: nakama.api.ImportFacebookFriendsRequest.account:type_name -> nakama.api.AccountFacebook - 131, // 53: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 132, // 53: nakama.api.ImportFacebookFriendsRequest.reset:type_name -> google.protobuf.BoolValue 16, // 54: nakama.api.ImportSteamFriendsRequest.account:type_name -> nakama.api.AccountSteam - 131, // 55: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue + 132, // 55: nakama.api.ImportSteamFriendsRequest.reset:type_name -> google.protobuf.BoolValue 2, // 56: nakama.api.Leaderboard.operator:type_name -> nakama.api.Operator - 130, // 57: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp + 131, // 57: nakama.api.Leaderboard.create_time:type_name -> google.protobuf.Timestamp 55, // 58: nakama.api.LeaderboardList.leaderboards:type_name -> nakama.api.Leaderboard - 133, // 59: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue - 130, // 60: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp - 130, // 61: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp - 130, // 62: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp + 134, // 59: nakama.api.LeaderboardRecord.username:type_name -> google.protobuf.StringValue + 131, // 60: nakama.api.LeaderboardRecord.create_time:type_name -> google.protobuf.Timestamp + 131, // 61: nakama.api.LeaderboardRecord.update_time:type_name -> google.protobuf.Timestamp + 131, // 62: nakama.api.LeaderboardRecord.expiry_time:type_name -> google.protobuf.Timestamp 57, // 63: nakama.api.LeaderboardRecordList.records:type_name -> nakama.api.LeaderboardRecord 57, // 64: nakama.api.LeaderboardRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord 12, // 65: nakama.api.LinkFacebookRequest.account:type_name -> nakama.api.AccountFacebook - 131, // 66: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue + 132, // 66: nakama.api.LinkFacebookRequest.sync:type_name -> google.protobuf.BoolValue 16, // 67: nakama.api.LinkSteamRequest.account:type_name -> nakama.api.AccountSteam - 131, // 68: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue - 132, // 69: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value - 131, // 70: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue - 132, // 71: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value - 132, // 72: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value - 132, // 73: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 132, // 74: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value - 131, // 75: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue - 132, // 76: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value - 132, // 77: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value - 134, // 78: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 135, // 79: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 132, // 80: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 135, // 81: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 132, // 82: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value - 131, // 83: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue - 133, // 84: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue - 132, // 85: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value - 132, // 86: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value - 133, // 87: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue - 132, // 88: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value - 132, // 89: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value - 132, // 90: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value - 134, // 91: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value - 135, // 92: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value - 132, // 93: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value - 135, // 94: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value - 134, // 95: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value - 134, // 96: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value - 134, // 97: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value - 134, // 98: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value - 132, // 99: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value - 132, // 100: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value - 132, // 101: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value - 133, // 102: nakama.api.Match.label:type_name -> google.protobuf.StringValue + 132, // 68: nakama.api.LinkSteamRequest.sync:type_name -> google.protobuf.BoolValue + 133, // 69: nakama.api.ListChannelMessagesRequest.limit:type_name -> google.protobuf.Int32Value + 132, // 70: nakama.api.ListChannelMessagesRequest.forward:type_name -> google.protobuf.BoolValue + 133, // 71: nakama.api.ListFriendsRequest.limit:type_name -> google.protobuf.Int32Value + 133, // 72: nakama.api.ListFriendsRequest.state:type_name -> google.protobuf.Int32Value + 133, // 73: nakama.api.ListGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 133, // 74: nakama.api.ListGroupsRequest.members:type_name -> google.protobuf.Int32Value + 132, // 75: nakama.api.ListGroupsRequest.open:type_name -> google.protobuf.BoolValue + 133, // 76: nakama.api.ListGroupUsersRequest.limit:type_name -> google.protobuf.Int32Value + 133, // 77: nakama.api.ListGroupUsersRequest.state:type_name -> google.protobuf.Int32Value + 135, // 78: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 136, // 79: nakama.api.ListLeaderboardRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 133, // 80: nakama.api.ListLeaderboardRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 136, // 81: nakama.api.ListLeaderboardRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 133, // 82: nakama.api.ListMatchesRequest.limit:type_name -> google.protobuf.Int32Value + 132, // 83: nakama.api.ListMatchesRequest.authoritative:type_name -> google.protobuf.BoolValue + 134, // 84: nakama.api.ListMatchesRequest.label:type_name -> google.protobuf.StringValue + 133, // 85: nakama.api.ListMatchesRequest.min_size:type_name -> google.protobuf.Int32Value + 133, // 86: nakama.api.ListMatchesRequest.max_size:type_name -> google.protobuf.Int32Value + 134, // 87: nakama.api.ListMatchesRequest.query:type_name -> google.protobuf.StringValue + 133, // 88: nakama.api.ListNotificationsRequest.limit:type_name -> google.protobuf.Int32Value + 133, // 89: nakama.api.ListStorageObjectsRequest.limit:type_name -> google.protobuf.Int32Value + 133, // 90: nakama.api.ListSubscriptionsRequest.limit:type_name -> google.protobuf.Int32Value + 135, // 91: nakama.api.ListTournamentRecordsAroundOwnerRequest.limit:type_name -> google.protobuf.UInt32Value + 136, // 92: nakama.api.ListTournamentRecordsAroundOwnerRequest.expiry:type_name -> google.protobuf.Int64Value + 133, // 93: nakama.api.ListTournamentRecordsRequest.limit:type_name -> google.protobuf.Int32Value + 136, // 94: nakama.api.ListTournamentRecordsRequest.expiry:type_name -> google.protobuf.Int64Value + 135, // 95: nakama.api.ListTournamentsRequest.category_start:type_name -> google.protobuf.UInt32Value + 135, // 96: nakama.api.ListTournamentsRequest.category_end:type_name -> google.protobuf.UInt32Value + 135, // 97: nakama.api.ListTournamentsRequest.start_time:type_name -> google.protobuf.UInt32Value + 135, // 98: nakama.api.ListTournamentsRequest.end_time:type_name -> google.protobuf.UInt32Value + 133, // 99: nakama.api.ListTournamentsRequest.limit:type_name -> google.protobuf.Int32Value + 133, // 100: nakama.api.ListUserGroupsRequest.limit:type_name -> google.protobuf.Int32Value + 133, // 101: nakama.api.ListUserGroupsRequest.state:type_name -> google.protobuf.Int32Value + 134, // 102: nakama.api.Match.label:type_name -> google.protobuf.StringValue 76, // 103: nakama.api.MatchList.matches:type_name -> nakama.api.Match - 130, // 104: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp + 131, // 104: nakama.api.Notification.create_time:type_name -> google.protobuf.Timestamp 78, // 105: nakama.api.NotificationList.notifications:type_name -> nakama.api.Notification 82, // 106: nakama.api.ReadStorageObjectsRequest.object_ids:type_name -> nakama.api.ReadStorageObjectId - 130, // 107: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp - 130, // 108: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp - 130, // 109: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp - 130, // 110: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp + 131, // 107: nakama.api.StorageObject.create_time:type_name -> google.protobuf.Timestamp + 131, // 108: nakama.api.StorageObject.update_time:type_name -> google.protobuf.Timestamp + 131, // 109: nakama.api.StorageObjectAck.create_time:type_name -> google.protobuf.Timestamp + 131, // 110: nakama.api.StorageObjectAck.update_time:type_name -> google.protobuf.Timestamp 87, // 111: nakama.api.StorageObjectAcks.acks:type_name -> nakama.api.StorageObjectAck 86, // 112: nakama.api.StorageObjects.objects:type_name -> nakama.api.StorageObject 86, // 113: nakama.api.StorageObjectList.objects:type_name -> nakama.api.StorageObject - 130, // 114: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp - 130, // 115: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp - 130, // 116: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp + 131, // 114: nakama.api.Tournament.create_time:type_name -> google.protobuf.Timestamp + 131, // 115: nakama.api.Tournament.start_time:type_name -> google.protobuf.Timestamp + 131, // 116: nakama.api.Tournament.end_time:type_name -> google.protobuf.Timestamp 2, // 117: nakama.api.Tournament.operator:type_name -> nakama.api.Operator 91, // 118: nakama.api.TournamentList.tournaments:type_name -> nakama.api.Tournament 57, // 119: nakama.api.TournamentRecordList.records:type_name -> nakama.api.LeaderboardRecord 57, // 120: nakama.api.TournamentRecordList.owner_records:type_name -> nakama.api.LeaderboardRecord - 133, // 121: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue - 133, // 122: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue - 133, // 123: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue - 133, // 124: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue - 133, // 125: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue - 133, // 126: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue - 133, // 127: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue - 133, // 128: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue - 133, // 129: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue - 133, // 130: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue - 131, // 131: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue - 130, // 132: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp - 130, // 133: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp - 127, // 134: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup + 134, // 121: nakama.api.UpdateAccountRequest.username:type_name -> google.protobuf.StringValue + 134, // 122: nakama.api.UpdateAccountRequest.display_name:type_name -> google.protobuf.StringValue + 134, // 123: nakama.api.UpdateAccountRequest.avatar_url:type_name -> google.protobuf.StringValue + 134, // 124: nakama.api.UpdateAccountRequest.lang_tag:type_name -> google.protobuf.StringValue + 134, // 125: nakama.api.UpdateAccountRequest.location:type_name -> google.protobuf.StringValue + 134, // 126: nakama.api.UpdateAccountRequest.timezone:type_name -> google.protobuf.StringValue + 134, // 127: nakama.api.UpdateGroupRequest.name:type_name -> google.protobuf.StringValue + 134, // 128: nakama.api.UpdateGroupRequest.description:type_name -> google.protobuf.StringValue + 134, // 129: nakama.api.UpdateGroupRequest.lang_tag:type_name -> google.protobuf.StringValue + 134, // 130: nakama.api.UpdateGroupRequest.avatar_url:type_name -> google.protobuf.StringValue + 132, // 131: nakama.api.UpdateGroupRequest.open:type_name -> google.protobuf.BoolValue + 131, // 132: nakama.api.User.create_time:type_name -> google.protobuf.Timestamp + 131, // 133: nakama.api.User.update_time:type_name -> google.protobuf.Timestamp + 128, // 134: nakama.api.UserGroupList.user_groups:type_name -> nakama.api.UserGroupList.UserGroup 96, // 135: nakama.api.Users.users:type_name -> nakama.api.User - 131, // 136: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue - 131, // 137: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue - 131, // 138: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 131, // 139: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue - 131, // 140: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue - 0, // 141: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider - 130, // 142: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp - 130, // 143: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp - 130, // 144: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp - 130, // 145: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp - 1, // 146: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment - 104, // 147: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 107, // 148: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription - 0, // 149: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider - 130, // 150: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp - 130, // 151: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp - 130, // 152: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp - 1, // 153: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment - 130, // 154: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp - 130, // 155: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp - 104, // 156: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase - 107, // 157: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription - 128, // 158: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite - 132, // 159: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value - 132, // 160: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value - 111, // 161: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject - 129, // 162: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite - 96, // 163: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User - 132, // 164: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value - 47, // 165: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group - 132, // 166: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value - 2, // 167: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator - 2, // 168: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator - 169, // [169:169] is the sub-list for method output_type - 169, // [169:169] is the sub-list for method input_type - 169, // [169:169] is the sub-list for extension type_name - 169, // [169:169] is the sub-list for extension extendee - 0, // [0:169] is the sub-list for field type_name + 132, // 136: nakama.api.ValidatePurchaseAppleRequest.persist:type_name -> google.protobuf.BoolValue + 132, // 137: nakama.api.ValidateSubscriptionAppleRequest.persist:type_name -> google.protobuf.BoolValue + 132, // 138: nakama.api.ValidatePurchaseGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 132, // 139: nakama.api.ValidateSubscriptionGoogleRequest.persist:type_name -> google.protobuf.BoolValue + 132, // 140: nakama.api.ValidatePurchaseHuaweiRequest.persist:type_name -> google.protobuf.BoolValue + 132, // 141: nakama.api.ValidatePurchaseFacebookInstantRequest.persist:type_name -> google.protobuf.BoolValue + 0, // 142: nakama.api.ValidatedPurchase.store:type_name -> nakama.api.StoreProvider + 131, // 143: nakama.api.ValidatedPurchase.purchase_time:type_name -> google.protobuf.Timestamp + 131, // 144: nakama.api.ValidatedPurchase.create_time:type_name -> google.protobuf.Timestamp + 131, // 145: nakama.api.ValidatedPurchase.update_time:type_name -> google.protobuf.Timestamp + 131, // 146: nakama.api.ValidatedPurchase.refund_time:type_name -> google.protobuf.Timestamp + 1, // 147: nakama.api.ValidatedPurchase.environment:type_name -> nakama.api.StoreEnvironment + 105, // 148: nakama.api.ValidatePurchaseResponse.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 108, // 149: nakama.api.ValidateSubscriptionResponse.validated_subscription:type_name -> nakama.api.ValidatedSubscription + 0, // 150: nakama.api.ValidatedSubscription.store:type_name -> nakama.api.StoreProvider + 131, // 151: nakama.api.ValidatedSubscription.purchase_time:type_name -> google.protobuf.Timestamp + 131, // 152: nakama.api.ValidatedSubscription.create_time:type_name -> google.protobuf.Timestamp + 131, // 153: nakama.api.ValidatedSubscription.update_time:type_name -> google.protobuf.Timestamp + 1, // 154: nakama.api.ValidatedSubscription.environment:type_name -> nakama.api.StoreEnvironment + 131, // 155: nakama.api.ValidatedSubscription.expiry_time:type_name -> google.protobuf.Timestamp + 131, // 156: nakama.api.ValidatedSubscription.refund_time:type_name -> google.protobuf.Timestamp + 105, // 157: nakama.api.PurchaseList.validated_purchases:type_name -> nakama.api.ValidatedPurchase + 108, // 158: nakama.api.SubscriptionList.validated_subscriptions:type_name -> nakama.api.ValidatedSubscription + 129, // 159: nakama.api.WriteLeaderboardRecordRequest.record:type_name -> nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite + 133, // 160: nakama.api.WriteStorageObject.permission_read:type_name -> google.protobuf.Int32Value + 133, // 161: nakama.api.WriteStorageObject.permission_write:type_name -> google.protobuf.Int32Value + 112, // 162: nakama.api.WriteStorageObjectsRequest.objects:type_name -> nakama.api.WriteStorageObject + 130, // 163: nakama.api.WriteTournamentRecordRequest.record:type_name -> nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite + 96, // 164: nakama.api.GroupUserList.GroupUser.user:type_name -> nakama.api.User + 133, // 165: nakama.api.GroupUserList.GroupUser.state:type_name -> google.protobuf.Int32Value + 47, // 166: nakama.api.UserGroupList.UserGroup.group:type_name -> nakama.api.Group + 133, // 167: nakama.api.UserGroupList.UserGroup.state:type_name -> google.protobuf.Int32Value + 2, // 168: nakama.api.WriteLeaderboardRecordRequest.LeaderboardRecordWrite.operator:type_name -> nakama.api.Operator + 2, // 169: nakama.api.WriteTournamentRecordRequest.TournamentRecordWrite.operator:type_name -> nakama.api.Operator + 170, // [170:170] is the sub-list for method output_type + 170, // [170:170] is the sub-list for method input_type + 170, // [170:170] is the sub-list for extension type_name + 170, // [170:170] is the sub-list for extension extendee + 0, // [0:170] is the sub-list for field type_name } func init() { file_api_proto_init() } @@ -11362,7 +11436,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatedPurchase); i { + switch v := v.(*ValidatePurchaseFacebookInstantRequest); i { case 0: return &v.state case 1: @@ -11374,7 +11448,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatePurchaseResponse); i { + switch v := v.(*ValidatedPurchase); i { case 0: return &v.state case 1: @@ -11386,7 +11460,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateSubscriptionResponse); i { + switch v := v.(*ValidatePurchaseResponse); i { case 0: return &v.state case 1: @@ -11398,7 +11472,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidatedSubscription); i { + switch v := v.(*ValidateSubscriptionResponse); i { case 0: return &v.state case 1: @@ -11410,7 +11484,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PurchaseList); i { + switch v := v.(*ValidatedSubscription); i { case 0: return &v.state case 1: @@ -11422,7 +11496,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriptionList); i { + switch v := v.(*PurchaseList); i { case 0: return &v.state case 1: @@ -11434,7 +11508,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteLeaderboardRecordRequest); i { + switch v := v.(*SubscriptionList); i { case 0: return &v.state case 1: @@ -11446,7 +11520,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteStorageObject); i { + switch v := v.(*WriteLeaderboardRecordRequest); i { case 0: return &v.state case 1: @@ -11458,7 +11532,7 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteStorageObjectsRequest); i { + switch v := v.(*WriteStorageObject); i { case 0: return &v.state case 1: @@ -11470,6 +11544,18 @@ func file_api_proto_init() { } } file_api_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WriteStorageObjectsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WriteTournamentRecordRequest); i { case 0: return &v.state @@ -11481,7 +11567,7 @@ func file_api_proto_init() { return nil } } - file_api_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { + file_api_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GroupUserList_GroupUser); i { case 0: return &v.state @@ -11493,7 +11579,7 @@ func file_api_proto_init() { return nil } } - file_api_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { + file_api_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UserGroupList_UserGroup); i { case 0: return &v.state @@ -11505,7 +11591,7 @@ func file_api_proto_init() { return nil } } - file_api_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { + file_api_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WriteLeaderboardRecordRequest_LeaderboardRecordWrite); i { case 0: return &v.state @@ -11517,7 +11603,7 @@ func file_api_proto_init() { return nil } } - file_api_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { + file_api_proto_msgTypes[124].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WriteTournamentRecordRequest_TournamentRecordWrite); i { case 0: return &v.state @@ -11536,7 +11622,7 @@ func file_api_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_proto_rawDesc, NumEnums: 6, - NumMessages: 124, + NumMessages: 125, NumExtensions: 0, NumServices: 0, }, diff --git a/vendor/github.com/heroiclabs/nakama-common/api/api.proto b/vendor/github.com/heroiclabs/nakama-common/api/api.proto index 7c8996c02b..776bb50a1a 100644 --- a/vendor/github.com/heroiclabs/nakama-common/api/api.proto +++ b/vendor/github.com/heroiclabs/nakama-common/api/api.proto @@ -1190,6 +1190,14 @@ message ValidatePurchaseHuaweiRequest { google.protobuf.BoolValue persist = 3; } +// Facebook Instant IAP Purchase validation request +message ValidatePurchaseFacebookInstantRequest { + // Base64 encoded Facebook Instant signedRequest receipt data payload. + string signed_request = 1; + // Persist the purchase + google.protobuf.BoolValue persist = 2; +} + // Validated Purchase stored by Nakama. message ValidatedPurchase { // Purchase User ID. @@ -1235,6 +1243,8 @@ enum StoreProvider { GOOGLE_PLAY_STORE = 1; // Huawei App Gallery HUAWEI_APP_GALLERY = 2; + // Facebook Instant Store + FACEBOOK_INSTANT_STORE = 3; } // Environment where a purchase/subscription took place, diff --git a/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go b/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go index c960d5c15a..bb4bc72d2d 100644 --- a/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go +++ b/vendor/github.com/heroiclabs/nakama-common/rtapi/realtime.pb.go @@ -18,7 +18,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.24.2 +// protoc v4.24.4 // source: realtime.proto package rtapi diff --git a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go index 2130625d61..ba5ddbf262 100644 --- a/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go +++ b/vendor/github.com/heroiclabs/nakama-common/runtime/runtime.go @@ -756,6 +756,12 @@ type Initializer interface { // RegisterAfterValidatePurchaseHuawei can be used to perform additional logic after validating an Huawei App Gallery IAP receipt. RegisterAfterValidatePurchaseHuawei(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseHuaweiRequest) error) error + // RegisterBeforeValidatePurchaseFacebookInstant can be used to perform additional logic before validating an Facebook Instant IAP receipt. + RegisterBeforeValidatePurchaseFacebookInstant(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ValidatePurchaseFacebookInstantRequest) (*api.ValidatePurchaseFacebookInstantRequest, error)) error + + // RegisterAfterValidatePurchaseFacebookInstant can be used to perform additional logic after validating an Facebook Instant IAP receipt. + RegisterAfterValidatePurchaseFacebookInstant(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, out *api.ValidatePurchaseResponse, in *api.ValidatePurchaseFacebookInstantRequest) error) error + // RegisterBeforeListSubscriptions can be used to perform additional logic before listing subscriptions. RegisterBeforeListSubscriptions(fn func(ctx context.Context, logger Logger, db *sql.DB, nk NakamaModule, in *api.ListSubscriptionsRequest) (*api.ListSubscriptionsRequest, error)) error @@ -1090,6 +1096,7 @@ type NakamaModule interface { PrivateKey string }) (*api.ValidatePurchaseResponse, error) PurchaseValidateHuawei(ctx context.Context, userID, signature, inAppPurchaseData string, persist bool) (*api.ValidatePurchaseResponse, error) + PurchaseValidateFacebookInstant(ctx context.Context, userID, signedRequest string, persist bool) (*api.ValidatePurchaseResponse, error) PurchasesList(ctx context.Context, userID string, limit int, cursor string) (*api.PurchaseList, error) PurchaseGetByTransactionId(ctx context.Context, transactionID string) (*api.ValidatedPurchase, error) diff --git a/vendor/modules.txt b/vendor/modules.txt index 2c146b41c6..a05ae1843b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -156,7 +156,7 @@ github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/internal/genopena github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options github.com/grpc-ecosystem/grpc-gateway/v2/runtime github.com/grpc-ecosystem/grpc-gateway/v2/utilities -# github.com/heroiclabs/nakama-common v1.29.0 +# github.com/heroiclabs/nakama-common v1.29.0 => ../nakama-common ## explicit; go 1.19 github.com/heroiclabs/nakama-common/api github.com/heroiclabs/nakama-common/rtapi @@ -440,3 +440,4 @@ gopkg.in/natefinch/lumberjack.v2 # gopkg.in/yaml.v3 v3.0.1 ## explicit gopkg.in/yaml.v3 +# github.com/heroiclabs/nakama-common => ../nakama-common