@shaivpidadi/trends-js
Version:
Google Trends API for Node.js
83 lines (82 loc) • 3 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.request = void 0;
const https_1 = __importDefault(require("https"));
const querystring_1 = __importDefault(require("querystring"));
let cookieVal;
function rereq(options, body) {
return new Promise((resolve, reject) => {
const req = https_1.default.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();
});
}
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_1.default.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_1.default.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_1.default.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)
};
};
exports.request = request;