@@ -48,32 +48,33 @@ export async function get(storeName, key) {
4848export async function put ( storeName , recordJson ) {
4949 const record = JSON . parse ( recordJson ) ;
5050 return new Promise ( ( resolve , reject ) => {
51+ // Resolve on tx.oncomplete (commit), not request.onsuccess — IndexedDB reports commit-time failures
52+ // (QuotaExceededError, constraint/abort) after the request succeeds, so resolving on the request would
53+ // be a false-positive success with the write silently rolled back.
5154 const tx = db . transaction ( storeName , 'readwrite' ) ;
52- const store = tx . objectStore ( storeName ) ;
53- const request = store . put ( record ) ;
54-
55- request . onsuccess = ( ) => resolve ( ) ;
56- request . onerror = ( ) => reject ( new Error ( `Put failed: ${ request . error } ` ) ) ;
55+ tx . oncomplete = ( ) => resolve ( ) ;
56+ tx . onerror = ( ) => reject ( new Error ( `Put failed: ${ tx . error } ` ) ) ;
57+ tx . onabort = ( ) => reject ( new Error ( `Put aborted: ${ tx . error } ` ) ) ;
58+ tx . objectStore ( storeName ) . put ( record ) ;
5759 } ) ;
5860}
5961
6062export async function remove ( storeName , key ) {
6163 return new Promise ( ( resolve , reject ) => {
6264 const tx = db . transaction ( storeName , 'readwrite' ) ;
6365 const store = tx . objectStore ( storeName ) ;
64-
65- // Check if exists first
66+ let existed = false ;
6667 const getReq = store . get ( key ) ;
6768 getReq . onsuccess = ( ) => {
68- if ( ! getReq . result ) {
69- resolve ( false ) ;
70- return ;
69+ if ( getReq . result ) {
70+ existed = true ;
71+ store . delete ( key ) ;
7172 }
72- const delReq = store . delete ( key ) ;
73- delReq . onsuccess = ( ) => resolve ( true ) ;
74- delReq . onerror = ( ) => reject ( new Error ( `Delete failed: ${ delReq . error } ` ) ) ;
7573 } ;
76- getReq . onerror = ( ) => reject ( new Error ( `Get failed: ${ getReq . error } ` ) ) ;
74+ // Report the outcome only once the transaction commits (so an abort surfaces as a failure).
75+ tx . oncomplete = ( ) => resolve ( existed ) ;
76+ tx . onerror = ( ) => reject ( new Error ( `Delete failed: ${ tx . error } ` ) ) ;
77+ tx . onabort = ( ) => reject ( new Error ( `Delete aborted: ${ tx . error } ` ) ) ;
7778 } ) ;
7879}
7980
@@ -108,25 +109,18 @@ export async function clearByTypeName(storeName, typeName) {
108109 const tx = db . transaction ( storeName , 'readwrite' ) ;
109110 const store = tx . objectStore ( storeName ) ;
110111 const index = store . index ( 'typeName' ) ;
112+ let deleted = 0 ;
111113 const request = index . getAllKeys ( typeName ) ;
112-
113114 request . onsuccess = ( ) => {
114- const keys = request . result ;
115- let deleted = 0 ;
116- if ( keys . length === 0 ) {
117- resolve ( 0 ) ;
118- return ;
119- }
120- for ( const key of keys ) {
121- const delReq = store . delete ( key ) ;
122- delReq . onsuccess = ( ) => {
123- deleted ++ ;
124- if ( deleted === keys . length ) resolve ( deleted ) ;
125- } ;
126- delReq . onerror = ( ) => reject ( new Error ( `Delete failed: ${ delReq . error } ` ) ) ;
115+ for ( const key of request . result ) {
116+ store . delete ( key ) ;
117+ deleted ++ ;
127118 }
128119 } ;
129- request . onerror = ( ) => reject ( new Error ( `GetAllKeys failed: ${ request . error } ` ) ) ;
120+ // Resolve the count only once the whole batch commits.
121+ tx . oncomplete = ( ) => resolve ( deleted ) ;
122+ tx . onerror = ( ) => reject ( new Error ( `Clear failed: ${ tx . error } ` ) ) ;
123+ tx . onabort = ( ) => reject ( new Error ( `Clear aborted: ${ tx . error } ` ) ) ;
130124 } ) ;
131125}
132126
0 commit comments