export default async function server(request: Request): Promise<Response> {
const url = new URL(request.url);
const operation = url.pathname.split('/').pop();
const numbers = url.searchParams.getAll('num').map(Number);
if (!operation || numbers.length === 0) {
return new Response(JSON.stringify({ error: "Invalid request" }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
let result: number;
try {
switch (operation) {
case "add":
result = add(numbers);
break;
case "subtract":
result = subtract(numbers);
break;
case "multiply":
result = multiply(numbers);
break;
case "divide":
result = divide(numbers);
break;
case "pow":
result = pow(numbers);
break;
case "sqrt":
result = sqrt(numbers[0]);
break;
case "log":
result = log(numbers[0]);
break;
default:
throw new Error("Invalid operation");
}
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
status: 400,
headers: { 'Content-Type': 'application/json' }
});
}
return new Response(JSON.stringify({ result }), {
headers: { 'Content-Type': 'application/json' }
});
}
function add(numbers: number[]): number {
return numbers.reduce((a, b) => a + b, 0);
}
function subtract(numbers: number[]): number {
return numbers.reduce((a, b) => a - b);
}
function multiply(numbers: number[]): number {
return numbers.reduce((a, b) => a * b, 1);
}
function divide(numbers: number[]): number {
if (numbers.includes(0)) {
throw new Error("Cannot divide by zero");
}
return numbers.reduce((a, b) => a / b);
}
function pow(numbers: number[]): number {
return numbers.reduce((a, b) => Math.pow(a, b));
}
function sqrt(number: number): number {
if (number < 0) {
throw new Error("Cannot calculate square root of a negative number");
}
return Math.sqrt(number);
}
function log(number: number): number {
if (number <= 0) {
throw new Error("Cannot calculate logarithm of a non-positive number");
}
return Math.log(number);
}