n8n-nodes-refresh-token-auth
Version:
n8n community node with automatic refresh token support
295 lines • 15.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpRequestWithRefreshToken = void 0;
const n8n_workflow_1 = require("n8n-workflow");
const Description_1 = require("./Description");
const CREDENTIALS_NAME = 'refreshTokenAuth';
function parseJsonParameter(value) {
if (typeof value === 'string') {
if (!value.trim())
return {};
return JSON.parse(value);
}
return value;
}
class HttpRequestWithRefreshToken {
constructor() {
this.description = {
displayName: 'HTTP Request (Refresh Token Auth)',
name: 'httpRequestWithRefreshToken',
group: ['output'],
version: 1,
subtitle: '={{$parameter["method"] + ": " + $parameter["url"]}}',
description: 'Makes an HTTP request using RefreshTokenAuth credentials with automatic token refresh.',
icon: 'file:refresh-token-auth.svg',
defaults: {
name: 'HTTP Request (Refresh Token Auth)',
},
inputs: ['main'],
outputs: ['main'],
credentials: [
{
name: CREDENTIALS_NAME,
required: true,
},
],
properties: Description_1.mainProperties,
};
}
async execute() {
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
const items = this.getInputData();
const returnItems = [];
for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
try {
const url = this.getNodeParameter('url', itemIndex);
const method = this.getNodeParameter('method', itemIndex);
if (!url) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'URL is required', { itemIndex });
}
if (!url.startsWith('http://') && !url.startsWith('https://')) {
throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Invalid URL: ${url}. URL must start with "http://" or "https://".`, { itemIndex });
}
const requestOptions = {
method,
url,
returnFullResponse: true,
};
const sendQuery = this.getNodeParameter('sendQuery', itemIndex, false);
if (sendQuery) {
const specifyQuery = this.getNodeParameter('specifyQuery', itemIndex, 'keypair');
if (specifyQuery === 'keypair') {
const queryParameters = this.getNodeParameter('queryParameters.parameters', itemIndex, []);
if (queryParameters.length > 0) {
requestOptions.qs = {};
for (const param of queryParameters) {
if (param.name) {
requestOptions.qs[param.name] = param.value;
}
}
}
}
else if (specifyQuery === 'json') {
const jsonQuery = this.getNodeParameter('jsonQuery', itemIndex, '');
requestOptions.qs = parseJsonParameter(jsonQuery);
}
}
const sendHeaders = this.getNodeParameter('sendHeaders', itemIndex, false);
if (sendHeaders) {
const specifyHeaders = this.getNodeParameter('specifyHeaders', itemIndex, 'keypair');
if (specifyHeaders === 'keypair') {
const headerParameters = this.getNodeParameter('headerParameters.parameters', itemIndex, []);
if (headerParameters.length > 0) {
requestOptions.headers = {};
for (const param of headerParameters) {
if (param.name) {
requestOptions.headers[param.name.toLowerCase()] = param.value;
}
}
}
}
else if (specifyHeaders === 'json') {
const jsonHeaders = this.getNodeParameter('jsonHeaders', itemIndex, '');
const parsedHeaders = parseJsonParameter(jsonHeaders);
requestOptions.headers = {};
for (const [key, value] of Object.entries(parsedHeaders)) {
requestOptions.headers[key.toLowerCase()] = value;
}
}
}
const sendBody = this.getNodeParameter('sendBody', itemIndex, false);
if (sendBody && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) {
const contentType = this.getNodeParameter('contentType', itemIndex, 'json');
if (contentType === 'json') {
const specifyBody = this.getNodeParameter('specifyBody', itemIndex, 'keypair');
if (specifyBody === 'keypair') {
const bodyParameters = this.getNodeParameter('bodyParameters.parameters', itemIndex, []);
if (bodyParameters.length > 0) {
requestOptions.body = {};
for (const param of bodyParameters) {
if (param.name) {
requestOptions.body[param.name] = param.value;
}
}
}
}
else if (specifyBody === 'json') {
const jsonBody = this.getNodeParameter('jsonBody', itemIndex, '');
requestOptions.body = parseJsonParameter(jsonBody);
}
requestOptions.headers = {
...requestOptions.headers,
'content-type': 'application/json',
};
}
else if (contentType === 'form-urlencoded') {
const specifyBody = this.getNodeParameter('specifyBody', itemIndex, 'keypair');
if (specifyBody === 'keypair') {
const bodyParameters = this.getNodeParameter('bodyParameters.parameters', itemIndex, []);
const formData = {};
for (const param of bodyParameters) {
if (param.name) {
formData[param.name] = param.value;
}
}
requestOptions.body = new URLSearchParams(formData).toString();
}
else if (specifyBody === 'string') {
requestOptions.body = this.getNodeParameter('body', itemIndex, '');
}
requestOptions.headers = {
...requestOptions.headers,
'content-type': 'application/x-www-form-urlencoded',
};
}
else if (contentType === 'multipart-form-data') {
const bodyParameters = this.getNodeParameter('bodyParameters.parameters', itemIndex, []);
const formData = {};
for (const param of bodyParameters) {
if (param.name) {
if (param.parameterType === 'formBinaryData' && param.inputDataFieldName) {
const binaryData = this.helpers.assertBinaryData(itemIndex, param.inputDataFieldName);
const itemBinaryData = items[itemIndex].binary[param.inputDataFieldName];
let uploadData;
if (itemBinaryData.id) {
const stream = await this.helpers.getBinaryStream(itemBinaryData.id);
const chunks = [];
for await (const chunk of stream) {
chunks.push(Buffer.from(chunk));
}
uploadData = Buffer.concat(chunks);
}
else {
uploadData = Buffer.from(itemBinaryData.data, 'base64');
}
formData[param.name] = {
value: uploadData,
options: {
filename: binaryData.fileName,
contentType: binaryData.mimeType,
},
};
}
else {
formData[param.name] = param.value;
}
}
}
requestOptions.formData = formData;
}
else if (contentType === 'raw') {
const rawContentType = this.getNodeParameter('rawContentType', itemIndex, 'text/plain');
requestOptions.body = this.getNodeParameter('body', itemIndex, '');
requestOptions.headers = { ...requestOptions.headers, 'content-type': rawContentType };
}
else if (contentType === 'binaryData') {
const inputDataFieldName = this.getNodeParameter('inputDataFieldName', itemIndex);
const itemBinaryData = this.helpers.assertBinaryData(itemIndex, inputDataFieldName);
let uploadData;
if (itemBinaryData.id) {
const stream = await this.helpers.getBinaryStream(itemBinaryData.id);
const chunks = [];
for await (const chunk of stream) {
chunks.push(Buffer.from(chunk));
}
uploadData = Buffer.concat(chunks);
}
else {
uploadData = Buffer.from(itemBinaryData.data, 'base64');
}
requestOptions.body = uploadData;
requestOptions.headers = {
...requestOptions.headers,
'content-type': (_a = itemBinaryData.mimeType) !== null && _a !== void 0 ? _a : 'application/octet-stream',
'content-length': uploadData.length.toString(),
};
}
}
const options = this.getNodeParameter('options', itemIndex, {});
if (options.allowUnauthorizedCerts) {
requestOptions.skipSslCertificateValidation = true;
}
if (options.timeout) {
requestOptions.timeout = options.timeout;
}
if (options.proxy) {
requestOptions.proxy = { host: options.proxy, port: 80 };
}
const redirect = options.redirect;
if (((_b = redirect === null || redirect === void 0 ? void 0 : redirect.redirect) === null || _b === void 0 ? void 0 : _b.followRedirects) === false) {
requestOptions.ignoreHttpStatusErrors = true;
}
const response = await this.helpers.httpRequestWithAuthentication.call(this, CREDENTIALS_NAME, requestOptions);
const responseOptions = options.response;
const fullResponse = (_d = (_c = responseOptions === null || responseOptions === void 0 ? void 0 : responseOptions.response) === null || _c === void 0 ? void 0 : _c.fullResponse) !== null && _d !== void 0 ? _d : false;
const responseFormat = (_f = (_e = responseOptions === null || responseOptions === void 0 ? void 0 : responseOptions.response) === null || _e === void 0 ? void 0 : _e.responseFormat) !== null && _f !== void 0 ? _f : 'autodetect';
const outputPropertyName = (_h = (_g = responseOptions === null || responseOptions === void 0 ? void 0 : responseOptions.response) === null || _g === void 0 ? void 0 : _g.outputPropertyName) !== null && _h !== void 0 ? _h : 'data';
let responseBody;
let responseHeaders = {};
let statusCode;
let statusMessage;
if (typeof response === 'object' && response !== null && 'body' in response) {
responseBody = response.body;
responseHeaders = (_j = response.headers) !== null && _j !== void 0 ? _j : {};
statusCode = response.statusCode;
statusMessage = response.statusMessage;
}
else {
responseBody = response;
}
if (fullResponse) {
returnItems.push({
json: {
body: responseBody,
headers: responseHeaders,
statusCode,
statusMessage,
},
pairedItem: { item: itemIndex },
});
}
else if (responseFormat === 'file' || responseFormat === 'text') {
const textValue = typeof responseBody === 'string' ? responseBody : JSON.stringify(responseBody);
returnItems.push({
json: { [outputPropertyName]: textValue },
pairedItem: { item: itemIndex },
});
}
else {
if (Array.isArray(responseBody)) {
for (const item of responseBody) {
returnItems.push({
json: item,
pairedItem: { item: itemIndex },
});
}
}
else if (typeof responseBody === 'object' && responseBody !== null) {
returnItems.push({
json: responseBody,
pairedItem: { item: itemIndex },
});
}
else {
returnItems.push({
json: { data: responseBody },
pairedItem: { item: itemIndex },
});
}
}
}
catch (error) {
if (!this.continueOnFail()) {
throw error;
}
returnItems.push({
json: { error: error.message },
pairedItem: { item: itemIndex },
});
}
}
return [returnItems];
}
}
exports.HttpRequestWithRefreshToken = HttpRequestWithRefreshToken;
//# sourceMappingURL=HttpRequestWithRefreshToken.node.js.map