import { searxngRequest } from "../searxng/client.js";
import { SearXNGSearchResponseSchema } from "../searxng/types.js";
import {
SearXNGSearchSchema,
SearXNGImagesSchema,
SearXNGNewsSchema,
type SearXNGSearchArgs,
type SearXNGImagesArgs,
type SearXNGNewsArgs,
} from "./schemas.js";
import { formatSearchResults } from "../utils/format.js";
/**
* Web search using SearXNG
*/
export async function handleSearXNGSearch(raw: unknown): Promise<string> {
const args: SearXNGSearchArgs = SearXNGSearchSchema.parse(raw);
const params: Record<string, string> = {
q: args.query,
};
if (args.categories) {
params.categories = args.categories;
}
if (args.engines) {
params.engines = args.engines;
}
if (args.language) {
params.language = args.language;
}
if (args.pageno) {
params.pageno = args.pageno.toString();
}
const data = await searxngRequest(
"search",
params,
undefined,
SearXNGSearchResponseSchema
);
return formatSearchResults(data, "web");
}
/**
* Image search using SearXNG
*/
export async function handleSearXNGImages(raw: unknown): Promise<string> {
const args: SearXNGImagesArgs = SearXNGImagesSchema.parse(raw);
const params: Record<string, string> = {
q: args.query,
categories: "images",
};
if (args.engines) {
params.engines = args.engines;
}
if (args.language) {
params.language = args.language;
}
if (args.pageno) {
params.pageno = args.pageno.toString();
}
const data = await searxngRequest(
"search",
params,
undefined,
SearXNGSearchResponseSchema
);
return formatSearchResults(data, "images");
}
/**
* News search using SearXNG
*/
export async function handleSearXNGNews(raw: unknown): Promise<string> {
const args: SearXNGNewsArgs = SearXNGNewsSchema.parse(raw);
const params: Record<string, string> = {
q: args.query,
categories: "news",
};
if (args.engines) {
params.engines = args.engines;
}
if (args.language) {
params.language = args.language;
}
if (args.pageno) {
params.pageno = args.pageno.toString();
}
const data = await searxngRequest(
"search",
params,
undefined,
SearXNGSearchResponseSchema
);
return formatSearchResults(data, "news");
}