import { Auth, ConfigService, ProviderSession } from '@config/env.config'; import { Logger } from '@config/logger.config'; import axios from 'axios'; import { execFileSync } from 'child_process'; type ResponseSuccess = { status: number; data?: any }; type ResponseProvider = Promise<[ResponseSuccess?, Error?]>; export class ProviderFiles { constructor(private readonly configService: ConfigService) { this.baseUrl = `http://${this.config.HOST}:${this.config.PORT}/session/${this.config.PREFIX}`; this.globalApiToken = this.configService.get('AUTHENTICATION').API_KEY.KEY; } private readonly logger = new Logger('ProviderFiles'); private baseUrl: string; private globalApiToken: string; private readonly config = Object.freeze(this.configService.get('PROVIDER')); get isEnabled() { return !!this.config?.ENABLED; } public async onModuleInit() { if (this.config.ENABLED) { const url = `http://${this.config.HOST}:${this.config.PORT}`; try { const response = await axios.options(url + '/ping'); if (response?.data != 'pong') { throw new Error('Offline file provider.'); } await axios.post(`${url}/session`, { group: this.config.PREFIX }, { headers: { apikey: this.globalApiToken } }); } catch (error) { this.logger.error(['Failed to connect to the file server', error?.message, error?.stack]); const pid = process.pid; execFileSync('kill', ['-9', `${pid}`]); } } } public async onModuleDestroy() { // } public async create(instance: string): ResponseProvider { try { const response = await axios.post( `${this.baseUrl}`, { instance, }, { headers: { apikey: this.globalApiToken } }, ); return [{ status: response.status, data: response?.data }]; } catch (error) { return [ { status: error?.response?.status, data: error?.response?.data, }, error, ]; } } public async write(instance: string, key: string, data: any): ResponseProvider { try { const response = await axios.post(`${this.baseUrl}/${instance}/${key}`, data, { headers: { apikey: this.globalApiToken }, }); return [{ status: response.status, data: response?.data }]; } catch (error) { return [ { status: error?.response?.status, data: error?.response?.data, }, error, ]; } } public async read(instance: string, key: string): ResponseProvider { try { const response = await axios.get(`${this.baseUrl}/${instance}/${key}`, { headers: { apikey: this.globalApiToken }, }); return [{ status: response.status, data: response?.data }]; } catch (error) { return [ { status: error?.response?.status, data: error?.response?.data, }, error, ]; } } public async delete(instance: string, key: string): ResponseProvider { try { const response = await axios.delete(`${this.baseUrl}/${instance}/${key}`, { headers: { apikey: this.globalApiToken }, }); return [{ status: response.status, data: response?.data }]; } catch (error) { return [ { status: error?.response?.status, data: error?.response?.data, }, error, ]; } } public async allInstances(): ResponseProvider { try { const response = await axios.get(`${this.baseUrl}/list-instances`, { headers: { apikey: this.globalApiToken } }); return [{ status: response.status, data: response?.data as string[] }]; } catch (error) { return [ { status: error?.response?.status, data: error?.response?.data, }, error, ]; } } public async removeSession(instance: string): ResponseProvider { try { const response = await axios.delete(`${this.baseUrl}/${instance}`, { headers: { apikey: this.globalApiToken } }); return [{ status: response.status, data: response?.data }]; } catch (error) { return [ { status: error?.response?.status, data: error?.response?.data, }, error, ]; } } }