{"_id":"server-backbone-redis","_rev":"21-816e30e957c432bd09839c9f2aa8684e","name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","dist-tags":{"latest":"0.0.9"},"versions":{"0.0.1":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":"0.3.1","underscore":">=1.0.7"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.1","_npmJsonOpts":{"file":"/home/jparadis/.npm/server-backbone-redis/0.0.1/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"server-backbone-redis@0.0.1","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"2da0106ba12f3503a9526be5ae47826760514a73","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.1.tgz","integrity":"sha512-iNDkoySaFTTGapB59qrULyUoC0Sw9Z9LVXeLlat50GX0wu8SWTJYkVqSlwOBI1/9LsmcFw266bD/L5861anLhQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGB/DDqFJSLTGx5jVtjgOX0C1RUGnkTC8iPal+SKDsT4AiBLDfy12Dcaod/VvliyMKU9YVlWgs20hMNvrY0AQbe1kg=="}]},"scripts":{},"maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]},"0.0.2":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":">=0.6.7","underscore":">=1.1.2","backbone":">=0.5.3"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.2","_npmJsonOpts":{"file":"/home/jparadis/.npm/server-backbone-redis/0.0.2/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"server-backbone-redis@0.0.2","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"3cd96bec6fbdc4d13cd2dfaa068b27b39044b6db","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.2.tgz","integrity":"sha512-POv/1prK1loK30uAMp88AdOUXefkQxsl9rSHtZCxNHEDRWJJekyBmxaX/Da/nL6K+IF+rHHEdxCeAPrjTeBp3Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCQ7b46iaC+Keg1Joae7lUddM25gKIKifqWN2zXZbEyBAIgHd1WVZUI0ThWqYxtudWrn5FHLAypxqpoLYHa6xuQpk0="}]},"scripts":{},"maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]},"0.0.3":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":">=0.6.7","underscore":">=1.1.2","backbone":">=0.5.3"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.3","_npmJsonOpts":{"file":"/home/jparadis/.npm/server-backbone-redis/0.0.3/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"server-backbone-redis@0.0.3","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"74f96162b5034d4cfe236b179fcbfafa5caa3f3a","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.3.tgz","integrity":"sha512-lI8ISIdwhfpBbcjFvoQEtKg5FZ2O+dOfXIsDO79V5QLvt7pvVy+GdtUF2C1f4iPgmxbpvXQY9MhYBf3a+G7fAg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCcNTxd6dMuezMza9hlBjnqvINoWRIZN2Hsf8YVHD4TCAIhANO9L7u+XQREEMkZdxt1Cn7G6jx9W+xlZn64l2qvKeTh"}]},"scripts":{},"maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]},"0.0.4":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":">=0.6.7","underscore":">=1.1.2","backbone":">=0.5.3"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.4","_npmJsonOpts":{"file":"/home/jparadis/.npm/server-backbone-redis/0.0.4/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"server-backbone-redis@0.0.4","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"abac120010f00f9337f9d7bada8e5103f14755e1","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.4.tgz","integrity":"sha512-ndtmElcCJ7rCtlBOP2FKh7YkhKN4pXlrmMJ8GKasJmWRHTNqq+s8v6Bmvj3xc/lXYgY5j6AdTVVW8XFrH9Ib9Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDcCeNz8Uj+61M3rO4AEggHvDPm6NtrknpLJGp2Q2XS4wIhAMVDCaNAsxuqY5fG/dia6OcpcUCU1jFtQK7pQKbqS/4L"}]},"scripts":{},"maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]},"0.0.5":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":">=0.6.7","underscore":">=1.1.2","backbone":">=0.5.3"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.5","_npmJsonOpts":{"file":"/home/jparadis/.npm/server-backbone-redis/0.0.5/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"server-backbone-redis@0.0.5","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"28bb44f668a46297d2b8c3e63a2e65c1bf90b59b","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.5.tgz","integrity":"sha512-AH1sUFBpYZynbZvLkAxBIWzIsQvux+jeAa5BqazS670c/fF8gZl5VtlQzUwghQbYbmm4hn1eocgwDV6SHGDl8g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCkOOzX+5Po78sFAfxUcxJAjRuA/6JcZCjFodXQlBhUjgIhAK0ODsBTB7fky53WEVWr7wf4nc4+6Fbh2EC91T6R+Pnr"}]},"scripts":{},"maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]},"0.0.6":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":">=0.6.7","underscore":">=1.1.2","backbone":">=0.5.3"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.6","_npmJsonOpts":{"file":"/home/jparadis/.npm/server-backbone-redis/0.0.6/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"server-backbone-redis@0.0.6","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"d370b109a99cf3da6d39464dede4702aaf61214f","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.6.tgz","integrity":"sha512-/jqV+6KxK3vWpjp9sYpJS/2cyl4x79pHvvTJDpIy31LvhXfvZj5nmVGujRsNdsXOM7KtmbXmtdXcnG26vFYLIw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCDNQyn6Kc+25u2jqK3nIc5nfS0OvE02Jbjg1Jxt/uL8wIgUMYUCSbbQGiCWmJD2eXIL/TRF3AUItd82ULS33BlvE8="}]},"scripts":{},"maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]},"0.0.7":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":">=0.6.7","underscore":">=1.1.2","backbone":">=0.5.3"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.7","_npmJsonOpts":{"file":"/home/jparadis/.npm/server-backbone-redis/0.0.7/package/package.json","wscript":false,"contributors":false,"serverjs":false},"_id":"server-backbone-redis@0.0.7","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.23","_nodeVersion":"v0.4.10","_defaultsLoaded":true,"dist":{"shasum":"6179127030287ec5d640771a0ff69c08afc5ca06","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.7.tgz","integrity":"sha512-yTCKnMbmZEtu2wOR0fli7zYaqGhQsXA3VdPamJxgxEJ0VJ5v13RUNDox9JYrC6ocspe4cuaKZbr3MV4O05c3hw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDKkcXp8dDC4w4SdpD5UCZNN55EJ/EXgoFedrzwLavOKwIhALumXlp1LfhhOGy0y9eSyLd4zVy717N6l//1B9hBjCTv"}]},"scripts":{},"maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]},"0.0.8":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":">=0.6.7","underscore":">=1.1.2","backbone":">=0.5.3"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.8","_npmUser":{"name":"jeromeparadis","email":"paradis.jerome+npm@gmail.com"},"_id":"server-backbone-redis@0.0.8","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"b0c16e18c2f6510ced79a7768c58e78bf4c7242b","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.8.tgz","integrity":"sha512-s9VgOd0CjbV1IdexxTiXi8rPjV7OPWdxcgrV8mZlVvHuu6iwT9+mkdmL0k/7D+0ZT74OfvwOZGXkEFg6JjYZew==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCtPap2XpD2+aH4Pib6Tec7rJsoole1MyKGiob42smLugIgJWYjVzEVsBmWku3ti9hidICCZIfKmj08x5iTqIp6IZE="}]},"readme":"# Why?\r\n\r\nI created this module because in a socket.io app I'm working on, all data is created, processed and persisted on the server. By having the models on the server-side with a Redis data store, it is easy to persist the data. With the export/import to JSON from JSON functionality, I can easily push data to clients connected through socket.io. Then, on the client-side, I continue to use the backbone models within views to update the UI.\r\n\r\n# Documentation\r\n\r\n* For up-to-date documentation, see the [Wiki](https://github.com/JeromeParadis/server-backbone-redis/wiki)\r\n* I sometimes update the doc at the bottom of this README\r\n\r\n# Dependencies\r\n\r\n\tnpm install underscore\r\n\tnpm install backbone\r\n\tnpm install redis\r\n\r\n# Install Latest version\r\n\r\n\tnpm install server-backbone-redis\r\n\t\r\n# Howto\r\n\r\n## Documentation\r\n\r\nThis module does two things:\r\n\r\n* sharing of models through server and client for a single code base\r\n* using Redis on the server-side as a data store to Backbone\r\n\r\n## Backbone Models\r\nYou can share your Backbone models for a single definition on the server and the client. Example of a ./models/models.js file. It uses CommonJS to include the right stuff when included in a node application. On the server side and client side, you will always use models.Backbone instead of Backbone.\r\n\r\nCreate the name property in your models to define the object name. This name will be reused to generate Redis keys. Example:\r\n\r\n* Model name = \"user\", ID=2 -> Redis key = \"user:2\"\r\n\t\r\n\t    (function () {\r\n\t    var server = false, models;\r\n\t    if (typeof exports !== 'undefined') {\r\n\t\tBackbone = require('../../../server-backbone-redis');\r\n\r\n\t\tmodels = exports;\r\n\t\tserver = true;\r\n\r\n\t    } else {\r\n\t\tmodels = this.models = {};\r\n\t    }\r\n\r\n\t\tmodels.Backbone = Backbone;\r\n\r\n\t    //\r\n\t    //models\r\n\t    //\r\n\t\tmodels.User = Backbone.Model.extend({\r\n\t\t\tdefaults: {\r\n\t\t\t\t\"id\":\t\tnull,\r\n\t\t\t\t\"name\":\t\tnull,\r\n\t\t\t\t\"entry\":        null\r\n\t\t\t},\r\n\t\t\tinitialize: function() {\r\n\t\t\t\tvar time = new Date();\r\n\t\t\t\tif (!this.get(\"entry\"))\r\n\t\t\t\t\tthis.set({entry: time});\r\n\t\t\t},\r\n\t\t\tname: \"testuser\"\r\n\t\t});\r\n\r\n\t\tmodels.UsersCollection = Backbone.Collection.extend({\r\n\t\t    model: models.User\r\n\t\t});\r\n\r\n\t\tmodels.Wrapper = Backbone.Model.extend({});\r\n\r\n\r\n\r\n\t    })()\r\n\r\n## New JSON export/import model methods (available on server and client)\r\n### xport()\r\nExports object to JSON.\r\n### mport()\r\nImport data into object from JSON.\r\nEJS example:\r\n\r\n    var user1 = new models.User();\r\n    user1.mport('<%- user1.xport() %>');\r\n    \r\n\r\n## New server-side Backbone properties/methods\r\n### search(model_class,pattern,cb,err_cb)\r\n\r\nExample:\r\n\r\n    models.Backbone.search(models.User,\"*\",function(results) {\r\n        // follow the fetch collections results where results are an array of Backbone model attributes and not Backbone model objects\r\n        // NOTE: if (new models.User()).name === \"user\", then Redis is searched with \"keys user:*\" command\r\n        // So, we can load the collections ourselves\r\n        var users = new models.UsersCollection(results);\r\n        ... do something with users Backbone collection\r\n    },function(err) { console.log(err); });\r\n\r\n### search_delete(model_class,keypattern,cb,cb_err)\r\nSame as search() but will delete the objects of model_class who's IDs match the keypattern\r\n### setClient(rc)\r\nSetup Redis client to avoid creating a second Redis connection.\r\n### initServer(app)\r\nSetup a connect/express app with a handler to add a new server route the xport/mport script to the client. Script can be then include on the client:\r\n    <script type=\"text/javascript\" src=\"/sbr/backbone-exp-imp.js\"></script> \r\n### debug\r\nSet this property to true to show debugging information.\r\n\r\n## Typical usage on the server:\r\nOnce your models.js file is defined like above to include the server-side redis stuff. You simply include your models:\r\n\r\n    var models = require('./models/models');\r\nYou can access Backbone through models.Backbone.\r\n\r\n## Typical includes on the client:\r\n\r\n    <script type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js\"></script> \r\n    <script type=\"text/javascript\" src=\"http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.1.7/underscore-min.js\"></script> \r\n    <script type=\"text/javascript\" src=\"http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.5.1/backbone-min.js\"></script> \r\n    <script type=\"text/javascript\" src=\"/models/models.js\"></script> \r\n    <script type=\"text/javascript\" src=\"/sbr/backbone-exp-imp.js\"></script> \r\n\r\n\r\n## Redis data store\r\nServer-side, you can use standard Backbone methods to save/persist to redis. The store uses the xport() and mport() methods to save and fetch the objects content in Redis. You can use the usual Backbone model and collections methods such as:\r\n\r\n* model.fetch()\r\n* model.save()\r\n* collection.fetch()\r\n\r\nYou can supply your own Backbone IDs through the id property/attributes in Backbone models. If not supplied, the record will be incremented through a Redis incr counter. For example, the User model with it's name=\"user\" will internally use these Redis keys:\r\n\r\n    Record keys -> user:[ID]  (i.e.: \"user:1\", \"user:2\", \"user:3\", etc.\r\n    Counter key  -> \"next.user.id\"\r\n\r\nYou can specify your own keys to manually create relationship records. For example:\r\n\tmodels.User = Backbone.Model.extend({\r\n\t\tdefaults: {\r\n\t\t\t\"id\":\t\tnull,\r\n\t\t\t\"name\":\t\tnull\r\n\t\t},\r\n\t\tname: \"user\"\r\n\t});\r\n\r\n\t\t\r\n\tmodels.Group = Backbone.Model.extend({\r\n\t\tdefaults: {\r\n\t\t\t\"id\":\t\tnull\r\n\t\t\t\"name\":\t\tnull\r\n\t\t},\r\n\t\tname: \"group\"\r\n\t});\r\n\r\n\tmodels.UserGroup = Backbone.Model.extend({\r\n\t\tdefaults: {\r\n\t\t\t\"id\":\t\tnull\r\n\t\t\t\"specs\":\tnull\r\n\t\t},\r\n\t\tname: \"usergroup\"\r\n\t});\r\n\t...\r\n\t// user is loaded or fetched and has an id = 1 (Redis key: \"user:1\")\r\n\t//\r\n\t// group1 and group2 are fetched/saved and have ids 1 and 2 (Redis keys \"group:1\" & \"group:2\"\r\n\t...\r\n\tvar usergroup1 = new models.UserGroup({userid:user.id,groupid:group1.id});\r\n\tusergroup1.id = \"group:\" + group1.id + \":user:\" + user.id;\r\n\tusergroup1.save({},{success: function(saved) {\r\n\t\tconsole.log(\"Saved usergroup1: \" + saved.xport());\r\n\t}});\r\n\tvar usergroup2 = new models.UserGroup({userid:user.id,groupid:group2.id});\r\n\tusergroup2.id = \"group:\" + group2.id + \":user:\" + user.id;\r\n\tusergroup2.save({},{success: function(saved) {\r\n\t\tconsole.log(\"Saved usergroup2: \" + saved.xport());\r\n\r\n\t}});\r\n\t// Will create the user group records with Redis keys= \"usergroup:group:1:user:1\" and \"usergroup:group:2:user:1\"\r\n\r\n\r\n# Acknowledgments\r\n \r\n* xport()/mport() code taken from this fine article: http://andyet.net/blog/2011/feb/15/re-using-backbonejs-models-on-the-server-with-node/\r\n* This article inspired me to add Node.js server-side Redis support to backbone\r\n\r\n# Disclaimer / To Do\r\n\r\n* Use at your own risk\r\n* Some code is redundant. Some cleanup to do.\r\n* Haven't tested for Redis injection vulnerability. Sanitize/check IDs on server before doing any fetch/create, etc.\r\n* It was created to do everything on the server and push some updates to the client through socket.io. Could add some express routes and backbone.js code on client-side to make calls from the client.\r\n* No Redis pub/sub features\r\n\r\n# MIT License\r\n\r\nCopyright (c) 2011 Jerome Paradis\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n","maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]},"0.0.9":{"name":"server-backbone-redis","description":"Server-side backbone redis store for node.js. Also supports object/JSON export/import for server-side and client-side.","url":"http://github.com/JeromeParadis/server-backbone-redis/","keywords":["server-side","backbone","redis","store","data","model"],"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"},"contributors":[],"dependencies":{"redis":">=0.6.7","underscore":">=1.1.2","backbone":">=0.5.3"},"lib":"./lib","main":"server-backbone-redis.js","version":"0.0.9","_npmUser":{"name":"jeromeparadis","email":"paradis.jerome+npm@gmail.com"},"_id":"server-backbone-redis@0.0.9","devDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.0-beta-10","_nodeVersion":"v0.6.7","_defaultsLoaded":true,"dist":{"shasum":"b489178359536066333ba1dfb8fcdfa5c0df5b79","tarball":"https://registry.npmjs.org/server-backbone-redis/-/server-backbone-redis-0.0.9.tgz","integrity":"sha512-HxyBBbUnZ7XfQtz5nn8W54KuaTA6vKx5PhBj5UTWrFlCk5KeFiiIcg9fdFXiJdwgvuHL0Qp++0K/6UD5d2nryg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFmdIyWDKYfCdxvZm/FBSTbPUPSnWTHmbnhXB4XhSs+GAiEAngMb8JtNB2XGzEg+YAt8mPw2WXMfOttVIrETLgHY/Y4="}]},"readme":"# Why?\r\n\r\nI created this module because in a socket.io app I'm working on, all data is created, processed and persisted on the server. By having the models on the server-side with a Redis data store, it is easy to persist the data. With the export/import to JSON from JSON functionality, I can easily push data to clients connected through socket.io. Then, on the client-side, I continue to use the backbone models within views to update the UI.\r\n\r\n# Documentation\r\n\r\n* For up-to-date documentation, see the [Wiki](https://github.com/JeromeParadis/server-backbone-redis/wiki)\r\n* I sometimes update the doc at the bottom of this README\r\n\r\n# Dependencies\r\n\r\n\tnpm install underscore\r\n\tnpm install backbone\r\n\tnpm install redis\r\n\r\n# Install Latest version\r\n\r\n\tnpm install server-backbone-redis\r\n\t\r\n# Howto\r\n\r\n## Documentation\r\n\r\nThis module does two things:\r\n\r\n* sharing of models through server and client for a single code base\r\n* using Redis on the server-side as a data store to Backbone\r\n\r\n## Backbone Models\r\nYou can share your Backbone models for a single definition on the server and the client. Example of a ./models/models.js file. It uses CommonJS to include the right stuff when included in a node application. On the server side and client side, you will always use models.Backbone instead of Backbone.\r\n\r\nCreate the name property in your models to define the object name. This name will be reused to generate Redis keys. Example:\r\n\r\n* Model name = \"user\", ID=2 -> Redis key = \"user:2\"\r\n\t\r\n\t    (function () {\r\n\t    var server = false, models;\r\n\t    if (typeof exports !== 'undefined') {\r\n\t\tBackbone = require('../../../server-backbone-redis');\r\n\r\n\t\tmodels = exports;\r\n\t\tserver = true;\r\n\r\n\t    } else {\r\n\t\tmodels = this.models = {};\r\n\t    }\r\n\r\n\t\tmodels.Backbone = Backbone;\r\n\r\n\t    //\r\n\t    //models\r\n\t    //\r\n\t\tmodels.User = Backbone.Model.extend({\r\n\t\t\tdefaults: {\r\n\t\t\t\t\"id\":\t\tnull,\r\n\t\t\t\t\"name\":\t\tnull,\r\n\t\t\t\t\"entry\":        null\r\n\t\t\t},\r\n\t\t\tinitialize: function() {\r\n\t\t\t\tvar time = new Date();\r\n\t\t\t\tif (!this.get(\"entry\"))\r\n\t\t\t\t\tthis.set({entry: time});\r\n\t\t\t},\r\n\t\t\tname: \"testuser\"\r\n\t\t});\r\n\r\n\t\tmodels.UsersCollection = Backbone.Collection.extend({\r\n\t\t    model: models.User\r\n\t\t});\r\n\r\n\t\tmodels.Wrapper = Backbone.Model.extend({});\r\n\r\n\r\n\r\n\t    })()\r\n\r\n## New JSON export/import model methods (available on server and client)\r\n### xport()\r\nExports object to JSON.\r\n### mport()\r\nImport data into object from JSON.\r\nEJS example:\r\n\r\n    var user1 = new models.User();\r\n    user1.mport('<%- user1.xport() %>');\r\n    \r\n\r\n## New server-side Backbone properties/methods\r\n### search(model_class,pattern,cb,err_cb)\r\n\r\nExample:\r\n\r\n    models.Backbone.search(models.User,\"*\",function(results) {\r\n        // follow the fetch collections results where results are an array of Backbone model attributes and not Backbone model objects\r\n        // NOTE: if (new models.User()).name === \"user\", then Redis is searched with \"keys user:*\" command\r\n        // So, we can load the collections ourselves\r\n        var users = new models.UsersCollection(results);\r\n        ... do something with users Backbone collection\r\n    },function(err) { console.log(err); });\r\n\r\n### search_delete(model_class,keypattern,cb,cb_err)\r\nSame as search() but will delete the objects of model_class who's IDs match the keypattern\r\n### setClient(rc)\r\nSetup Redis client to avoid creating a second Redis connection.\r\n### initServer(app)\r\nSetup a connect/express app with a handler to add a new server route the xport/mport script to the client. Script can be then include on the client:\r\n    <script type=\"text/javascript\" src=\"/sbr/backbone-exp-imp.js\"></script> \r\n### debug\r\nSet this property to true to show debugging information.\r\n\r\n## Typical usage on the server:\r\nOnce your models.js file is defined like above to include the server-side redis stuff. You simply include your models:\r\n\r\n    var models = require('./models/models');\r\nYou can access Backbone through models.Backbone.\r\n\r\n## Typical includes on the client:\r\n\r\n    <script type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js\"></script> \r\n    <script type=\"text/javascript\" src=\"http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.1.7/underscore-min.js\"></script> \r\n    <script type=\"text/javascript\" src=\"http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.5.1/backbone-min.js\"></script> \r\n    <script type=\"text/javascript\" src=\"/models/models.js\"></script> \r\n    <script type=\"text/javascript\" src=\"/sbr/backbone-exp-imp.js\"></script> \r\n\r\n\r\n## Redis data store\r\nServer-side, you can use standard Backbone methods to save/persist to redis. The store uses the xport() and mport() methods to save and fetch the objects content in Redis. You can use the usual Backbone model and collections methods such as:\r\n\r\n* model.fetch()\r\n* model.save()\r\n* collection.fetch()\r\n\r\nYou can supply your own Backbone IDs through the id property/attributes in Backbone models. If not supplied, the record will be incremented through a Redis incr counter. For example, the User model with it's name=\"user\" will internally use these Redis keys:\r\n\r\n    Record keys -> user:[ID]  (i.e.: \"user:1\", \"user:2\", \"user:3\", etc.\r\n    Counter key  -> \"next.user.id\"\r\n\r\nYou can specify your own keys to manually create relationship records. For example:\r\n\tmodels.User = Backbone.Model.extend({\r\n\t\tdefaults: {\r\n\t\t\t\"id\":\t\tnull,\r\n\t\t\t\"name\":\t\tnull\r\n\t\t},\r\n\t\tname: \"user\"\r\n\t});\r\n\r\n\t\t\r\n\tmodels.Group = Backbone.Model.extend({\r\n\t\tdefaults: {\r\n\t\t\t\"id\":\t\tnull\r\n\t\t\t\"name\":\t\tnull\r\n\t\t},\r\n\t\tname: \"group\"\r\n\t});\r\n\r\n\tmodels.UserGroup = Backbone.Model.extend({\r\n\t\tdefaults: {\r\n\t\t\t\"id\":\t\tnull\r\n\t\t\t\"specs\":\tnull\r\n\t\t},\r\n\t\tname: \"usergroup\"\r\n\t});\r\n\t...\r\n\t// user is loaded or fetched and has an id = 1 (Redis key: \"user:1\")\r\n\t//\r\n\t// group1 and group2 are fetched/saved and have ids 1 and 2 (Redis keys \"group:1\" & \"group:2\"\r\n\t...\r\n\tvar usergroup1 = new models.UserGroup({userid:user.id,groupid:group1.id});\r\n\tusergroup1.id = \"group:\" + group1.id + \":user:\" + user.id;\r\n\tusergroup1.save({},{success: function(saved) {\r\n\t\tconsole.log(\"Saved usergroup1: \" + saved.xport());\r\n\t}});\r\n\tvar usergroup2 = new models.UserGroup({userid:user.id,groupid:group2.id});\r\n\tusergroup2.id = \"group:\" + group2.id + \":user:\" + user.id;\r\n\tusergroup2.save({},{success: function(saved) {\r\n\t\tconsole.log(\"Saved usergroup2: \" + saved.xport());\r\n\r\n\t}});\r\n\t// Will create the user group records with Redis keys= \"usergroup:group:1:user:1\" and \"usergroup:group:2:user:1\"\r\n\r\n\r\n# Acknowledgments\r\n \r\n* xport()/mport() code taken from this fine article: http://andyet.net/blog/2011/feb/15/re-using-backbonejs-models-on-the-server-with-node/\r\n* This article inspired me to add Node.js server-side Redis support to backbone\r\n\r\n# Disclaimer / To Do\r\n\r\n* Use at your own risk\r\n* Some code is redundant. Some cleanup to do.\r\n* Haven't tested for Redis injection vulnerability. Sanitize/check IDs on server before doing any fetch/create, etc.\r\n* It was created to do everything on the server and push some updates to the client through socket.io. Could add some express routes and backbone.js code on client-side to make calls from the client.\r\n* No Redis pub/sub features\r\n\r\n# MIT License\r\n\r\nCopyright (c) 2011 Jerome Paradis\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n","maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}]}},"maintainers":[{"name":"jeromeparadis","email":"jparadis@paradivision.com"}],"time":{"modified":"2022-06-26T18:00:00.074Z","created":"2011-09-10T23:17:39.977Z","0.0.1":"2011-09-10T23:17:40.899Z","0.0.2":"2011-09-10T23:22:43.963Z","0.0.3":"2011-09-10T23:29:25.904Z","0.0.4":"2011-09-12T22:44:47.442Z","0.0.5":"2011-09-19T23:59:18.132Z","0.0.6":"2011-09-20T15:49:12.338Z","0.0.7":"2011-10-01T17:31:02.942Z","0.0.8":"2012-04-24T20:57:10.732Z","0.0.9":"2012-06-06T14:29:50.180Z"},"author":{"name":"Jerome Paradis","email":"jparadis@paradivision.com"}}