Callback/Promise Catering Utility

2.1.1 · active · verified Tue Apr 21

catering is a lightweight utility designed to enable JavaScript modules to be consumed seamlessly using both traditional Node.js-style callbacks and modern Promises. It provides `fromCallback` to wrap internal callback-based logic for promise consumption and `fromPromise` to adapt promise-based logic for callback consumption. The package is currently at version 2.1.1 and appears to be in active maintenance, receiving updates as needed. Its primary differentiator is its focused approach to providing this dual-consumption pattern without imposing a heavy dependency footprint. It explicitly handles error propagation in `fromPromise` by calling the callback in a `queueMicrotask` to prevent errors from being caught by the promise chain, ensuring clear error reporting to the consumer. It is suitable for both Node.js (>=6) and browser environments, and ships with TypeScript types.

Common errors

Warnings

Install

Imports

Quickstart

Demonstrates how to create modules that internally use either callbacks or promises, and how `catering` enables them to be consumed with both `async/await` and traditional Node.js callbacks.

import { fromCallback, fromPromise } from 'catering';

const kPromise = Symbol('promise');

// Example: Internally uses callbacks
function createCallbackModule(callback) {
  callback = fromCallback(callback, kPromise);
  setTimeout(() => {
    // Simulate async operation
    if (Math.random() > 0.5) {
      callback(null, 'Data from callback source');
    } else {
      callback(new Error('Failed to get callback data'));
    }
  }, 100);
  return callback[kPromise];
}

// Example: Internally uses promises
function createPromiseModule(callback) {
  const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
      // Simulate async operation
      if (Math.random() > 0.5) {
        resolve('Data from promise source');
      } else {
        reject(new Error('Failed to get promise data'));
      }
    }, 100);
  });
  return fromPromise(promise, callback);
}

async function runExamples() {
  console.log('--- Callback Module Example ---');
  try {
    const result = await createCallbackModule();
    console.log('Async/await result:', result);
  } catch (error) {
    console.error('Async/await error:', error.message);
  }

  createCallbackModule((err, result) => {
    if (err) console.error('Callback error:', err.message);
    else console.log('Callback result:', result);
  });

  console.log('\n--- Promise Module Example ---');
  try {
    const result = await createPromiseModule();
    console.log('Async/await result:', result);
  } catch (error) {
    console.error('Async/await error:', error.message);
  }

  createPromiseModule((err, result) => {
    if (err) console.error('Callback error:', err.message);
    else console.log('Callback result:', result);
  });
}

runExamples();

view raw JSON →