User:Dixtosa/CacheableStorage.js

var StorageWrapper = function{ this.localStorageAvailable = mw.storage.get("localStorageTest") !== false; this.storageAvailable = this.localStorageAvailable || navigator.cookieEnabled; this.cookiePreferences = { expires: 30, path: '/' };	this.set = function(name, value){ if (this.localStorageAvailable) { localStorage[name] = value; } else { $.cookie(name, value, {}); }	};	this.get = function(name) { if (this.localStorageAvailable){ return localStorage[name]; } else { return $.cookie(name); }	}; };

window.CacheableStorage = function(productName, getProductCallback, expireInDays, version){ this.storageWrapper = new StorageWrapper; this.StorageAvailable = this.storageWrapper.storageAvailable; this.expireInDays = expireInDays; this.version = version || 1; this.productName = productName; this.getProductCallback = getProductCallback; this._cachedData = null; this.itemAddressPrefix = "enwikt/CacheableStorage/" + this.productName + "?v=" + this.version; this.itemDataAddress = this.itemAddressPrefix + "&Type=Data"; this.itemTypeAddress = this.itemAddressPrefix + "&Type=Type"; this.itemExpirationAddress = this.itemAddressPrefix + "&Type=Expiration"; this.refreshData = function { var this1 = this; this.getProductCallback.then(function(d) {			this1.storageWrapper.set(this1.itemTypeAddress, typeof(d));			this1.storageWrapper.set(this1.itemExpirationAddress, new Date.toISOString);			if (typeof(d) != "string") d = JSON.stringify(d);			this1.storageWrapper.set(this1.itemDataAddress, d);		}); };	this.GetItem = function{ if (this._cachedData) return this._cachedData; var data = this.storageWrapper.get(this.itemDataAddress); var type = this.storageWrapper.get(this.itemTypeAddress); var expiration = this.storageWrapper.get(this.itemExpirationAddress); if (data) {			if (type != "string") data = JSON.parse(data); if ((new Date - new Date(expiration))/1000 > this.expireInDays*24*3600){ this.refreshData; return data; }			else return this._cachedData=data; }		else {			this.refreshData; }		return null; }; };