UNPKG

whatsapp-business-serverless

Version:

Connector for the WhatsApp Business APIs with TypeScript support. Serverless version.

207 lines (206 loc) 8.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createRestClient = void 0; const createRestClient = ({ baseURL, apiToken, errorHandler }) => { const defaultHeaders = { 'Content-Type': 'application/json', }; if (apiToken) { defaultHeaders.authorization = `Bearer ${apiToken}`; } const makeRequest = async (endpoint, options = {}) => { const url = baseURL ? `${baseURL}/${endpoint}`.replace(/\/+/g, '/').replace(':/', '://') : endpoint; try { const response = await fetch(url, { ...options, headers: { ...defaultHeaders, ...options.headers, }, }); if (!response.ok) { const errorData = await response.json().catch(() => ({ message: response.statusText })); const error = new Error(`HTTP ${response.status}: ${response.statusText}`); error.response = { data: errorData, status: response.status }; throw error; } // Handle different response types const contentType = response.headers.get('content-type'); if (contentType?.includes('application/json')) { return await response.json(); } else if (options.method === 'GET' && options.responseType === 'stream') { return response.body; } else { return await response.text(); } } catch (error) { if (errorHandler) { return errorHandler(error); } throw error; } }; return { fetch: { get: (url, config) => makeRequest(url, { method: 'GET', ...config }), post: (url, data, config) => makeRequest(url, { method: 'POST', body: data instanceof FormData ? data : JSON.stringify(data), ...config }), put: (url, data, config) => makeRequest(url, { method: 'PUT', body: JSON.stringify(data), ...config }), delete: (url, config) => makeRequest(url, { method: 'DELETE', ...config }), }, get: async (endpoint, params, config) => { let url = endpoint; if (params) { const searchParams = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => { if (value !== undefined && value !== null) { searchParams.append(key, String(value)); } }); const queryString = searchParams.toString(); if (queryString) { url += `?${queryString}`; } } const requestUrl = config?.baseURL !== undefined ? (config.baseURL ? `${config.baseURL}/${url}`.replace(/\/+/g, '/').replace(':/', '://') : url) : (baseURL ? `${baseURL}/${url}`.replace(/\/+/g, '/').replace(':/', '://') : url); const response = await fetch(requestUrl, { method: 'GET', headers: { ...defaultHeaders, ...config?.headers, }, ...config, }); if (!response.ok) { const errorData = await response.json().catch(() => ({ message: response.statusText })); const error = new Error(`HTTP ${response.status}: ${response.statusText}`); error.response = { data: errorData, status: response.status }; if (errorHandler) { return errorHandler(error); } throw error; } if (config?.responseType === 'stream') { return response.body; } const contentType = response.headers.get('content-type'); if (contentType?.includes('application/json')) { return await response.json(); } return await response.text(); }, post: async (endpoint, payload, config) => { const url = baseURL ? `${baseURL}/${endpoint}`.replace(/\/+/g, '/').replace(':/', '://') : endpoint; let body; let headers = { ...defaultHeaders }; if (payload instanceof FormData) { body = payload; // Remove Content-Type header for FormData - browser will set it with boundary delete headers['Content-Type']; } else if (payload !== undefined) { body = JSON.stringify(payload); } const response = await fetch(url, { method: 'POST', headers: { ...headers, ...config?.headers, }, body, ...config, }); if (!response.ok) { const errorData = await response.json().catch(() => ({ message: response.statusText })); const error = new Error(`HTTP ${response.status}: ${response.statusText}`); error.response = { data: errorData, status: response.status }; if (errorHandler) { return errorHandler(error); } throw error; } const contentType = response.headers.get('content-type'); if (contentType?.includes('application/json')) { return await response.json(); } return await response.text(); }, put: async (endpoint, payload, config) => { const url = baseURL ? `${baseURL}/${endpoint}`.replace(/\/+/g, '/').replace(':/', '://') : endpoint; const response = await fetch(url, { method: 'PUT', headers: { ...defaultHeaders, ...config?.headers, }, body: payload ? JSON.stringify(payload) : undefined, ...config, }); if (!response.ok) { const errorData = await response.json().catch(() => ({ message: response.statusText })); const error = new Error(`HTTP ${response.status}: ${response.statusText}`); error.response = { data: errorData, status: response.status }; if (errorHandler) { return errorHandler(error); } throw error; } const contentType = response.headers.get('content-type'); if (contentType?.includes('application/json')) { return await response.json(); } return await response.text(); }, delete: async (endpoint, params, config) => { let url = endpoint; if (params) { const searchParams = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => { if (value !== undefined && value !== null) { searchParams.append(key, String(value)); } }); const queryString = searchParams.toString(); if (queryString) { url += `?${queryString}`; } } const requestUrl = baseURL ? `${baseURL}/${url}`.replace(/\/+/g, '/').replace(':/', '://') : url; const response = await fetch(requestUrl, { method: 'DELETE', headers: { ...defaultHeaders, ...config?.headers, }, ...config, }); if (!response.ok) { const errorData = await response.json().catch(() => ({ message: response.statusText })); const error = new Error(`HTTP ${response.status}: ${response.statusText}`); error.response = { data: errorData, status: response.status }; if (errorHandler) { return errorHandler(error); } throw error; } const contentType = response.headers.get('content-type'); if (contentType?.includes('application/json')) { return await response.json(); } return await response.text(); }, }; }; exports.createRestClient = createRestClient;