Files
shaka-player/lib/offline/indexeddb/db_operation.js
T
Wojciech Tyczyński 82f7eafdc5 build: Add new JSDoc rules to ESLint (#7897)
Adds a replacement for removed JSDoc checks from ESLint v9.
Additionally fixes lots of issues found in the JSDoc, such as:
- missing `@param`/`@return` annotations
- bad formatting
- params order
- param name in the same line as type definition (tried to disable it,
but it was causing other issues and we didn't have lots of places with
such formatting)

Minor fixes in code found by Closure Compiler after fixing JSDoc are
also included.
2025-01-17 09:28:19 +01:00

111 lines
3.1 KiB
JavaScript

/*! @license
* Shaka Player
* Copyright 2016 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
goog.provide('shaka.offline.indexeddb.DBOperation');
goog.require('shaka.util.PublicPromise');
/**
* A DBOperation wraps an IndexedDB transaction in a promise.
*/
shaka.offline.indexeddb.DBOperation = class {
/**
* @param {IDBTransaction} transaction
* @param {string} storeName
*/
constructor(transaction, storeName) {
/** @private {IDBTransaction} */
this.transaction_ = transaction;
/** @private {IDBObjectStore} */
this.store_ = transaction.objectStore(storeName);
/** @private {!shaka.util.PublicPromise} */
this.promise_ = new shaka.util.PublicPromise();
// Connect the transaction and the promise together.
// |event.preventDefault()| is used on all non-successful callbacks to
// prevent Firefox from surfacing the error on the main thread.
transaction.onabort = (event) => {
event.preventDefault();
this.promise_.reject();
};
transaction.onerror = (event) => {
event.preventDefault();
this.promise_.reject();
};
transaction.oncomplete = (event) => {
this.promise_.resolve();
};
}
/**
* @return {!Promise}
*/
async abort() {
try {
this.transaction_.abort();
} catch (e) {
// Ignore any exceptions that may be thrown as a result of aborting
// the transaction.
}
try {
// Wait for the promise to be rejected, but ignore the rejection error.
await this.promise_;
} catch (e) {}
}
/**
* Calls the given callback for each entry in the database.
*
* @param {function(!IDBKeyType, T, !IDBCursorWithValue=):
* (Promise|undefined)} callback
* @return {!Promise}
* @template T
*/
forEachEntry(callback) {
return new Promise((resolve, reject) => {
const req = this.store_.openCursor();
req.onerror = reject;
req.onsuccess = async (event) => {
// When we reach the end of the data that the cursor is iterating over,
// |req.result| will be null to signal the end of the iteration.
// https://developer.mozilla.org/en-US/docs/Web/API/IDBCursor/continue
if (req.result == null) {
resolve();
return;
}
/** @type {!IDBCursorWithValue} */
const cursor = req.result;
await callback(cursor.key, cursor.value, cursor);
cursor.continue();
};
});
}
/**
* Get the store that the operation can interact with. Requests can be made
* on the store. All requests made on the store will complete successfully
* before the operation's promise will resolve. If any request fails, the
* operation's promise will be rejected.
*
* @return {IDBObjectStore}
*/
store() { return this.store_; }
/**
* Get the promise that wraps the transaction. This promise will resolve when
* all requests on the object store complete successfully and the transaction
* completes. If any request fails or the operation is aborted, the promise
* will be rejected.
*
* @return {!Promise}
*/
promise() { return this.promise_; }
};