UNPKG

shaka-player

Version:
99 lines (86 loc) 3 kB
/** * @license * Copyright 2016 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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) { let transaction = this.connection_.transaction([store], type); let 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); } };