UNPKG

usps-webtools-promise

Version:

API wrapper for the USPS Web-Tools, with Promises!

66 lines (65 loc) 1.96 kB
import { request } from "node:https"; import { stringify } from "node:querystring"; import { create } from "xmlbuilder2"; const makeRequest = async (options) => new Promise((resolve, reject) => { const innerRequest = request(options, (response) => { let body = ""; response.on("data", (chunk) => (body += chunk)); response.on("end", () => { try { const xml = create(body); resolve(xml.end({ format: "object" })); } catch (error) { reject(new Error(error)); } }); }); innerRequest.on("error", (error) => { reject(error); }); innerRequest.end(); }); export default async (api, method, property, config, parameters) => { const requestName = `${method}Request`; const responseName = `${method}Response`; const xmlObject = { [requestName]: { ...parameters, "@USERID": config.userId, }, }; const xml = create(xmlObject).end(); const qs = stringify({ API: api, XML: xml, }); const staging = config.staging ?? false; const options = { hostname: staging ? "stg-secure.shippingapis.com" : "secure.shippingapis.com", method: "GET", path: `/ShippingAPI.dll?${qs}`, }; let uspsResponse; try { uspsResponse = await makeRequest(options); } catch (error) { return error; } if (uspsResponse.Error) { const error = uspsResponse.Error; throw new Error(error.Description.trim()); } let specificResult; if (uspsResponse?.[responseName]?.[property]) { specificResult = uspsResponse[responseName][property]; if (specificResult.Error) { throw new Error(specificResult.Error.Description.trim()); } return specificResult; } throw new Error("Can't find result"); };