import os from 'os'; import path from 'path'; import { File } from '@google-cloud/storage'; import { getBucket, copyFile } from '../../resize_image/buckets'; import { isAlreadyPendingCompression } from '../../resize_image/compress'; import { getDestFileName, isCompressableFile } from './copy_files.rules'; import { Logger } from './logger'; export const getAllBucketFilesAndCopy = async ({ folder = '' } = {}): Promise => { const logFilePath = path.join(os.tmpdir(), 'minify_all_images.log'); const logger = new Logger({ filePath: logFilePath }); const bucketName = process.env.TARGET_BUCKET; if (bucketName === undefined) { // TODO: Better Error handling logger.error('TARGET_BUCKET is not defined'); throw new Error('TARGET_BUCKET is not defined'); } logger.log(`Processing files in ${bucketName}, folder ${folder}`); const bucket = await getBucket(bucketName); let count = 0; return new Promise((resolve, reject) => { bucket .getFilesStream() .on('error', function (this: ReadableStream, error: Error) { logger.error(error); this.cancel(); reject(error); }) .on('data', function (file: File) { if (isCompressableFile(file) && file.name.includes(folder) && !isAlreadyPendingCompression(file.name)) { count += 1; logger.log(`${file.name} -> ${getDestFileName(file.name)}\n`); return copyFile(file, getDestFileName(file.name)).catch((error) => logger.error(error)); } return null; }) .on('end', function () { logger.log(`Processed ${count} files`); logger.close(); resolve(count); }); }); };