@shaivpidadi/trends-js
Version:
Google Trends API for Node.js
76 lines (75 loc) • 2.65 kB
JavaScript
import https from 'https';
import querystring from 'querystring';
let cookieVal;
function rereq(options, body) {
return new Promise((resolve, reject) => {
const req = https.request(options, (res) => {
let chunk = '';
res.on('data', (data) => { chunk += data; });
res.on('end', () => resolve(chunk));
});
req.on('error', reject);
if (body)
req.write(body);
req.end();
});
}
export const request = async (url, options) => {
const parsedUrl = new URL(url);
const method = options.method || 'POST';
// Prepare body
let bodyString = '';
const contentType = options.contentType || 'json';
if (typeof options.body === 'string') {
bodyString = options.body;
}
else if (contentType === 'form') {
bodyString = querystring.stringify(options.body || {});
}
else if (options.body) {
bodyString = JSON.stringify(options.body);
}
const requestOptions = {
hostname: parsedUrl.hostname,
port: parsedUrl.port || 443,
path: `${parsedUrl.pathname}${options.qs ? '?' + querystring.stringify(options.qs) : ''}`,
method,
headers: {
...(options.headers || {}),
...(contentType === 'form'
? { 'Content-Type': 'application/x-www-form-urlencoded' }
: { 'Content-Type': 'application/json' }),
...(bodyString ? { 'Content-Length': Buffer.byteLength(bodyString).toString() } : {}),
...(cookieVal ? { cookie: cookieVal } : {})
}
};
const response = await new Promise((resolve, reject) => {
const req = https.request(requestOptions, (res) => {
let chunk = '';
res.on('data', (data) => { chunk += data; });
res.on('end', async () => {
if (res.statusCode === 429 && res.headers['set-cookie']) {
cookieVal = res.headers['set-cookie'][0].split(';')[0];
requestOptions.headers['cookie'] = cookieVal;
try {
const retryResponse = await rereq(requestOptions, bodyString);
resolve(retryResponse);
}
catch (err) {
reject(err);
}
}
else {
resolve(chunk);
}
});
});
req.on('error', reject);
if (bodyString)
req.write(bodyString);
req.end();
});
return {
text: () => Promise.resolve(response)
};
};