Sign Up for Free

RunKit +

Try any Node.js package right in your browser

This is a playground to test code. It runs a full Node.js environment and already has all of npm’s 400,000 packages pre-installed, including mutacache with all npm packages installed. Try it out:

var mutacache = require("mutacache")

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

mutacache v0.0.2

A safe cache for mutable objects


A cache for mutable javascript data structures.

Do you want to cache an object and then mutate it without affecting the cached representation? Yes? Then this is the cache for you.

The Problem

Should this happen?

NODE> cache.put('x', {a: 'a', b: 'b', c: 'c'})
{ a: 'a', b: 'b', c: 'c' }
NODE> cache.get('x')
{ a: 'a', b: 'b', c: 'c' }
NODE> var theValueNow = cache.get('x')
NODE> delete theValueNow.a
NODE> delete theValueNow.b
NODE> delete theValueNow.c
NODE> = true
NODE> cache.get('x')
{ lol: true }

I don't think so. This cache won't do that.


npm install mutacache --save


The simplest case, storing a primitive:

var cache = require('mutacache')();

cache.put('key', 'value');
if (cache.has('key')) {
  cache.get('key'); // returns 'value'

Storing an object:

var cache = require('mutacache')();

cache.put('key', {a:'a', b:'b', c:'c'});
if (cache.has('key')) {
  var x = cache.get('key');  //returns {a:'a', b:'b', c:'c'}
  x.a = 'lol';
  cache.get('key');  // still returns {a:'a', b:'b', c:'c'}


The mutacache function takes an object of options,

  • cacheFunctions A boolean, defines whether functions should be cached. Default false.

Caching Functions

Caching functions is useful, but it's use invokes an alternate copying mechanism that has performance penalties.

This is probably applicable for more than Function types.

var nonFnCacher = require('mutacache')();
var fnCacher = require('mutacache')({cacheFunctions:true});

function abc() {
  // something important here

nonFnCacher.put('key', {a:'a', fn:abc});
if (nonFnCacher.has('key')) {
  var x = nonFnCacher.get('key');  //returns {a:'a'}

fnCacher.put('key', {a:'a', fn:abc});
if (fnCacher.has('key')) {
  var x = fnCacher.get('key');  //returns {a:'a', fn:abc}


This cache copies values on insertion and retrieval, and Javascript data structures aren't really built for that. Don't use this if you're looking for raw speed.

And, some TODOs:

  • Add cache busting
  • TTLs


Copyright © 2014 Dan Midwood

Distributed under the Apache License, Version 2.0

RunKit is a free, in-browser JavaScript dev environment for prototyping Node.js code, with every npm package installed. Sign up to share your code.
Sign Up for Free