import { type IDataObject, type IExecuteFunctions, type INodeExecutionData, type INodeProperties, } from 'n8n-workflow'; import { COUNTRIES } from '../../countries'; import { createSession, validateProfileName, validateProxy, validateSaveProfileOnTermination, validateTimeoutMinutes, } from '../../GenericFunctions'; import { apiRequest } from '../../transport'; import { profileNameField } from '../common/fields'; const displayOptions = { show: { resource: ['session'], operation: ['create'], }, }; const countryOptions = COUNTRIES.map(({ name, value }) => ({ name, value })); export const description: INodeProperties[] = [ { ...profileNameField, displayOptions, }, { displayName: 'Save Profile', name: 'saveProfileOnTermination', type: 'boolean', default: false, description: 'Whether to automatically save the Airtop profile for this session upon termination', displayOptions, }, { displayName: 'Idle Timeout', name: 'timeoutMinutes', type: 'number', default: 10, validateType: 'number', description: 'Minutes to wait before the session is terminated due to inactivity', displayOptions, }, /** * Proxy Configuration */ { displayName: 'Proxy', name: 'proxy', type: 'options', default: 'none', description: 'Choose how to configure the proxy for this session', options: [ { name: 'None', value: 'none', description: 'No proxy will be used', }, { name: 'Integrated', value: 'integrated', description: 'Use Airtop-provided proxy', }, { name: 'Proxy URL', value: 'proxyUrl', description: 'Use a proxy URL to configure the proxy', }, ], displayOptions, }, { displayName: 'Proxy Configuration', name: 'proxyConfig', type: 'collection', default: { country: 'US', sticky: true }, description: 'The Airtop-provided configuration to use for the proxy', placeholder: 'Add Attribute', options: [ { displayName: 'Country', name: 'country', type: 'options', default: 'US', description: 'The country to use for the proxy. Not all countries are guaranteed to provide a proxy. Learn more here.', options: countryOptions, }, { displayName: 'Keep Same IP', name: 'sticky', type: 'boolean', default: true, description: 'Whether to try to maintain the same IP address for the duration of the session. Airtop can guarantee that the same IP address will be available for up to a maximum of 30 minutes.', }, ], displayOptions: { show: { ...displayOptions.show, proxy: ['integrated'], }, }, }, { displayName: 'Proxy URL', name: 'proxyUrl', type: 'string', default: '', description: 'The URL of the proxy to use', validateType: 'string', displayOptions: { show: { ...displayOptions.show, proxy: ['proxyUrl'], }, }, }, { displayName: 'Additional Fields', name: 'additionalFields', type: 'collection', placeholder: 'Add Field', default: {}, displayOptions, options: [ { displayName: 'Auto Solve Captchas', name: 'solveCaptcha', type: 'boolean', default: false, description: 'Whether to automatically solve captcha challenges', }, { displayName: 'Extension IDs', name: 'extensionIds', type: 'string', default: '', placeholder: 'e.g. extId1, extId2, ...', description: 'Comma-separated extension IDs from the Google Web Store to be loaded into the session. Learn more here.', }, ], }, ]; export async function execute( this: IExecuteFunctions, index: number, ): Promise { const profileName = validateProfileName.call(this, index); const timeoutMinutes = validateTimeoutMinutes.call(this, index); const saveProfileOnTermination = validateSaveProfileOnTermination.call(this, index, profileName); const { proxy } = validateProxy.call(this, index); const solveCaptcha = this.getNodeParameter( 'additionalFields.solveCaptcha', index, false, ) as boolean; const extensions = this.getNodeParameter('additionalFields.extensionIds', index, '') as string; const extensionIds = extensions ? extensions.split(',').map((id) => id.trim()) : []; const body: IDataObject = { configuration: { profileName, timeoutMinutes, proxy, solveCaptcha, ...(extensionIds.length > 0 ? { extensionIds } : {}), }, }; const { sessionId, data } = await createSession.call(this, body); if (saveProfileOnTermination) { await apiRequest.call( this, 'PUT', `/sessions/${sessionId}/save-profile-on-termination/${profileName}`, ); } return this.helpers.returnJsonArray({ sessionId, ...data }); }