1+ // @ts -check
2+
13const DEFAULT_DB_NAME = 'Default DB' ;
24const DEFAULT_STORE_NAME = 'data' ;
35
@@ -22,7 +24,7 @@ export default class DataStore {
2224 static setupDb ( options ) {
2325 const {
2426 name,
25- dbVersion : version = 1 ,
27+ version = 1 ,
2628 storesToCreate = DEFAULT_STORE_NAME ,
2729 onUpgradeNeeded = null ,
2830 } = options ;
@@ -42,7 +44,7 @@ export default class DataStore {
4244
4345 request . onupgradeneeded = ( event ) => {
4446 /** @type {IDBDatabase } */
45- const db = event . target . result ;
47+ const db = request . result ;
4648 const existingStores = db . objectStoreNames ;
4749 const dataStoreInstances = [ ] ;
4850
@@ -80,6 +82,7 @@ export default class DataStore {
8082
8183 getDb ( ) {
8284 return new Promise ( ( resolve , reject ) => {
85+ // @ts -ignore we know this.dbName and this.version exist
8386 const request = indexedDB . open ( this . dbName , this . version ) ;
8487
8588 request . onerror = ( event ) => {
@@ -95,10 +98,12 @@ export default class DataStore {
9598 request . onupgradeneeded = ( event ) => {
9699 console . log ( 'Upgrade needed' ) ;
97100 /** @type {IDBDatabase } */
98- const db = event . target . result ;
101+ const db = request . result ;
99102 const existingStores = db . objectStoreNames ;
100103
104+ // @ts -ignore we know this.storeName is a string
101105 if ( ! existingStores . contains ( this . storeName ) ) {
106+ // @ts -ignore we know this.storeName is a string
102107 db . createObjectStore ( this . storeName ) ;
103108 }
104109 } ;
@@ -107,6 +112,7 @@ export default class DataStore {
107112
108113 /** @param {string | number } key */
109114 async getItem ( key ) {
115+ /** @type {IDBDatabase } */
110116 const db = await this . getDb ( ) ;
111117
112118 if ( typeof key === 'number' ) {
@@ -118,15 +124,20 @@ export default class DataStore {
118124 }
119125
120126 return new Promise ( ( resolve , reject ) => {
127+ if ( ! this . storeName ) {
128+ reject ( new Error ( 'Store name not set' ) ) ;
129+ return ;
130+ }
131+
121132 const transaction = db . transaction ( this . storeName , 'readonly' ) ;
122133
123- transaction . onerror = ( event ) => reject ( event . target . error ) ;
134+ transaction . onerror = ( event ) => reject ( transaction . error ) ;
124135
125136 const store = transaction . objectStore ( this . storeName ) ;
126137
127138 const request = store . get ( key ) ;
128139
129- request . onerror = ( event ) => reject ( event . target . error ) ;
140+ request . onerror = ( event ) => reject ( request . error ) ;
130141
131142 request . onsuccess = ( ) => {
132143 if ( request . result === undefined ) {
@@ -145,6 +156,7 @@ export default class DataStore {
145156 * @param {any } value
146157 */
147158 async setItem ( key , value ) {
159+ /** @type {IDBDatabase } */
148160 const db = await this . getDb ( ) ;
149161
150162 if ( typeof key === 'number' ) {
@@ -155,26 +167,34 @@ export default class DataStore {
155167 throw new Error ( 'Key must be a string' ) ;
156168 }
157169
158- return new Promise ( ( resolve , reject ) => {
159- const transaction = db . transaction ( this . storeName , 'readwrite' ) ;
170+ return /** @type {Promise<void> } */ (
171+ new Promise ( ( resolve , reject ) => {
172+ if ( ! this . storeName ) {
173+ reject ( new Error ( 'Store name not set' ) ) ;
174+ return ;
175+ }
160176
161- transaction . onerror = ( event ) => reject ( event ) ;
177+ const transaction = db . transaction ( this . storeName , 'readwrite' ) ;
162178
163- const store = transaction . objectStore ( this . storeName ) ;
179+ transaction . onerror = ( event ) => reject ( transaction . error ) ;
164180
165- const request = store . put ( value , key ) ;
181+ const store = transaction . objectStore ( this . storeName ) ;
166182
167- request . onerror = ( event ) => reject ( event ) ;
183+ const request = store . add ( value , key ) ;
168184
169- request . onsuccess = ( ) => {
170- db . close ( ) ;
171- resolve ( ) ;
172- } ;
173- } ) ;
185+ request . onerror = ( event ) => reject ( request . error ) ;
186+
187+ request . onsuccess = ( ) => {
188+ db . close ( ) ;
189+ resolve ( ) ;
190+ } ;
191+ } )
192+ ) ;
174193 }
175194
176195 /** @param {string | number } key */
177196 async removeItem ( key ) {
197+ /** @type {IDBDatabase } */
178198 const db = await this . getDb ( ) ;
179199
180200 if ( typeof key === 'number' ) {
@@ -185,38 +205,50 @@ export default class DataStore {
185205 throw new Error ( 'Key must be a string' ) ;
186206 }
187207
188- return new Promise ( ( resolve , reject ) => {
189- const transaction = db . transaction ( this . storeName , 'readwrite' ) ;
208+ return /** @type {Promise<void> } */ (
209+ new Promise ( ( resolve , reject ) => {
210+ if ( ! this . storeName ) {
211+ reject ( new Error ( 'Store name not set' ) ) ;
212+ return ;
213+ }
190214
191- transaction . onerror = ( event ) => reject ( event . target . error ) ;
215+ const transaction = db . transaction ( this . storeName , 'readwrite' ) ;
192216
193- const store = transaction . objectStore ( this . storeName ) ;
217+ transaction . onerror = ( event ) => reject ( transaction . error ) ;
194218
195- const request = store . delete ( key ) ;
219+ const store = transaction . objectStore ( this . storeName ) ;
196220
197- request . onerror = ( event ) => reject ( event . target . error ) ;
221+ const request = store . delete ( key ) ;
198222
199- request . onsuccess = ( ) => {
200- db . close ( ) ;
201- resolve ( ) ;
202- } ;
203- } ) ;
223+ request . onerror = ( event ) => reject ( request . error ) ;
224+
225+ request . onsuccess = ( ) => {
226+ db . close ( ) ;
227+ resolve ( ) ;
228+ } ;
229+ } )
230+ ) ;
204231 }
205232
206233 async keys ( ) {
207234 /** @type {IDBDatabase } */
208235 const db = await this . getDb ( ) ;
209236
210237 return new Promise ( ( resolve , reject ) => {
238+ if ( ! this . storeName ) {
239+ reject ( new Error ( 'Store name not set' ) ) ;
240+ return ;
241+ }
242+
211243 const transaction = db . transaction ( this . storeName , 'readonly' ) ;
212244
213- transaction . onerror = ( event ) => reject ( event . target . error ) ;
245+ transaction . onerror = ( event ) => reject ( transaction . error ) ;
214246
215247 const store = transaction . objectStore ( this . storeName ) ;
216248
217249 const request = store . getAllKeys ( ) ;
218250
219- request . onerror = ( event ) => reject ( event . target . error ) ;
251+ request . onerror = ( event ) => reject ( request . error ) ;
220252
221253 request . onsuccess = ( ) => {
222254 resolve ( request . result ) ;
@@ -226,18 +258,24 @@ export default class DataStore {
226258 }
227259
228260 async count ( ) {
261+ /** @type {IDBDatabase } */
229262 const db = await this . getDb ( ) ;
230263
231264 return new Promise ( ( resolve , reject ) => {
265+ if ( ! this . storeName ) {
266+ reject ( new Error ( 'Store name not set' ) ) ;
267+ return ;
268+ }
269+
232270 const transaction = db . transaction ( this . storeName , 'readonly' ) ;
233271
234- transaction . onerror = ( event ) => reject ( event . target . error ) ;
272+ transaction . onerror = ( event ) => reject ( transaction . error ) ;
235273
236274 const store = transaction . objectStore ( this . storeName ) ;
237275
238276 const request = store . count ( ) ;
239277
240- request . onerror = ( event ) => reject ( event . target . error ) ;
278+ request . onerror = ( event ) => reject ( request . error ) ;
241279
242280 request . onsuccess = ( ) => {
243281 resolve ( request . result ) ;
@@ -251,23 +289,31 @@ export default class DataStore {
251289 }
252290
253291 async clear ( ) {
292+ /** @type {IDBDatabase } */
254293 const db = await this . getDb ( ) ;
255294
256- return new Promise ( ( resolve , reject ) => {
257- const transaction = db . transaction ( this . storeName , 'readwrite' ) ;
295+ return /** @type {Promise<void> } */ (
296+ new Promise ( ( resolve , reject ) => {
297+ if ( ! this . storeName ) {
298+ reject ( new Error ( 'Store name not set' ) ) ;
299+ return ;
300+ }
258301
259- transaction . onerror = ( event ) => reject ( event . target . error ) ;
302+ const transaction = db . transaction ( this . storeName , 'readwrite' ) ;
260303
261- const store = transaction . objectStore ( this . storeName ) ;
304+ transaction . onerror = ( event ) => reject ( transaction . error ) ;
262305
263- const request = store . clear ( ) ;
306+ const store = transaction . objectStore ( this . storeName ) ;
264307
265- request . onerror = ( event ) => reject ( event . target . error ) ;
308+ const request = store . clear ( ) ;
266309
267- request . onsuccess = ( ) => {
268- db . close ( ) ;
269- resolve ( ) ;
270- } ;
271- } ) ;
310+ request . onerror = ( event ) => reject ( request . error ) ;
311+
312+ request . onsuccess = ( ) => {
313+ db . close ( ) ;
314+ resolve ( ) ;
315+ } ;
316+ } )
317+ ) ;
272318 }
273319}
0 commit comments