import { ConnectionTestResult, QueryError, QueryResult, QueryService } from '@tooljet-plugins/common'; import Redis from 'ioredis'; import { SourceOptions, QueryOptions } from './types'; export default class RedisQueryService implements QueryService { async run(sourceOptions: SourceOptions, queryOptions: QueryOptions, dataSourceId: string): Promise { let result = {}; const query = queryOptions.query; const client = await this.getConnection(sourceOptions); try { const splitQuery = query.split(' '); const command = splitQuery[0]; const args = splitQuery.length > 0 ? splitQuery.slice(1) : []; result = await client.call(command, args); } catch (err) { client.disconnect(); throw new QueryError('Query could not be completed', err.message, {}); } return { status: 'ok', data: result }; } async testConnection(sourceOptions: SourceOptions): Promise { const client = await this.getConnection(sourceOptions); await client.ping(); return { status: 'ok', }; } async getConnection(sourceOptions: SourceOptions): Promise { const username = sourceOptions.username; const host = sourceOptions.host; const password = sourceOptions.password; const port = sourceOptions.port; const client = new Redis(port, host, { maxRetriesPerRequest: 1, username, password }); return client; } }