1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import { isObject } from './helper';
- const renderContent = (content, contentType) => {
- // 1. render the content
- // 2. if the content type is json then parse the json
- // 3. else parse to form data
- const renderedJson = JSON.parse(content);
- if (contentType === 'form') {
- return Object.keys(renderedJson)
- .map((key) => {
- const value = isObject(renderedJson[key])
- ? JSON.stringify(renderedJson[key])
- : renderedJson[key];
- return `${key}=${value}`;
- })
- .join('&');
- }
- return JSON.stringify(renderedJson);
- };
- const filterHeaders = (headers) => {
- const filteredHeaders = {};
- headers.forEach((item) => {
- if (item.name && item.value) {
- filteredHeaders[item.name] = item.value;
- }
- });
- return filteredHeaders;
- };
- const convertContentType = (contentType) => {
- return contentType === 'json'
- ? 'application/json'
- : 'application/x-www-form-urlencoded';
- };
- export async function executeWebhook({
- url,
- contentType,
- headers,
- timeout,
- body,
- }) {
- const controller = new AbortController();
- const id = setTimeout(() => {
- controller.abort();
- }, timeout);
- try {
- const finalHeaders = filterHeaders(headers);
- const finalContent = renderContent(body, contentType);
- await fetch(url, {
- method: 'POST',
- headers: {
- 'Content-Type': convertContentType(contentType),
- ...finalHeaders,
- },
- body: finalContent,
- signal: controller.signal,
- });
- clearTimeout(id);
- } catch (error) {
- clearTimeout(id);
- throw error;
- }
- }
|