UNPKG

@playbooks/adapters

Version:

A collection of adapters for various projects.

79 lines (78 loc) 3.37 kB
import { timeElapsed } from "@playbooks/utils/dates"; import { isEmpty, isArray, isObject, env, sleep } from "@playbooks/utils/helpers"; import { logger } from "@playbooks/utils/logger"; import fetch from "cross-fetch"; import Https from "https"; class BaseAdapter { domain; constructor({ domain }) { this.domain = domain; } // Private async client(url, options) { const response = await fetch(url, options); if (!response.ok) { const data = await response.json(); throw data.errors; } return await response.json(); } formatUrl(url, params) { const formattedUrl = new URL(this.domain + url); Object.keys(params).map((key) => { const value = params[key]; if (isEmpty(value)) return; if (isArray(value)) return formattedUrl.searchParams.append(key, value.join(",")); if (isObject(value)) return Object.keys(value).map((key2) => formattedUrl.searchParams.append(key2, value[key2])); return formattedUrl.searchParams.append(key, value); }); return formattedUrl; } formatOptions(method, headers, data) { const formattedOptions = {}; formattedOptions["method"] = method; formattedOptions["headers"] = { ["Content-Type"]: "application/json", ...headers }; formattedOptions["body"] = JSON.stringify(data); if (env === "development") formattedOptions["agent"] = new Https.Agent({ rejectUnauthorized: false }); return formattedOptions; } formatRequest({ method = "GET", url, headers, params, data }) { const date = /* @__PURE__ */ new Date(); const formattedUrl = this.formatUrl(url, params); const formattedOptions = this.formatOptions(method, headers, data); return { date, formattedUrl, formattedOptions }; } async request({ method = "GET", url, headers, params, data }) { const { date, formattedUrl, formattedOptions } = this.formatRequest({ method, url, headers, params, data }); const response = await this.client(formattedUrl, formattedOptions); return [timeElapsed(date), response]; } async apiRequest({ method = "GET", url, headers, params, data }) { logger.info(`apiRequest: `, { method, url, params, data }); const [date, response] = await this.request({ method, url, headers, params, data }); logger.info(`apiResponse (${date}): `, { method, url, params, response }); return response; } async storeRequest({ method = "GET", url, headers, params, data }) { if (env === "development") await sleep(300); logger.info(`storeRequest: `, { method, url, params, data }); const [date, response] = await this.request({ method, url, headers, params, data }); logger.info(`storeResponse (${date}): `, { method, url, params, response }); return response; } async downloadRequest({ method = "GET", url, headers, params, data }) { if (env === "development") await sleep(300); logger.info(`downloadRequest: `, { method, url, params, data }); const { date, formattedUrl, formattedOptions } = await this.formatRequest({ method, url, headers, params, data }); const response = await fetch(formattedUrl, formattedOptions); logger.info(`downloadResponse (${date}): `, { method, url, params, response }); if (!response.ok) { const data2 = await response.json(); throw data2.errors; } return await response; } } export { BaseAdapter };