usps-webtools-promise
Version:
API wrapper for the USPS Web-Tools, with Promises!
66 lines (65 loc) • 1.96 kB
JavaScript
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");
};