// Таймаут запроса в миллисекундах const TIMEOUT_MS = 4000; /** * Функция для приёма вебхуков (POST) */ function doPost(e) { return handleWebhook(e); } /** * Функция для приёма GET-запросов (если HDE использует GET) */ function doGet(e) { return handleWebhook(e); } /** * Основная функция обработки вебхука */ function handleWebhook(e) { const startTime = new Date().getTime(); // Пример парсинга JSON из HDE let data; try { data = JSON.parse(e.postData?.contents || '{}'); } catch (err) { return ContentService.createTextOutput(JSON.stringify({status: 'error', message: 'Invalid JSON'})) .setMimeType(ContentService.MimeType.JSON); } // Быстрая обработка (чтобы минимизировать задержку) const response = processData(data); // Проверяем таймаут const elapsed = new Date().getTime() - startTime; if (elapsed > TIMEOUT_MS) { return ContentService.createTextOutput(JSON.stringify({status: 'timeout'})) .setMimeType(ContentService.MimeType.JSON); } return ContentService.createTextOutput(JSON.stringify(response)) .setMimeType(ContentService.MimeType.JSON); } /** * Минимальная обработка данных */ function processData(data) { // Тут может быть любая логика, например: // - логирование // - фильтрация // - быстрый ответ return { status: 'ok', received: data }; } /** * Функция для отправки POST в HDE (можно вызывать при необходимости) */ function sendWebhookToHDE(url, payload) { try { const options = { method: 'post', contentType: 'application/json', payload: JSON.stringify(payload), muteHttpExceptions: true, // Таймаут запроса 4 секунды timeout: TIMEOUT_MS / 1000 }; const response = UrlFetchApp.fetch(url, options); return response.getContentText(); } catch (err) { return {status: 'error', message: err.message}; } }