Skip to content

Latest commit

 

History

History
141 lines (118 loc) · 4.35 KB

README.md

File metadata and controls

141 lines (118 loc) · 4.35 KB

interceptable

Easily intercept calls to function properties

Build Status Coverage Status NPM Downloads Dependencies Known Vulnerabilities

Introduction

With this module, you can intercept calls to function properties on an object

  • You hook in before and/or after a function is called
  • Both sync and async function calls are interceptable

Installation

$ npm install interceptable --save

Demo's

Intercept synchronous functions that return a value (sync / success)

const interceptable = require('interceptable');

const obj = {
  sayHello(name) {
    console.log('... inside sayHello');
    return `Hello ${name}!`;
  }
};

const interceptor = ({ fn, args }) => {
  console.log(`BEFORE call to ${fn} with args ${args}`);
  return {
    onSuccess(result) {
      console.log(`AFTER call to ${fn} with args ${args} -> result: ${result}`);
    },
  };
};

const interceptableObj = interceptable(obj, interceptor);
interceptableObj.sayHello('Sam');

// OUTPUT:
// BEFORE call to sayHello with args Sam
// ... inside sayHello
// AFTER call to sayHello with args Sam -> result: Hello Sam!

Intercept synchronous functions that throw an error (sync / error)

const interceptable = require('interceptable');

const obj = {
  sayHello(name) {
    console.log('... inside sayHello');
    throw new Error(`Cannot say hello to ${name}!`);
  }
};

const interceptor = ({ fn, args }) => {
  console.log(`BEFORE call to ${fn} with args ${args}`);
  return {
    onError(err) {
      console.log(`AFTER call to ${fn} with args ${args} -> error: ${err.message}`);
    },
  };
};

const interceptableObj = interceptable(obj, interceptor);
interceptableObj.sayHello('Sam');

// OUTPUT:
// BEFORE call to sayHello with args Sam
// ... inside sayHello
// AFTER call to sayHello with args Sam -> error: Cannot say hello to Sam!
// /Users/seb/Work/Github/interceptable/src/interceptable.js:20
//             throw err;
//             ^
// 
// Error: Cannot say hello to Sam!
//     at Object.sayHello (/Users/seb/Work/Github/interceptable/manual.js:6:11)
//      ... 

Intercept asynchronous functions that resolve a value (async / success)

const interceptable = require('interceptable');

const obj = {
  sayHello(name) {
    console.log('... inside sayHello');
    return Promise.resolve(`Hello ${name}!`);
  }
};

const interceptor = ({ fn, args }) => {
  console.log(`BEFORE call to ${fn} with args ${args}`);
  return {
    onSuccess(result) {
      console.log(`AFTER call to ${fn} with args ${args} -> result: ${result}`);
    },
  };
};

const interceptableObj = interceptable(obj, interceptor);
interceptableObj.sayHello('Sam');

// OUTPUT:
// BEFORE call to sayHello with args Sam
// ... inside sayHello
// AFTER call to sayHello with args Sam -> result: Hello Sam!

Intercept asynchronous functions that rejects an error (async / error)

const interceptable = require('interceptable');

const obj = {
  sayHello(name) {
    console.log('... inside sayHello');
    return Promise.reject(new Error(`Cannot say hello to ${name}!`));
  }
};

const interceptor = ({ fn, args }) => {
  console.log(`BEFORE call to ${fn} with args ${args}`);
  return {
    onError(result) {
      console.log(`AFTER call to ${fn} with args ${args} -> result: ${result}`);
    },
  };
};

const interceptableObj = interceptable(obj, interceptor);
interceptableObj.sayHello('Sam');

// OUTPUT:
// BEFORE call to sayHello with args Sam
// ... inside sayHello
// AFTER call to sayHello with args Sam -> result: Hello Sam!
// (node:26506) UnhandledPromiseRejectionWarning: Error: Cannot say hello to Sam!
//     at Object.sayHello (/Users/seb/Work/Github/interceptable/manual.js:6:27)
//     ...