epubjs
Version:
Render ePub documents in the browser, across many devices
256 lines (218 loc) • 6.4 kB
JavaScript
EPUBJS.Storage = function(withCredentials){
this.checkRequirements();
this.urlCache = {};
this.withCredentials = withCredentials;
this.URL = window.URL || window.webkitURL || window.mozURL;
this.offline = false;
};
//-- Load the zip lib and set the workerScriptsPath
EPUBJS.Storage.prototype.checkRequirements = function(callback){
if(typeof(localforage) == "undefined") console.error("localForage library not loaded");
};
EPUBJS.Storage.prototype.put = function(assets, store) {
var deferred = new RSVP.defer();
var count = assets.length;
var current = 0;
var next = function(deferred){
var done = deferred || new RSVP.defer();
var url;
var encodedUrl;
if(current >= count) {
done.resolve();
} else {
url = assets[current].url;
encodedUrl = window.encodeURIComponent(url);
EPUBJS.core.request(url, "binary")
.then(function (data) {
return localforage.setItem(encodedUrl, data);
})
.then(function(data){
current++;
// Load up the next
setTimeout(function(){
next(done);
}, 1);
});
}
return done.promise;
}.bind(this);
if(!Array.isArray(assets)) {
assets = [assets];
}
next().then(function(){
deferred.resolve();
}.bind(this));
return deferred.promise;
};
EPUBJS.Storage.prototype.token = function(url, value){
var encodedUrl = window.encodeURIComponent(url);
return localforage.setItem(encodedUrl, value)
.then(function (result) {
if (result === null) {
return false;
} else {
return true;
}
});
};
EPUBJS.Storage.prototype.isStored = function(url){
var encodedUrl = window.encodeURIComponent(url);
return localforage.getItem(encodedUrl)
.then(function (result) {
if (result === null) {
return false;
} else {
return true;
}
});
};
EPUBJS.Storage.prototype.getText = function(url){
var encodedUrl = window.encodeURIComponent(url);
return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials)
.then(function(buffer){
if(this.offline){
this.offline = false;
this.trigger("offline", false);
}
localforage.setItem(encodedUrl, buffer);
return buffer;
}.bind(this))
.then(function(data) {
var deferred = new RSVP.defer();
var mimeType = EPUBJS.core.getMimeType(url);
var blob = new Blob([data], {type : mimeType});
var reader = new FileReader();
reader.addEventListener("loadend", function() {
deferred.resolve(reader.result);
});
reader.readAsText(blob, mimeType);
return deferred.promise;
})
.catch(function() {
var deferred = new RSVP.defer();
var entry = localforage.getItem(encodedUrl);
if(!this.offline){
this.offline = true;
this.trigger("offline", true);
}
if(!entry) {
deferred.reject({
message : "File not found in the storage: " + url,
stack : new Error().stack
});
return deferred.promise;
}
entry.then(function(data) {
var mimeType = EPUBJS.core.getMimeType(url);
var blob = new Blob([data], {type : mimeType});
var reader = new FileReader();
reader.addEventListener("loadend", function() {
deferred.resolve(reader.result);
});
reader.readAsText(blob, mimeType);
});
return deferred.promise;
}.bind(this));
};
EPUBJS.Storage.prototype.getUrl = function(url){
var encodedUrl = window.encodeURIComponent(url);
return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials)
.then(function(buffer){
if(this.offline){
this.offline = false;
this.trigger("offline", false);
}
localforage.setItem(encodedUrl, buffer);
return url;
}.bind(this))
.catch(function() {
var deferred = new RSVP.defer();
var entry;
var _URL = window.URL || window.webkitURL || window.mozURL;
var tempUrl;
if(!this.offline){
this.offline = true;
this.trigger("offline", true);
}
if(encodedUrl in this.urlCache) {
deferred.resolve(this.urlCache[encodedUrl]);
return deferred.promise;
}
entry = localforage.getItem(encodedUrl);
if(!entry) {
deferred.reject({
message : "File not found in the storage: " + url,
stack : new Error().stack
});
return deferred.promise;
}
entry.then(function(data) {
var blob = new Blob([data], {type : EPUBJS.core.getMimeType(url)});
tempUrl = _URL.createObjectURL(blob);
deferred.resolve(tempUrl);
this.urlCache[encodedUrl] = tempUrl;
}.bind(this));
return deferred.promise;
}.bind(this));
};
EPUBJS.Storage.prototype.getXml = function(url){
var encodedUrl = window.encodeURIComponent(url);
return EPUBJS.core.request(url, 'arraybuffer', this.withCredentials)
.then(function(buffer){
if(this.offline){
this.offline = false;
this.trigger("offline", false);
}
localforage.setItem(encodedUrl, buffer);
return buffer;
}.bind(this))
.then(function(data) {
var deferred = new RSVP.defer();
var mimeType = EPUBJS.core.getMimeType(url);
var blob = new Blob([data], {type : mimeType});
var reader = new FileReader();
reader.addEventListener("loadend", function() {
var parser = new DOMParser();
var doc = parser.parseFromString(reader.result, "text/xml");
deferred.resolve(doc);
});
reader.readAsText(blob, mimeType);
return deferred.promise;
})
.catch(function() {
var deferred = new RSVP.defer();
var entry = localforage.getItem(encodedUrl);
if(!this.offline){
this.offline = true;
this.trigger("offline", true);
}
if(!entry) {
deferred.reject({
message : "File not found in the storage: " + url,
stack : new Error().stack
});
return deferred.promise;
}
entry.then(function(data) {
var mimeType = EPUBJS.core.getMimeType(url);
var blob = new Blob([data], {type : mimeType});
var reader = new FileReader();
reader.addEventListener("loadend", function() {
var parser = new DOMParser();
var doc = parser.parseFromString(reader.result, "text/xml");
deferred.resolve(doc);
});
reader.readAsText(blob, mimeType);
});
return deferred.promise;
}.bind(this));
};
EPUBJS.Storage.prototype.revokeUrl = function(url){
var _URL = window.URL || window.webkitURL || window.mozURL;
var fromCache = this.urlCache[url];
if(fromCache) _URL.revokeObjectURL(fromCache);
};
EPUBJS.Storage.prototype.failed = function(error){
console.error(error);
};
RSVP.EventTarget.mixin(EPUBJS.Storage.prototype);