whatsapp-business-serverless
Version:
Connector for the WhatsApp Business APIs with TypeScript support. Serverless version.
207 lines (206 loc) • 8.65 kB
JavaScript
;
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;