In Javascript, using async/await is a cleaner approach compared to use of callbacks. Occasionally, you run into useful but older modules that you’d like to use in the more modern way.

Take fluent-ffmpeg, a 10 year old package that uses callbacks to handle various events like start, progress, end and error.

Using callbacks, we have code that looks like this:

const ffmpeg = require('fluent-ffmpeg');

function convertVideo(inputPath, outputPath, callback) {
  ffmpeg(inputPath)
    .output(outputPath)
    .on('end', () => {
      console.log('Conversion finished successfully.');
      callback(null, 'success'); // Pass 'success' string to callback
    })
    .on('error', (err) => {
      console.error('Error occurred:', err);
      callback(err);
    })
    .run();
}

// Usage of the convertVideo function with a callback to receive 'success' string
convertVideo('/path/to/input.avi', '/path/to/output.mp4', (error, result) => {
  if (!error && result === 'success') {
    console.log('Video conversion completed:', result);
  } else {
    console.log('Video conversion failed:', error);
  }
});

Using a promise, we use async/await as well:

const ffmpeg = require('fluent-ffmpeg');

function convertVideo(inputPath, outputPath) {
  return new Promise((resolve, reject) => {
    ffmpeg(inputPath)
      .output(outputPath)
      .on('end', () => {
        console.log('Conversion finished successfully.');
        resolve('success'); // Resolve the promise with 'success' string
      })
      .on('error', (err) => {
        console.error('Error occurred:', err);
        reject(err);
      })
      .run();
  });
}

// Async function to use the Promise-based conversion function
async function main() {
  try {
    const result = await convertVideo('/path/to/input.avi', '/path/to/output.mp4');
    console.log('Video conversion completed:', result);
  } catch (err) {
    console.error('Video conversion failed:', err);
  }
}

// Run the async function
main();

With the approach using a promise, we gain the ability to use this callback-based library with more traditional flow control.