Advertisement
Uno-Dan

IDBDatabase Extended

Feb 19th, 2021
1,631
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. var Promise;
  3. var IDBDatabase;
  4.  
  5. IDBDatabase.prototype.debug = true;
  6.  
  7. IDBDatabase.prototype.set = async function( name, data  ) {
  8.   return new Promise(( resolve, reject ) => {
  9.    
  10.     let transaction = this.transaction ( [ name ], 'readwrite' );
  11.     let store = transaction.objectStore( name );
  12.     let req = store.add( data );
  13.  
  14.     req.onerror = e => {
  15.       if ( this.debug )
  16.         log( `[ ERROR: set ], could not set key [${ data.id }] in store [${
  17.         req.source.name }] in database [${ this.name }]` );
  18.       reject( e );  
  19.     };
  20.     req.onsuccess = () => {  
  21.       if ( this.debug )
  22.         log( `[ INFO: set ], Set key [${ data.id }] in store [${
  23.         req.source.name }] in database [${ this.name }]` );
  24.       resolve( data );  
  25.     };
  26.   });
  27. };
  28.  
  29. IDBDatabase.prototype.get = async function( name, key  ) {
  30.   return new Promise(( resolve, reject ) => {
  31.     let transaction = this.transaction ( [ name ], 'readonly' );
  32.     let store = transaction.objectStore( name );
  33.     let req = store.get( key );
  34.  
  35.     req.onerror = () => {
  36.       if ( this.debug )
  37.         log( `[ ERROR: get ], Could not retrieve key [${ key }] from store [${
  38.         req.source.name }] in database [${ this.name }]` );
  39.       reject( key );
  40.     };
  41.     req.onsuccess = ( e ) => {
  42.       if ( typeof req.result === 'undefined' ) {
  43.         req.onerror( e );
  44.       } else {
  45.         if ( this.debug )
  46.           log( `[ INFO: get ], Retrieved key [${ key }] from store [${
  47.           req.source.name }] in database [${ this.name }]` );
  48.         resolve( req.result );
  49.       }
  50.     };
  51.   });
  52. };
  53.  
  54. IDBDatabase.prototype.getAll = async function( name ) {
  55.   return new Promise(( resolve, reject ) => {
  56.     let transaction = this.transaction ( [ name ], 'readonly' );
  57.     let store = transaction.objectStore( name );
  58.     let req = store.getAll();
  59.  
  60.     req.onerror = () => {
  61.       if ( this.debug )
  62.         log( `[ ERROR: getAll ], Could not retrieve items from store [${
  63.         req.source.name }] in database [${ this.name }]` );
  64.       reject();
  65.     };
  66.     req.onsuccess = ( e ) => {
  67.       if ( typeof req.result === 'undefined' ) {
  68.         req.onerror( e );
  69.       } else {
  70.         if ( this.debug )
  71.           log( `[ INFO: get ], Retrieved all items from store [${
  72.           req.source.name }] in database [${ this.name }]` );
  73.         resolve( req.result );
  74.       }
  75.     };
  76.   });
  77. };
  78.  
  79. IDBDatabase.prototype.load = async function( name, defaults  ) {
  80.   if ( ! Array.isArray( defaults ) ) defaults = [ defaults ];
  81.  
  82.   var name = name;
  83.   let promises = [];
  84.  
  85.   defaults.forEach( data => {
  86.     promises.push( this.get( name, data.id ) );
  87.   } );
  88.  
  89.   return Promise.allSettled( promises )
  90.   .then( reqs => {
  91.     let que = [];
  92.     let results = [];
  93.     reqs.forEach( req => {
  94.       if ( req.status === 'rejected' ) {
  95.         let data = defaults.find( x => x.id === req.reason );
  96.         que.push( this.set( name, data ) );
  97.         if ( this.debug )
  98.           log( `[ INFO: load ], Setting default values for key [${ req.reason
  99.           }] in store [${ name }] in database [${ this.name }]` );
  100.       } else if ( req.status === 'fulfilled' ) {
  101.         results.push( req.value );
  102.       }
  103.     });
  104.     if ( que.length ) {
  105.       return Promise.allSettled( que );
  106.     } else {
  107.       return results;
  108.     }
  109.   });
  110. };
  111.  
  112. IDBDatabase.prototype.update = async function( name, data  ) {
  113.   return new Promise(( resolve, reject ) => {
  114.    
  115.     let transaction = this.transaction ( [ name ], 'readwrite' );
  116.     let store = transaction.objectStore( name );
  117.     let req = store.put( data );
  118.  
  119.     req.onerror = e => {
  120.       if ( this.debug )
  121.         log( `[ ERROR: update ], could not update key [${ data.id }] in store [${
  122.         req.source.name }] in database [${ this.name }]` );
  123.       reject( e );  
  124.     };
  125.     req.onsuccess = () => {  
  126.       if ( this.debug )
  127.         log( `[ INFO: update ], updated key [${ data.id }] in store [${
  128.         req.source.name }] in database [${ this.name }]` );
  129.       resolve( data );  
  130.     };
  131.   });
  132. };
  133.  
  134.  
  135.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement