Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
19 lines
No EOL
5.2 KiB
JavaScript
19 lines
No EOL
5.2 KiB
JavaScript
;'use strict';var MessageDB=(function(){var DB_NAME='wappush';var DB_VERSION=2;var MESSAGE_STORE_NAME='message';var VIEWED_STORE_NAME='viewed';var KEY_PATH='timestamp';var ID_INDEX='id';var ID_INDEX_KEYPATH='id';var db=null;function mdb_transactionPromise(transaction){return new Promise(function(resolve,reject){transaction.oncomplete=function mdb_onTransactionComplete(event){resolve();};transaction.onerror=function mdb_onTransactionError(event){reject(event.target.error);};});}
|
|
function mdb_deleteViewedMessages(){var transaction=db.transaction([MESSAGE_STORE_NAME,VIEWED_STORE_NAME],'readwrite');var promise=mdb_transactionPromise(transaction);var store=transaction.objectStore(MESSAGE_STORE_NAME);var viewedStore=transaction.objectStore(VIEWED_STORE_NAME);var req=viewedStore.openCursor();req.onsuccess=event=>{var cursor=event.target.result;if(cursor){store.delete(cursor.value.timestamp);cursor.delete();cursor.continue();}};return promise;}
|
|
function mdb_open(){if(db){return Promise.resolve(db);}
|
|
var indexedDB;try{indexedDB=window.indexedDB||window.webkitIndexedDB||window.mozIndexedDB||window.msIndexedDB;}catch(e){return Promise.reject(e);}
|
|
if(!indexedDB){return Promise.reject(new Error('IndexedDB is not available'));}
|
|
return new Promise(function(resolve,reject){var req;try{req=indexedDB.open(DB_NAME,DB_VERSION);}catch(e){reject(e);return;}
|
|
req.onsuccess=function mdb_opened(event){db=event.target.result;mdb_deleteViewedMessages().then(()=>resolve(db));};req.onerror=function mdb_openError(event){reject(event.target.error);};req.onupgradeneeded=function mdb_upgradeNeeded(event){var db=event.target.result;var store=null;switch(event.oldVersion){case 0:store=db.createObjectStore(MESSAGE_STORE_NAME,{keyPath:KEY_PATH});store.createIndex(ID_INDEX,ID_INDEX_KEYPATH,{unique:false});case 1:store=db.createObjectStore(VIEWED_STORE_NAME,{keyPath:KEY_PATH});break;default:event.target.transaction.abort();}};});}
|
|
function mdb_processMessage(store,message){if(message.action==='delete'){mdb_deleteById(store,message.id);return false;}else{store.put(message);return true;}}
|
|
function mdb_put(message){return mdb_open().then(function mdb_openResolved(db){var transaction=db.transaction(MESSAGE_STORE_NAME,'readwrite');var promise=mdb_transactionPromise(transaction);var store=transaction.objectStore(MESSAGE_STORE_NAME);var stored;if(!message.id){store.put(message);mdb_dispatchEvent('new',message);return promise;}
|
|
if(!message.created){stored=mdb_processMessage(store,message);mdb_dispatchEvent(stored?'new':'discard',message);return promise;}
|
|
var index=store.index(ID_INDEX);var req=index.openCursor(IDBKeyRange.only(message.id));req.onsuccess=function mdb_cursorSuccess(event){var cursor=event.target.result;if(cursor){var storedMessage=cursor.value;if(storedMessage.created){if(storedMessage.created<message.created){cursor.delete(storedMessage);message.timestamp=storedMessage.timestamp;stored=mdb_processMessage(store,message);mdb_dispatchEvent(stored?'update':'discard',message);}else{mdb_dispatchEvent('discard',message);}
|
|
return;}
|
|
cursor.continue();}else{stored=mdb_processMessage(store,message);mdb_dispatchEvent(stored?'new':'discard',message);}};return promise;});}
|
|
function mdb_deleteById(store,id){var index=store.index(ID_INDEX);var req=index.openCursor(id);req.onsuccess=function mdb_openCursorSuccess(event){var cursor=event.target.result;if(cursor){var message=cursor.value;cursor.delete().onsuccess=function mdb_onDeleted(){mdb_dispatchEvent('delete',message);};cursor.continue();}};}
|
|
function mdb_retrieve(timestamp){return mdb_open().then(function mdb_openResolved(db){var transaction=db.transaction([MESSAGE_STORE_NAME,VIEWED_STORE_NAME],'readwrite');var promise=mdb_transactionPromise(transaction);var store=transaction.objectStore(MESSAGE_STORE_NAME);var req=store.get(timestamp.toString());var message=null;req.onsuccess=function mdb_gotMessage(event){if(event.target.result){message=event.target.result;if(message.type!='text/vnd.wap.connectivity-xml'){var viewedStore=transaction.objectStore(VIEWED_STORE_NAME);viewedStore.put(message);}}};return promise.then(()=>{if(message){return message;}else{return Promise.reject(new Error('Message with id '+timestamp+' not found'));}});});}
|
|
function mdb_deleteByTimestamp(timestamp){return mdb_open().then(function mdb_deleteCallback(db){var transaction=db.transaction(MESSAGE_STORE_NAME,'readwrite');var promise=mdb_transactionPromise(transaction);var store=transaction.objectStore(MESSAGE_STORE_NAME);timestamp=timestamp.toString();store.get(timestamp).onsuccess=function(event){var message=event.target.result;store.delete(timestamp).onsuccess=function mdb_onDeleted(){mdb_dispatchEvent('delete',message);};};return promise;});}
|
|
function mdb_clear(){return mdb_open().then(function mdb_openResolved(db){var transaction=db.transaction([MESSAGE_STORE_NAME,VIEWED_STORE_NAME],'readwrite');var promise=mdb_transactionPromise(transaction);var store=transaction.objectStore(MESSAGE_STORE_NAME);var viewedStore=transaction.objectStore(VIEWED_STORE_NAME);store.clear();viewedStore.clear();return promise;});}
|
|
function mdb_dispatchEvent(type,target){MessageDB.emit(type,target);}
|
|
var mdb_allowedEvents=['new','update','discard','delete'];return EventDispatcher.mixin({put:mdb_put,retrieve:mdb_retrieve,deleteByTimestamp:mdb_deleteByTimestamp,clear:mdb_clear},mdb_allowedEvents);})(); |