webhookUtil.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { isObject } from './helper';
  2. const renderContent = (content, contentType) => {
  3. // 1. render the content
  4. // 2. if the content type is json then parse the json
  5. // 3. else parse to form data
  6. const renderedJson = JSON.parse(content);
  7. if (contentType === 'form') {
  8. return Object.keys(renderedJson)
  9. .map((key) => {
  10. const value = isObject(renderedJson[key])
  11. ? JSON.stringify(renderedJson[key])
  12. : renderedJson[key];
  13. return `${key}=${value}`;
  14. })
  15. .join('&');
  16. }
  17. return JSON.stringify(renderedJson);
  18. };
  19. const filterHeaders = (headers) => {
  20. const filteredHeaders = {};
  21. headers.forEach((item) => {
  22. if (item.name && item.value) {
  23. filteredHeaders[item.name] = item.value;
  24. }
  25. });
  26. return filteredHeaders;
  27. };
  28. const convertContentType = (contentType) => {
  29. return contentType === 'json'
  30. ? 'application/json'
  31. : 'application/x-www-form-urlencoded';
  32. };
  33. export async function executeWebhook({
  34. url,
  35. contentType,
  36. headers,
  37. timeout,
  38. body,
  39. }) {
  40. const controller = new AbortController();
  41. const id = setTimeout(() => {
  42. controller.abort();
  43. }, timeout);
  44. try {
  45. const finalHeaders = filterHeaders(headers);
  46. const finalContent = renderContent(body, contentType);
  47. await fetch(url, {
  48. method: 'POST',
  49. headers: {
  50. 'Content-Type': convertContentType(contentType),
  51. ...finalHeaders,
  52. },
  53. body: finalContent,
  54. signal: controller.signal,
  55. });
  56. clearTimeout(id);
  57. } catch (error) {
  58. clearTimeout(id);
  59. throw error;
  60. }
  61. }