glitch-images/scripts/workers/storageworker.js
2015-12-23 23:09:12 +01:00

233 lines
4.7 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

importScripts( '../lib/localforage.nopromises.js' );
importScripts( '../lib/md5.js' );
var storageKey = 'items';
var entries = { };
self.addEventListener( 'message', receivedMessageEvent, false );
function receivedMessageEvent ( event ) {
if ( event && event.data ) {
if ( event.data.setStorageKey ) {
setStorageKey( event.data.setStorageKey );
}
if ( event.data.add ) {
add( event.data.add );
}
if ( event.data.removeCompletely ) {
removeCompletely( event.data.removeCompletely );
}
if ( event.data.removeLocalData ) {
removeLocalData( event.data.removeLocalData );
}
if ( event.data.removeImgurData ) {
removeImgurData( event.data.removeImgurData );
}
if ( event.data.load ) {
load();
}
if ( event.data.save ) {
save();
}
if ( event.data.loadItem ) {
loadItem( event.data.loadItem );
}
}
}
function sendMessage ( type, data ) {
if ( typeof type === 'string' ) {
if ( typeof data === 'undefined' ) {
data = type;
}
var message = { };
message[type] = data;
self.postMessage( message );
}
}
function sendError ( err ) {
sendMessage( 'error', err );
}
function setStorageKey ( newKey ) {
if ( newKey ) {
storageKey = newKey;
}
}
function add ( item ) {
if ( item ) {
var uid = createUID( item );
if (
entries[uid] &&
entries[uid].deleteHash === item.deleteHash &&
entries[uid].publicUrl === item.publicUrl &&
entries[uid].imgurID === item.imgurID
) {
sendError( 'file.message.before' );
} else {
item.timestamp = Date.now();
entries[uid] = item;
save( function () {
sendMessage( 'statusmessage', 'file.message.save' );
} );
}
}
}
function removeCompletely ( uid ) {
if ( uid && entries[uid] ) {
if (
(
entries[uid].deleteHash ||
entries[uid].publicUrl ||
entries[uid].imgurID ||
entries[uid].values ||
entries[uid].src
)
) {
console && console.log( 'cant delete storage item because theres still some data left', entries[uid] );
} else {
sendMessage( 'removeall', entries[uid] );
delete entries[uid];
save( function () {
sendMessage( 'statusmessage', 'file.message.save' );
} );
}
}
}
function removeLocalData ( uid ) {
if ( uid && entries[uid] ) {
if ( entries[uid].src ) {
delete entries[uid].src;
sendMessage( 'removelocaldata', entries[uid] );
}
if ( entries[uid].values ) {
delete entries[uid].values;
}
if ( ! ( entries[uid].deleteHash || entries[uid].publicUrl || entries[uid].imgurID ) ) {
removeCompletely( uid );
}
save();
}
}
function removeImgurData ( uid ) {
if ( uid && entries[uid] ) {
if ( entries[uid].deleteHash ) {
sendMessage( 'removeimgurdata', entries[uid] );
delete entries[uid].deleteHash;
}
if ( entries[uid].publicUrl ) {
delete entries[uid].publicUrl;
}
if ( entries[uid].imgurID ) {
delete entries[uid].imgurID;
}
if ( ! ( entries[uid].src || entries[uid].values ) ) {
removeCompletely( uid );
}
save();
}
}
function load ( callback ) {
localforage.getItem( storageKey, function ( err, loadedData ) {
if ( err ) {
sendError( 'file.error.load' );
console && console.log( 'localforage error', err );
} else {
entries = loadedData && loadedData.entries ? loadedData.entries : { };
sendMessage( 'update', entries );
isFirstVisit = ( loadedData && loadedData.lastVisit ) ? false : true;
if ( isFirstVisit ) {
sendMessage( 'firstvisit' );
save();
}
if ( typeof callback === 'function' ) {
callback();
}
}
} );
}
function save ( callback ) {
localforage.setItem( storageKey, { entries: entries, lastVisit: Date.now() }, function ( err, savedData ) {
if ( err ) {
sendError( 'file.error.save' );
console && console.log( 'localforage error', err );
} else {
if ( savedData ) {
entries = savedData.entries;
sendMessage( 'update', entries );
sendMessage( 'save' );
if ( typeof callback === 'function' ) {
callback();
}
} else {
console && console.log( 'no data was saved', savedData );
}
}
} );
}
function loadItem ( uid ) {
if ( entries[uid] ) {
sendMessage( 'loaditem', { uid: uid, entries: entries[uid] } );
}
}
function createUID ( item ) {
var inputStr = 'N' + item.name + 'S' + item.src + 'L' + item.thumbnail.length || 0 + 'V';
for ( var key in item.values ) {
inputStr += key.substr( 0, 2 );
inputStr += item.values[key];
}
return md5( inputStr );
}
function getLatestUID () {
var latestUid;
var latestTimestamp;
var timestamp;
for ( var uid in entries ) {
timestamp = entries[uid].timestamp;
if ( timestamp ) {
if ( ! latestUid || timestamp > latestTimestamp ) {
latestUid = uid;
latestTimestamp = timestamp;
}
}
}
return latestUid;
}