Files
2026-07-13 12:37:47 +08:00

73 lines
2.2 KiB
TypeScript

import { WorkflowNode, WorkflowState } from '../types';
import { substituteVariables } from '../variable-substitution';
/**
* Execute HTTP Request Node
*/
export async function executeHTTPNode(
node: WorkflowNode,
state: WorkflowState
): Promise<any> {
const { data } = node;
const nodeData = data as any;
try {
// Substitute variables in URL
const url = substituteVariables(nodeData.httpUrl || '', state);
const method = nodeData.httpMethod || 'GET';
// Build headers
const headers: Record<string, string> = {};
if (nodeData.httpHeaders && Array.isArray(nodeData.httpHeaders)) {
nodeData.httpHeaders.forEach((h: any) => {
if (h.key && h.value) {
headers[h.key] = substituteVariables(h.value, state);
}
});
}
// Add authentication
if (nodeData.httpAuthType === 'bearer' && nodeData.httpAuthToken) {
headers['Authorization'] = `Bearer ${nodeData.httpAuthToken}`;
} else if (nodeData.httpAuthType === 'api-key' && nodeData.httpAuthToken) {
headers['X-API-Key'] = nodeData.httpAuthToken;
} else if (nodeData.httpAuthType === 'basic' && nodeData.httpAuthToken) {
headers['Authorization'] = `Basic ${btoa(nodeData.httpAuthToken)}`;
}
// Build request body
let body: string | undefined = undefined;
if ((method === 'POST' || method === 'PUT' || method === 'PATCH') && nodeData.httpBody) {
body = substituteVariables(nodeData.httpBody, state);
}
console.log('HTTP Request:', { method, url, headers, body });
// Make the request
const response = await fetch(url, {
method,
headers,
body,
});
const responseData = await response.json().catch(() => response.text());
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return {
status: response.status,
statusText: response.statusText,
headers: Object.fromEntries(response.headers.entries()),
data: responseData,
url,
method,
};
} catch (error) {
console.error('HTTP request error:', error);
throw new Error(`HTTP request failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}