View on GitHub


Test Coverage
# [![OnionSkin](logo/onionskin.png)](http://onionskin.io) [OnionSkin](http://onionskin.io)  #
[![NPM version](https://badge.fury.io/js/onionskin.svg)](http://badge.fury.io/js/onionskin) [![Dependency Status](https://david-dm.org/onionskin/onionskin.svg)](https://david-dm.org/onionskin/onionskin) [![Build Status](https://travis-ci.org/onionskin/onionskin.svg?branch=master)](https://travis-ci.org/onionskin/onionskin) [![Code Climate](https://codeclimate.com/github/onionskin/onionskin.png)](https://codeclimate.com/github/onionskin/onionskin) [![Code Climate](https://codeclimate.com/github/onionskin/onionskin/coverage.png)](https://codeclimate.com/github/onionskin/onionskin)

OnionSkin is multi-layer cache manager library that works with Node.js and vanilla javascript

## Installation ##

You can either install via [npm](https://www.npmjs.org)

$ npm install onionskin

Or via [bower](http://bower.io/)

$ bower install onionskin

Or you can just grab a copy of it [here](https://raw.githubusercontent.com/onionskin/onionskin/master/dist/onionskin.js)

### Basic Usage ###

// Library is exposed on the browser with browserify for API consistency with node.js
var OnionSkin = require('onionskin');

// Initialize a pool
var pool = new OnionSkin();

pool.get('my/key/path', function (err) {
  // Data is either inexistent or expired
  return slowFuncThatReturnsPromise();
}).then(function (value) {
  // The value that was either on cache or was just generated

## Documentation ##

You can find more usage examples at the website's [Getting Started](http://onionskin.io/#getting-started) section
Also there is the [API Documentation](http://onionskin.io/api)

## Need help? ##

You can:

* Talk to me at [@onionskinjs](http://twitter.com/onionskinjs)
* Ask a question at [StackOverflow](http://stackoverflow.com)
* Send me an email at [contact@onionskin.io](mailto:contact@onionskin.io)

## Want to help? ##

So you decided you want to help... This is awesome!!!
Follow this steps and I will be really glad to merge your work and add you to the contributors!

* [Fork](https://help.github.com/articles/fork-a-repo) the project
* Clone it and create a branch with the name of the feature you intend to add

    $ git clone git@github.com:username/onionskin.git
    $ git checkout -b new-feature-name

* Install the dependencies

    $ bower install # for browser tests
    $ npm install # for node.js tests

* Please add tests to your features. 
  1. Tests run with [Mocha](http://visionmedia.github.io/mocha/) and use [Chai](http://chaijs.com) for expectations.
  1. Expect is preferred to should due to browser compatibility
  1. The test folder respect the same structure as the source, you can run the tests through npm:
    $ npm test

    or run specific tests with mocha:

    mocha test/stash/drivers/*.js

    you also can run the tests on browser

    open test/index.html
* Send me a [pull request](https://help.github.com/articles/using-pull-requests)

## What is coming next ##

* WebSQL, Cassandra, MongoDB [, ... ] drivers
* Benchmarks
* More examples

## Contributors ##

This project was created by [@tadeuzagallo](http://twitter.com/tadeuzagallo) inspired by a PHP library
named [Stash](http://stash.tedivm.com) and was originally Stash.js.
If you want to join just follow the [instructions](#want-to-help), any help will be very welcome.

## Changelog

### 1.0.1
* The function to generate missing cache should be passed as the last parameter to `pool.get`, although generating cache `Promise.catch` is still supported the cache will never be unlocked if `item.save` or `item.set` are not called.
* Also when the cache generator function is passed as parameter, there is no need to call either `item.save` or `item.set`, just return the value you want to be cached and it will automatically saved and passed along to the promise chain.