UNPKG

shaka-player

Version:
88 lines (75 loc) 2.5 kB
/*! @license * Shaka Player * Copyright 2016 Google LLC * SPDX-License-Identifier: Apache-2.0 */ goog.provide('shaka.offline.indexeddb.DBConnection'); goog.require('shaka.offline.indexeddb.DBOperation'); goog.require('shaka.util.ArrayUtils'); /** * DBConnection is used to manage an IndexedDB connection. It can create new * operations. If the connection is killed (via |destroy|) all pending * operations will be cancelled. */ shaka.offline.indexeddb.DBConnection = class { /** * @param {IDBDatabase} connection A connection to an IndexedDB instance. */ constructor(connection) { /** @private {IDBDatabase} */ this.connection_ = connection; /** @private {!Array<shaka.offline.indexeddb.DBOperation>} */ this.pending_ = []; } /** * @return {!Promise} */ destroy() { return Promise.all(this.pending_.map((op) => { return op.abort(); })); } /** * @param {string} store The name of the store that the operation should * occur on. * @return {!shaka.offline.indexeddb.DBOperation} */ startReadOnlyOperation(store) { return this.startOperation_(store, 'readonly'); } /** * @param {string} store The name of the store that the operation should * occur on. * @return {!shaka.offline.indexeddb.DBOperation} */ startReadWriteOperation(store) { return this.startOperation_(store, 'readwrite'); } /** * @param {string} store The name of the store that the operation should * occur on. * @param {string} type The type of operation being performed on the store. * This determines what commands may be performed. This * can either be "readonly" or "readwrite". * @return {!shaka.offline.indexeddb.DBOperation} * @private */ startOperation_(store, type) { const transaction = this.connection_.transaction([store], type); const operation = new shaka.offline.indexeddb.DBOperation(transaction, store); this.pending_.push(operation); // Once the operation is done (regardless of outcome) stop tracking it. operation.promise().then( () => this.stopTracking_(operation), () => this.stopTracking_(operation)); return operation; } /** * @param {!shaka.offline.indexeddb.DBOperation} operation * @private */ stopTracking_(operation) { shaka.util.ArrayUtils.remove(this.pending_, operation); } };