|
<script> |
|
var port; |
|
|
|
var DB_NAME = 'actions_db'; |
|
var DB_STORE_NAME = 'actions'; |
|
var db; |
|
|
|
function openDb() { |
|
console.log("openDb ..."); |
|
var req = indexedDB.open(DB_NAME, 1); |
|
req.onsuccess = function (e) { |
|
db = this.result; |
|
console.log("openDb DONE"); |
|
}; |
|
req.onerror = function (e) { |
|
console.error("openDb:", e.target.errorCode); |
|
}; |
|
|
|
req.onupgradeneeded = function (e) { |
|
console.log("openDb.onupgradeneeded"); |
|
var store = e.currentTarget.result.createObjectStore( DB_STORE_NAME, { autoIncrement: true }); |
|
}; |
|
} |
|
function getObjectStore(mode) { |
|
var tx = db.transaction(DB_STORE_NAME, mode); |
|
return tx.objectStore(DB_STORE_NAME); |
|
} |
|
|
|
function lsTest(){ |
|
var test = 'test'; |
|
try { |
|
localStorage.setItem(test, test); |
|
var test2 = localStorage.getItem(test); |
|
localStorage.removeItem(test); |
|
return test2 === test; |
|
} catch(e) { |
|
return false; |
|
} |
|
} |
|
|
|
function getFromLs() { |
|
if (!lsTest()) { |
|
return []; |
|
} |
|
|
|
return JSON.parse(localStorage.getItem('actions')) || []; |
|
} |
|
|
|
function addToDB(data) { |
|
var store = getObjectStore('readwrite'); |
|
|
|
var req; |
|
try { |
|
req = store.add(data); |
|
} catch (e) { |
|
throw e; |
|
} |
|
req.onsuccess = function (e) { |
|
port.postMessage({ |
|
status: 'ack', |
|
what: 'indexedDB', |
|
}); |
|
}; |
|
req.onerror = function() { |
|
console.error("addToDB error", this.error); |
|
}; |
|
} |
|
|
|
function addToLs(data) { |
|
if (!lsTest()) { |
|
return; |
|
} |
|
|
|
var val = getFromLs(); |
|
val.push(data); |
|
localStorage.setItem('actions', JSON.stringify(val)); |
|
port.postMessage({ |
|
status: 'ack', |
|
what: 'localStorage', |
|
}); |
|
} |
|
|
|
function listener(event){ |
|
// console.debug('2', event); |
|
var data = event.data; |
|
|
|
if (data.type === 'register' && event.ports.length === 1) { |
|
port = event.ports[0]; |
|
port.postMessage({ |
|
status: 'registered', |
|
localStorage: lsTest(), |
|
indexedDB: !!window.indexedDB, |
|
actions: getFromLs(), |
|
}); |
|
return; |
|
} |
|
|
|
if (data.type === 'payload') { |
|
console.log('P', data); |
|
addToLs(data.payload); |
|
addToDB(data.payload); |
|
// port.postMessage({ |
|
// status: 'ack', |
|
// }); |
|
} |
|
} |
|
|
|
openDb(); |
|
//attach a listener for when postMessage calls come in... |
|
if (window.addEventListener){ |
|
addEventListener("message", listener, false); |
|
}else{ |
|
attachEvent("onmessage", listener); |
|
} |
|
</script> |