API Docs for: 0.0.5
Show:

File: lib/gajse-storage.js

/* GAJSE Buffer Storage */
/* We can use IndexedDB to use 50MB steps of data */
/* People should declare the preloadedResources for loading at startup and saving it to IndexedDB */
/* Resource API should access IndexedDB data */

var crypto=require("crypto");

module.exports={
	dbVersion: 7,
	adding: true,
	resCount: 0,
	resTotal: 0,
	/**
	 * It validates the checksum of a file for remove duplicate content on buffer */
	validateChecksum: function(file,originalChecksum){
		var hash=crypto.createHash("md5");
		hash.update(file,"utf8");
		var md5=hash.digest("hex");
		if(originalChecksum==md5)
			return true;
		else
			return false;
	},
	createChecksum: function(file){
		var hash=crypto.createHash("md5");
		hash.update(file,"utf8");
		return hash.digest("hex");
	},
	/**
	 * Call it for every resources.json file
	 * @param json - The resources.json file already parsed
	 * @param dir - The dir to lookup for resources */
	setupResources: function(json,dir){	
		this.adding=true;
		var request=window.indexedDB.open("GAJSE-Resources",this.dbVersion);
		request.data=new Object;
		request.data.json=json;
		request.data.dir=dir;
		request.addEventListener("error",this.genericError);
		request.addEventListener("success",this.successCallback.bind(this));
		request.addEventListener("upgradeneeded",this.setupResourceTable.bind(this));
	},
	addResource: function(db,filename,resource){
		/* Download file */
		var xhr=new XMLHttpRequest();
		xhr.open("GET",filename+"?timestamp="+new Date().getTime(),true);
		xhr.setRequestHeader("User-Agent","GAJSE 0.0.2/Resource system");
		xhr.responseType="arraybuffer";
		xhr.addEventListener("load",function(){
			/* Get checksum from database */
			/* Create checksum of file*/
			var checksum=this.createChecksum(xhr.response);
			/* if different add to IndexedDB */
				console.log("DOWNLOAD FINISHED");
				var obj=db.transaction(["Resources"],"readwrite").objectStore("Resources");
				var newObj={
					name: resource,
					data: xhr.response,
					checksum: checksum
				};
				var req=obj.put(newObj);
				req.addEventListener("success",function(){
					console.log("ADDED ITEM: "+newObj.name);
					this.resCount++;
					console.log("RESOURES "+ this.resCount);
				}.bind(this));
				req.addEventListener("error",function(){
					console.log("ERROR ON ADDING ITEM");
				});
		}.bind(this));
		xhr.send();
	},
	successCallback: function(evt){
		var db=evt.target.result;
		var json=evt.target.data.json;
		var dir=evt.target.data.dir;
		if(json!=null || json!=undefined)
		{
			for(var resName in json)
			{
				console.log("ADDING RESOURCE: "+resName);
				this.addResource(db,dir+json[resName],resName);
				this.resTotal++;
			}
		}
	},
	setupResourceTable: function(evt){
		var db=evt.target.result;
		if(db.objectStoreNames.contains("Resources"))
		{
			db.deleteObjectStore("Resources");
		}
		var objStore=db.createObjectStore("Resources",{keyPath: "checksum"});
		objStore.createIndex("name","name",{unique: true});
		objStore.createIndex("data","data",{unique: false});
		objStore.transaction.addEventListener("complete",function(){
			this.successCallback(evt);
		}.bind(this));
	},
	getResource: function(resource, callback){
		var request=indexedDB.open("GAJSE-Resources",this.dbVersion);
		request.addEventListener("success",function(evt){
			var db=evt.target.result;
			var index=db.transaction(["Resources"]).objectStore("Resources").index("name").get(resource);
			index.addEventListener("success",function(evet){
				callback(evet.target.result["data"]);
			});
			index.addEventListener("error",this.genericError);
			});
		request.addEventListener("error",this.genericError);
	},
	isDownloadingFinished: function(){
		if(this.resTotal <= this.resCount)
			return true;
		else
			return false;
	},
	genericError: function(evt){
		console.error("ERROR on the gajse-storage module. CODE: "+evt.target.errorCode);
	}
}