import fs from 'fs'; import path from 'path'; import axios from 'axios'; import ora from 'ora'; class UploadService { private static _instance: UploadService; // Singleton pattern to ensure only one instance of UploadService public static getInstance(): UploadService { if (!this._instance) { this._instance = new UploadService(); } return this._instance; } // Method to upload a file to a file server async uploadFileToFileserver( fileid: string, display: string, routePath: string[], method: string, environment: string, projectid: string, secretkey: string, ) { return new Promise((resolve, reject) => { const spinner_upload = ora('Uploading ' + display).start(); const startTime = performance.now(); // Remove the display name from routePath if present routePath = routePath.filter(rp => rp !== display); try { // Create a stream to read the file const file = fs.createReadStream(path.join(process.cwd(), '/.apilib/build/' + fileid + '.js')); const customHeaders = { authentication: secretkey, }; let data = ''; // Collect file data in chunks file.on('data', (chunk) => { data += chunk.toString(); }); // When file reading ends, send the file to server file.on('end', async () => { try { const response = await axios.post( 'https://fs-1.api-lib.dev/upload', { file: data, routepath: routePath.join('/'), method: method, projectid: projectid, environment: environment, }, { headers: customHeaders }, ); const endTime = performance.now(); const elapsedTime = endTime - startTime; spinner_upload.text = 'Uploaded ' + display + ' - ' + elapsedTime.toFixed(2) + 'ms'; spinner_upload.succeed(); resolve(); } catch (error: any) { //console.log(error); const endTime = performance.now(); const elapsedTime = endTime - startTime; spinner_upload.text = 'Failed to upload ' + display + ' - ' + elapsedTime.toFixed(2) + 'ms - ' + error.respone.data; spinner_upload.fail(); reject(error); } }); } catch (error) { console.error('Error uploading file:', error); reject(error); } }); } } export default UploadService.getInstance();