webhookUtil.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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(
  10. (key) =>
  11. `${key}=${
  12. isObject(renderedJson[key])
  13. ? JSON.stringify(renderedJson[key])
  14. : renderedJson[key]
  15. }`
  16. )
  17. .join('&');
  18. }
  19. return JSON.stringify(renderedJson);
  20. };
  21. const filterHeaders = (headers) => {
  22. const filteredHeaders = {};
  23. headers.forEach((item) => {
  24. if (item.name && item.value) {
  25. filteredHeaders[item.name] = item.value;
  26. }
  27. });
  28. return filteredHeaders;
  29. };
  30. const convertContentType = (contentType) => {
  31. return contentType === 'json'
  32. ? 'application/json'
  33. : 'application/x-www-form-urlencoded';
  34. };
  35. export async function executeWebhook({
  36. url,
  37. contentType,
  38. headers,
  39. timeout,
  40. body,
  41. }) {
  42. const controller = new AbortController();
  43. const id = setTimeout(() => {
  44. controller.abort();
  45. }, timeout);
  46. try {
  47. const finalHeaders = filterHeaders(headers);
  48. const finalContent = renderContent(body, contentType);
  49. await fetch(url, {
  50. method: 'POST',
  51. headers: {
  52. 'Content-Type': convertContentType(contentType),
  53. ...finalHeaders,
  54. },
  55. body: finalContent,
  56. signal: controller.signal,
  57. });
  58. clearTimeout(id);
  59. } catch (error) {
  60. clearTimeout(id);
  61. throw error;
  62. }
  63. }