{"_id":"collective","_rev":"33-a2bcc7a664a61150a0bfc55643d7c292","name":"collective","description":"Data synchronization/cache tool for multiple Node.js instances.","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"collective","version":"0.1.0","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization across multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.1.8"},"keywords":["cluster","load balancing","multi process","data synchronization"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":{"name":"https://github.com/arch1t3ct/collective.js/issues"},"repository":{"type":"git","url":"git://github.com/arch1t3ct/collective.js.git"},"_npmUser":{"name":"arch1t3ct","email":"a@ndri.us"},"_id":"collective@0.1.0","dependencies":{},"optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"a3bb3a343c2ab1ad8a093552f7cbafdebcd9e46c","tarball":"https://registry.npmjs.org/collective/-/collective-0.1.0.tgz","integrity":"sha512-OUyp/7xW2+WKz8UOvu5vzXhBwRcv9+Qya9zVcwwz3S2Z/4FvmhvYRtjqA0/+kYzAGdnmWFqb8yKTLkxuaFMvEA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIQDEF5WJJyjsO0eakALRCydE0iqscRAIhTHINIgOBwGZQAIfTfaXi+967EsM0Xcp0ahEL6t2C8KbJpW+MDnUkRPOcQ=="}]},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}],"directories":{}},"0.2.0":{"name":"collective","version":"0.2.0","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.1.9"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":{"name":"https://github.com/arch1t3ct/collective.js/issues"},"repository":{"type":"git","url":"git://github.com/arch1t3ct/collective.js.git"},"_npmUser":{"name":"arch1t3ct","email":"a@ndri.us"},"_id":"collective@0.2.0","dependencies":{},"optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"390fa62701ff35b4a9068845f0f4e292aabd95e1","tarball":"https://registry.npmjs.org/collective/-/collective-0.2.0.tgz","integrity":"sha512-peaeklsLqfGRUA7I6sfnLSp3lNfGo0h3DvvBman3LaqWXzAN7rKkJg84w2e0uu9I3WmnAv76li7ncO4HCItmwQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCv8FogRML7KrLsH8cIpDf6JHCLzwVIo4XavIsyzGrujwIgWA0knmBH3FgHJucowHUzNI6z5l1ZE7a5k6GF2ccAXsM="}]},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}],"directories":{}},"0.2.1":{"name":"collective","version":"0.2.1","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.1.9"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":{"name":"https://github.com/arch1t3ct/collective.js/issues"},"repository":{"type":"git","url":"git://github.com/arch1t3ct/collective.js.git"},"_npmUser":{"name":"arch1t3ct","email":"a@ndri.us"},"_id":"collective@0.2.1","dependencies":{},"optionalDependencies":{},"_engineSupported":false,"_npmVersion":"1.1.19","_nodeVersion":"v0.6.18","_defaultsLoaded":true,"dist":{"shasum":"7359fa618a17d2ca8f0c11fde1edd58a16b4fb4c","tarball":"https://registry.npmjs.org/collective/-/collective-0.2.1.tgz","integrity":"sha512-dpQSV4WbPtwv4XUSjTkA3zZfq5+IwPt4ORaZUapNI2R4+H/mLCArHYw9ReEwfluMFxJvLCotGPopnMOrByyJUg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzPTjid4Gj+CP10d+YndvDaNHvNgJSxOPzywmx2xHfiwIgKPu7ajbs3F8DRxVAIjWhfw5Q6UMzLOgw5nAxiIRJQ8w="}]},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}],"directories":{}},"0.2.2":{"name":"collective","version":"0.2.2","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.1.9"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":"https://github.com/arch1t3ct/collective.js/issues","repository":{"type":"git","url":"https://github.com/arch1t3ct/collective.js.git"},"_id":"collective@0.2.2","dist":{"shasum":"d2012b58e55aaa4792f6b909cd8922248953d52d","tarball":"https://registry.npmjs.org/collective/-/collective-0.2.2.tgz","integrity":"sha512-CLyXO4Z8rpL/I3Rl3ayPqLDwIK0vB5QkrBeVg7NZxXaHtn6m+4O0uWQCdACT0x/FHj36t2WU3rLyEMpsJKA8EQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCUlwCwrSFcf723xvTqM6X0cOVL9anIaVyIOOikBSFu1QIgUdA3MuE44hy6WzzXa3/kuj8RcwTdqGvM1CS+FuyCZlg="}]},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}],"directories":{}},"0.2.3":{"name":"collective","version":"0.2.3","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.1.9"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":"https://github.com/arch1t3ct/collective.js/issues","repository":{"type":"git","url":"https://github.com/arch1t3ct/collective.js.git"},"scripts":{"test":"node test/index.js"},"_id":"collective@0.2.3","dist":{"shasum":"84e33f35338260e0b905603e6e2e5b8a2dcadeed","tarball":"https://registry.npmjs.org/collective/-/collective-0.2.3.tgz","integrity":"sha512-9vJHkiD48KezJ1qufcwkBuTax7BqHijVhHn+FQRGB7hnsjX5wyLD6cJ0R9nL6h4SKqHmQ2MRqN4xHiRAvOgAAg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAr8unzzbDbIPKthOsbbJgvWtil0T9MPX9nEH11eNVeAAiEAlP10yt3KNJGXmEcr4A1N7mZTgolL4h9l1boJTwRz6vM="}]},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}]},"0.2.4":{"name":"collective","version":"0.2.4","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.1.9"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":{"url":"https://github.com/arch1t3ct/collective.js/issues"},"repository":{"type":"git","url":"https://github.com/arch1t3ct/collective.js.git"},"scripts":{"test":"node test/index.js"},"_id":"collective@0.2.4","dist":{"shasum":"1facc534d27b68881efd47ecf2d0dcb6fa24d3f7","tarball":"https://registry.npmjs.org/collective/-/collective-0.2.4.tgz","integrity":"sha512-KNoaZuJ1AC3lr82OUlkzwLCJ25d8rAei0lwBkoI/cPoZ/kCf8vsraYszk1PtW6ysBQRVxSutKH0V6qs6gaXK3g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBrdoDaJhx6/cq3lFKDOJeclaleB0I7kWMOdeurmxiRIAiEAqGjYhlmJRP4WcAC6PvPiMgTgVxzxe9cSwvAkp3cgWGc="}]},"_from":".","_npmVersion":"1.2.21","_npmUser":{"name":"arch1t3ct","email":"a@ndri.us"},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}]},"0.2.5":{"name":"collective","version":"0.2.5","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.1.9"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":{"url":"https://github.com/arch1t3ct/collective.js/issues"},"repository":{"type":"git","url":"https://github.com/arch1t3ct/collective.js.git"},"scripts":{"test":"node test/index.js"},"_id":"collective@0.2.5","dist":{"shasum":"a6714b06ea175c00a308d61aad3b14b75445311d","tarball":"https://registry.npmjs.org/collective/-/collective-0.2.5.tgz","integrity":"sha512-rURfvjoqIfV2gdxp+KxRz6zLMxhJEdZE4S8p0MPKxC5z0lMLeBwWo8Umk8Ae9q2U3K4rOdaPrKNAyLtHdX2agg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG1lvlR+JgaSj/1G41K663mOTLHm1JjYXcBMWli04dT+AiEA6whLwxJatt04XBe3UWp5muNGqGZqXEY7y4IL8C0weCA="}]},"_from":".","_npmVersion":"1.2.21","_npmUser":{"name":"arch1t3ct","email":"a@ndri.us"},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}]},"0.2.6":{"name":"collective","version":"0.2.6","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.1.9"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":{"url":"https://github.com/arch1t3ct/collective.js/issues"},"repository":{"type":"git","url":"https://github.com/arch1t3ct/collective.js.git"},"scripts":{"test":"node test/index.js"},"_id":"collective@0.2.6","dist":{"shasum":"2db833a1341364600e2ddbdbf447ee9d46e65604","tarball":"https://registry.npmjs.org/collective/-/collective-0.2.6.tgz","integrity":"sha512-6GGf5m2BVd+gCCA4XIFRGVDRrSEytjF+PbAZ94wIxBFZ+sSuIm4lDlNHTS2xF0tNKmOcM0N/6vqAi/iLOjrG9g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFgf8eWjW9XT3YOqZVzXg9xwYzN0EzfMjiPmTbjy+RlGAiEA2LX0BMflIhiLlAc4jvNWTvq7gabBVriif0Ou8B94JXk="}]},"_from":".","_npmVersion":"1.3.6","_npmUser":{"name":"arch1t3ct","email":"a@ndri.us"},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}]},"0.3.0":{"name":"collective","version":"0.3.0","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.2.4"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":{"url":"https://github.com/arch1t3ct/collective.js/issues"},"repository":{"type":"git","url":"https://github.com/arch1t3ct/collective.js.git"},"scripts":{"test":"node test/index.js"},"_id":"collective@0.3.0","dist":{"shasum":"885a3a0dddfc7c6a8ca24bf533697ee20c86a384","tarball":"https://registry.npmjs.org/collective/-/collective-0.3.0.tgz","integrity":"sha512-x6skUc3wBFhtMhT/Rf3y1jc3871xFso+kVbzgrVuTEsdzakPLXtDgLRgvqwYqSL8KxOriHdkpytZBEFwMuFjdA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCjzjZALRhER3w0DQ2l+/rj7ir05noYdmJ4NAxS35yVKwIhAPlRcGo10R2yXsiuIhs/B5/SnJD3Ak7YkD3qQD2b2Oz/"}]},"_from":".","_npmVersion":"1.3.6","_npmUser":{"name":"arch1t3ct","email":"a@ndri.us"},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}]},"0.3.1":{"name":"collective","version":"0.3.1","author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"description":"Data synchronization/cache tool for multiple Node.js instances.","licenses":[{"type":"MIT","url":"https://raw.github.com/arch1t3ct/collective.js/master/LICENSE"}],"engines":{"node":">=0.8.x"},"devDependencies":{"jslint":"0.2.4"},"keywords":["cluster","load balancing","multi process","data synchronization","cache"],"homepage":"https://github.com/arch1t3ct/collective.js","bugs":{"url":"https://github.com/arch1t3ct/collective.js/issues"},"repository":{"type":"git","url":"https://github.com/arch1t3ct/collective.js.git"},"scripts":{"test":"node test/index.js"},"_id":"collective@0.3.1","dist":{"shasum":"0724b33216da623acff303198a3e18152d97c393","tarball":"https://registry.npmjs.org/collective/-/collective-0.3.1.tgz","integrity":"sha512-8p2mUyDA90nKyB68znTKtCKi9DZ3HDydyjNyvHSSl663VNrizuUxeCf7qeB1YXhKDMNUv64cy+B+A6xMUilhRQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLSugZvzNTeiIo4lUvN5gZEfDXUfGzDCvEZdXp8y8V/gIgS+M/qWXedxofUGjK7oIBY0MA7XcqCQ3m02OJ/3OBhYE="}]},"_from":".","_npmVersion":"1.3.24","_npmUser":{"name":"arch1t3ct","email":"a@ndri.us"},"maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}]}},"readme":"[![build status](https://secure.travis-ci.org/arch1t3ct/collective.js.png)](http://travis-ci.org/arch1t3ct/collective.js)\n#collective.js\n\nA simple tool for synchronizing data across multiple [Node.js](http://nodejs.org/) instances. \nCreates dual one-way tcp connections to each remote instance. Every data change is asynchronously \nsent to all of those instances. Very useful when using with \n[Cluster](http://nodejs.org/api/cluster.html) module, multiple servers, cloud instances, or any \nother multi [Node.js](http://nodejs.org/) configuration.\n\n_Experimental. Use at your own risk. Is not suitable for systems which require 100% precision and \nsynchronous data updates._\n\n## Installation\n\n```\nnpm install collective\n```\n\n## Basic Usage (full example)\n\nA fully working demonstration on how to use this with single or multiple servers where \n[Cluster](http://nodejs.org/api/cluster.html) is used for [Node.js](http://nodejs.org/) scaling.\n\nEvery [Node.js](http://nodejs.org/) process has the same configuration with the exception of \n`localhost` variable which should be selected per server basis (if multiple servers are used):\n\n\n```js\n/* Load necessary modules */\nvar cluster = require('cluster');\nvar Collective = require('collective');\n\n/* Config. Edit to suit your needs */\nvar cpu_count = require('os').cpus().length; // A good practice to use all of availabe processors.\nvar hosts = ['127.0.0.1'/*, host2, host3, etc */]; // Depends on how many servers you have.\nvar localhost = hosts[0]; // Select a proper host from hosts pool for the current server.\nvar port = 9000; // Starting port. Arbitrary, really.\n\n/**\n *  Populate with all possible hosts based on cpu count. WARNING: This will not work if your servers\n *  have different cpu counts. If that's the case - create all_hosts array manually.\n */\nvar all_hosts = [];\nfor (var i = 0; i < hosts.length; i++) {\n    for (var j = 0; j < cpu_count; j++) {\n        all_hosts.push({host: hosts[i], port: port + j});\n    }\n}\n\n/* Bootup cluster */\nif (true === cluster.isMaster) {\n    /* Additional mapping is required in order to preserve worker ids when they are restarted. */\n    var map = {};\n\n    function forkWorker(worker_id) {\n        var worker = cluster.fork({worker_id: worker_id});\n\n        map[worker.id] = worker_id;\n    }\n\n    for (var i = 0; i < cpu_count; i++) {\n        forkWorker(i);\n    }\n\n    /* You should do some error logging here (left out for the sake of simplicity) */\n    cluster.on('exit', function (worker, code, signal) {\n        var old_worker_id = map[worker.id];\n\n        delete map[worker.id];\n\n        forkWorker(old_worker_id);\n    });\n} else {\n    /* Set a local host and a port for collective to use. Based on worker id. */\n    var local = {host: localhost, port: port + parseInt(process.env.worker_id, 10)};\n\n    /* Start collective. */\n    var collective = new Collective(local, all_hosts, function (collective) {\n        /**\n         *  All done! This is where you start your normal coding. Lines below are just a\n         *  demonstration of collective.js set/increment/delete synchronization capabilities.\n         */\n\n        collective.set('over.nine.thousand', 0);\n\n        /* Timeouts are for demonstration purposes only, just to wait for the final result. */\n        setTimeout(function () {\n            console.log('Hey, I am ' + collective.local.host + ':' + collective.local.port\n                + ' and my \\'over.nine.thousand\\' key has a value of: '\n                + collective.get('over.nine.thousand'));\n\n            setTimeout(function () {\n                collective.set('over.nine.thousand', 9000, collective.OPERATIONS.INCREMENT);\n\n                setTimeout(function () {\n                    console.log('Hey, it\\'s me again, ' + collective.local.host + ':'\n                        + collective.local.port\n                        + ', and my \\'over.nine.thousand\\' key after 9000 x '\n                        + all_hosts.length + ' hosts increment operations has a value of: '\n                        + collective.get('over.nine.thousand'));\n\n                    setTimeout(function () {\n                        collective.set('over.nine.thousand', null, collective.OPERATIONS.DELETE);\n\n                        setTimeout(function () {\n                            console.log('Hey, once more it\\'s me, ' + collective.local.host + ':'\n                                + collective.local.port\n                                +', and my \\'over.nine.thousand\\' key after delete operation has a '\n                                + 'value of: ' + collective.get('over.nine.thousand'));\n                        }, 1000);\n                    }, 100);\n                }, 1000);\n            }, 100);\n        }, 100);\n    });\n}\n```\n\n## Features\n\n  * Non-blocking data synchronization across multiple [Node.js](http://nodejs.org/) processes and servers.\n  * Deep object notation sets and gets ('foo.bar.quz.etc...'). \n  * Seamless scaling. Add a host to `hosts` variable and restart [Node.js](http://nodejs.org/). That's it.\n  * Blazing fast! Data is stored in-memory (javascript variable).\n  * SET, INCREMENT, DELETE your data.\n\n## API\n#### collective.set(key, value, operation);\n\n###### Arguments\n`key` - **String** location where to store a value. Dots (this.is.my.var) are supported which will result in 4 level deep object.  \n`value` - **Mixed** anything you want to store. Internally values are converted to JSON string so no need to do that beforehand.  \n`operation` - **Integer** what you want to do. Currently 3 operations are supported: SET (default), INCREMENT, DELETE.\n```js\ncollective.set('this.is.my.var', 9000); // Sets a value. Creates if doesn't exist, replaces if does.\ncollective.set('this.is.my.var', 1, collective.OPERATIONS.INCREMENT); // Increments a value. Should be 9001 after this.\ncollective.set('this.is.my.var', null, collective.OPERATIONS.DELETE); // Deletes last part of the key (var in this case). Value is ignored.\n```\n\n#### collective.get(key);\n\n###### Arguments\n`key` - **String** location from which to retrieve a value.\n```js\ncollective.get('this.is.my.var'); // Results in: 9001\ncollective.get('this.is.my'); // Results in: {var: 9001}\n```\n\n## Testing and JSlint\n\nRunning the tests:\n```\nnode test/index.js\n```\n\nChecking code standards:\n```\n./build/jslint.sh\n```\n\n## More information\n\nArticle (a bit outdated) about the inner workings and concepts can be found on my [blog/portfolio](http://a.ndri.us/blog/collective-js-increase-your-node-js-application-performance-even-more).\n\n\nTo this date, this library has been tested with 3 servers, 8 processes each, with 3 level object nesting and a total \nof about 2 000 000 keys with up to 100 SET operations per second.\n\nFor better understanding I would also recommend looking at `test/index.js` file.\n\n## License\n\nCopyright (c) 2012-2013 Andrius Virbičianskas <a@ndri.us> (http://a.ndri.us/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and \nassociated documentation files (the \"Software\"), to deal in the Software without restriction, \nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, \nsublicense, and/or sell copies of the Software, and to permit persons to whom the Software is \nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial \nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT \nNOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND \nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES \nOR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN \nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","maintainers":[{"name":"arch1t3ct","email":"a@ndri.us"}],"time":{"modified":"2022-06-13T06:30:34.652Z","created":"2012-07-26T12:28:47.873Z","0.1.0":"2012-07-26T12:28:49.940Z","0.2.0":"2012-08-08T17:45:07.024Z","0.2.1":"2012-08-13T06:01:18.871Z","0.2.2":"2012-08-13T06:55:49.306Z","0.2.3":"2012-08-28T09:34:27.289Z","0.2.4":"2013-06-19T13:12:18.762Z","0.2.5":"2013-07-15T11:24:23.206Z","0.2.6":"2013-10-09T07:24:26.241Z","0.3.0":"2013-11-19T09:43:41.886Z","0.3.1":"2014-05-23T07:43:25.503Z"},"author":{"name":"Andrius Virbičianskas","email":"a@ndri.us","url":"http://a.ndri.us/"},"repository":{"type":"git","url":"https://github.com/arch1t3ct/collective.js.git"},"users":{"fgribreau":true,"master-1-":true},"homepage":"https://github.com/arch1t3ct/collective.js","keywords":["cluster","load balancing","multi process","data synchronization","cache"],"bugs":{"url":"https://github.com/arch1t3ct/collective.js/issues"},"readmeFilename":"README.md"}