| 
									
										
										
										
											2012-08-16 13:15:28 -06:00
										 |  |  | // http://www.rajdeepd.com/articles/chrome/localstrg/LocalStorageSample.htm
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // NOTE:
 | 
					
						
							|  |  |  | // this varies from actual localStorage in some subtle ways
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // also, there is no persistence
 | 
					
						
							|  |  |  | // TODO persist
 | 
					
						
							|  |  |  | (function () { | 
					
						
							|  |  |  |   "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var fs = require('fs') | 
					
						
							|  |  |  |     ; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 18:22:05 -07:00
										 |  |  |   function Storage(path, opts) { | 
					
						
							|  |  |  |     opts = opts || {}; | 
					
						
							| 
									
										
										
										
											2012-08-16 13:15:28 -06:00
										 |  |  |     var db | 
					
						
							|  |  |  |       ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Object.defineProperty(this, '___priv_bk___', { | 
					
						
							| 
									
										
										
										
											2014-03-08 14:55:21 -07:00
										 |  |  |       value: { | 
					
						
							|  |  |  |         path: path | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     , writable: false | 
					
						
							|  |  |  |     , enumerable: false | 
					
						
							| 
									
										
										
										
											2012-08-16 13:15:28 -06:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-28 18:22:05 -07:00
										 |  |  |     Object.defineProperty(this, '___priv_strict___', { | 
					
						
							| 
									
										
										
										
											2014-03-08 14:55:21 -07:00
										 |  |  |       value: !!opts.strict | 
					
						
							|  |  |  |     , writable: false | 
					
						
							|  |  |  |     , enumerable: false | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Object.defineProperty(this, '___priv_ws___', { | 
					
						
							|  |  |  |       value: opts.ws || '  ' | 
					
						
							|  |  |  |     , writable: false | 
					
						
							|  |  |  |     , enumerable: false | 
					
						
							| 
									
										
										
										
											2014-01-28 18:22:05 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-16 13:15:28 -06:00
										 |  |  |     try { | 
					
						
							|  |  |  |       db = JSON.parse(fs.readFileSync(path)); | 
					
						
							|  |  |  |     } catch(e) { | 
					
						
							|  |  |  |       db = {}; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Object.keys(db).forEach(function (key) { | 
					
						
							|  |  |  |       this[key] = db[key]; | 
					
						
							|  |  |  |     }, this); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Storage.prototype.getItem = function (key) { | 
					
						
							| 
									
										
										
										
											2013-01-26 02:04:32 -07:00
										 |  |  |     if (this.hasOwnProperty(key)) { | 
					
						
							| 
									
										
										
										
											2014-03-08 14:55:21 -07:00
										 |  |  |       if (this.___priv_strict___) { | 
					
						
							|  |  |  |         return String(this[key]); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         return this[key]; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2012-08-16 13:15:28 -06:00
										 |  |  |     } | 
					
						
							|  |  |  |     return null; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Storage.prototype.setItem = function (key, val) { | 
					
						
							| 
									
										
										
										
											2014-03-08 14:55:21 -07:00
										 |  |  |     if (val === undefined) { | 
					
						
							|  |  |  |       this[key] = null; | 
					
						
							|  |  |  |     } else if (this.___priv_strict___) { | 
					
						
							|  |  |  |       this[key] = String(val); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       this[key] = val; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-08-16 13:15:28 -06:00
										 |  |  |     this.___save___(); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Storage.prototype.removeItem = function (key) { | 
					
						
							|  |  |  |     delete this[key]; | 
					
						
							|  |  |  |     this.___save___(); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Storage.prototype.clear = function () { | 
					
						
							|  |  |  |     var self = this; | 
					
						
							|  |  |  |     // filters out prototype keys
 | 
					
						
							|  |  |  |     Object.keys(self).forEach(function (key) { | 
					
						
							|  |  |  |       self[key] = undefined; | 
					
						
							|  |  |  |       delete self[key]; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Storage.prototype.key = function (i) { | 
					
						
							|  |  |  |     i = i || 0; | 
					
						
							|  |  |  |     return Object.keys(this)[i]; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Storage.prototype.__defineGetter__('length', function () { | 
					
						
							|  |  |  |     return Object.keys(this).length; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Storage.prototype.___save___ = function () { | 
					
						
							|  |  |  |     var self = this | 
					
						
							|  |  |  |       ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!this.___priv_bk___.path) { | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (this.___priv_bk___.lock) { | 
					
						
							|  |  |  |       this.___priv_bk___.wait = true; | 
					
						
							|  |  |  |       return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     this.___priv_bk___.lock = true; | 
					
						
							| 
									
										
										
										
											2014-03-08 14:55:21 -07:00
										 |  |  |     fs.writeFile( | 
					
						
							|  |  |  |       this.___priv_bk___.path | 
					
						
							|  |  |  |     , JSON.stringify(this, null, this.___priv_ws___) | 
					
						
							|  |  |  |     , 'utf8' | 
					
						
							|  |  |  |     , function (e) { | 
					
						
							| 
									
										
										
										
											2012-08-16 13:15:28 -06:00
										 |  |  |       self.___priv_bk___.lock = false; | 
					
						
							|  |  |  |       if (e) { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (self.___priv_bk___.wait) { | 
					
						
							|  |  |  |         self.___priv_bk___.wait = false; | 
					
						
							|  |  |  |         self.___save___(); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Object.defineProperty(Storage, 'create', { | 
					
						
							| 
									
										
										
										
											2014-03-08 14:55:21 -07:00
										 |  |  |     value: function (path, opts) { | 
					
						
							|  |  |  |       return new Storage(path, opts); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   , writable: false | 
					
						
							|  |  |  |   , enumerable: false | 
					
						
							| 
									
										
										
										
											2012-08-16 13:15:28 -06:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   module.exports = Storage; | 
					
						
							|  |  |  | }()); |