diff options
Diffstat (limited to 'packages/idb-bridge/src/BridgeIDBDatabase.ts')
| -rw-r--r-- | packages/idb-bridge/src/BridgeIDBDatabase.ts | 249 | 
1 files changed, 0 insertions, 249 deletions
diff --git a/packages/idb-bridge/src/BridgeIDBDatabase.ts b/packages/idb-bridge/src/BridgeIDBDatabase.ts deleted file mode 100644 index ffd897f9c..000000000 --- a/packages/idb-bridge/src/BridgeIDBDatabase.ts +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2017 Jeremy Scheff - * - * 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. - */ - -import { BridgeIDBTransaction } from "./BridgeIDBTransaction"; -import { -  ConstraintError, -  InvalidAccessError, -  InvalidStateError, -  NotFoundError, -  TransactionInactiveError, -} from "./util/errors"; -import fakeDOMStringList from "./util/fakeDOMStringList"; -import FakeEventTarget from "./util/FakeEventTarget"; -import { FakeDOMStringList, KeyPath, TransactionMode } from "./util/types"; -import validateKeyPath from "./util/validateKeyPath"; -import queueTask from "./util/queueTask"; -import { -  Backend, -  DatabaseConnection, -  Schema, -  DatabaseTransaction, -} from "./backend-interface"; -import { BridgeIDBObjectStore } from "./BridgeIDBObjectStore"; - -/** - * Ensure that an active version change transaction is currently running. - */ -const confirmActiveVersionchangeTransaction = (database: BridgeIDBDatabase) => { -  if (!database._runningVersionchangeTransaction) { -    throw new InvalidStateError(); -  } - -  // Find the latest versionchange transaction -  const transactions = database._transactions.filter( -    (tx: BridgeIDBTransaction) => { -      return tx.mode === "versionchange"; -    }, -  ); -  const transaction = transactions[transactions.length - 1]; - -  if (!transaction || transaction._state === "finished") { -    throw new InvalidStateError(); -  } - -  if (transaction._state !== "active") { -    throw new TransactionInactiveError(); -  } - -  return transaction; -}; - -// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#database-interface -/** @public */ -export class BridgeIDBDatabase extends FakeEventTarget { -  _closePending = false; -  _closed = false; -  _runningVersionchangeTransaction = false; -  _transactions: Array<BridgeIDBTransaction> = []; - -  _backendConnection: DatabaseConnection; -  _backend: Backend; - -  _schema: Schema; - -  get name(): string { -    return this._schema.databaseName; -  } - -  get version(): number { -    return this._schema.databaseVersion; -  } - -  get objectStoreNames(): FakeDOMStringList { -    return fakeDOMStringList(Object.keys(this._schema.objectStores)).sort(); -  } - -  /** -   * http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#database-closing-steps -   */ -  _closeConnection() { -    this._closePending = true; - -    const transactionsComplete = this._transactions.every( -      (transaction: BridgeIDBTransaction) => { -        return transaction._state === "finished"; -      }, -    ); - -    if (transactionsComplete) { -      this._closed = true; -      this._backend.close(this._backendConnection); -    } else { -      queueTask(() => { -        this._closeConnection(); -      }); -    } -  } - -  constructor(backend: Backend, backendConnection: DatabaseConnection) { -    super(); - -    this._schema = backend.getSchema(backendConnection); - -    this._backend = backend; -    this._backendConnection = backendConnection; -  } - -  // http://w3c.github.io/IndexedDB/#dom-idbdatabase-createobjectstore -  public createObjectStore( -    name: string, -    options: { autoIncrement?: boolean; keyPath?: KeyPath } | null = {}, -  ): BridgeIDBObjectStore { -    if (name === undefined) { -      throw new TypeError(); -    } -    const transaction = confirmActiveVersionchangeTransaction(this); -    const backendTx = transaction._backendTransaction; -    if (!backendTx) { -      throw Error("invariant violated"); -    } - -    const keyPath = -      options !== null && options.keyPath !== undefined -        ? options.keyPath -        : null; -    const autoIncrement = -      options !== null && options.autoIncrement !== undefined -        ? options.autoIncrement -        : false; - -    if (keyPath !== null) { -      validateKeyPath(keyPath); -    } - -    if (Object.keys(this._schema.objectStores).includes(name)) { -      throw new ConstraintError(); -    } - -    if (autoIncrement && (keyPath === "" || Array.isArray(keyPath))) { -      throw new InvalidAccessError(); -    } - -    transaction._backend.createObjectStore( -      backendTx, -      name, -      keyPath, -      autoIncrement, -    ); - -    this._schema = this._backend.getSchema(this._backendConnection); - -    return transaction.objectStore(name); -  } - -  public deleteObjectStore(name: string): void { -    if (name === undefined) { -      throw new TypeError(); -    } -    const transaction = confirmActiveVersionchangeTransaction(this); -    transaction._objectStoresCache.delete(name); -  } - -  public _internalTransaction( -    storeNames: string | string[], -    mode?: TransactionMode, -    backendTransaction?: DatabaseTransaction, -  ): BridgeIDBTransaction { -    mode = mode !== undefined ? mode : "readonly"; -    if ( -      mode !== "readonly" && -      mode !== "readwrite" && -      mode !== "versionchange" -    ) { -      throw new TypeError("Invalid mode: " + mode); -    } - -    const hasActiveVersionchange = this._transactions.some( -      (transaction: BridgeIDBTransaction) => { -        return ( -          transaction._state === "active" && -          transaction.mode === "versionchange" && -          transaction.db === this -        ); -      }, -    ); -    if (hasActiveVersionchange) { -      throw new InvalidStateError(); -    } - -    if (this._closePending) { -      throw new InvalidStateError(); -    } - -    if (!Array.isArray(storeNames)) { -      storeNames = [storeNames]; -    } -    if (storeNames.length === 0 && mode !== "versionchange") { -      throw new InvalidAccessError(); -    } -    for (const storeName of storeNames) { -      if (this.objectStoreNames.indexOf(storeName) < 0) { -        throw new NotFoundError( -          "No objectStore named " + storeName + " in this database", -        ); -      } -    } - -    const tx = new BridgeIDBTransaction( -      storeNames, -      mode, -      this, -      backendTransaction, -    ); -    this._transactions.push(tx); -    queueTask(() => tx._start()); -    return tx; -  } - -  public transaction( -    storeNames: string | string[], -    mode?: TransactionMode, -  ): BridgeIDBTransaction { -    if (mode === "versionchange") { -      throw new TypeError("Invalid mode: " + mode); -    } -    return this._internalTransaction(storeNames, mode); -  } - -  public close() { -    this._closeConnection(); -  } - -  public toString() { -    return "[object IDBDatabase]"; -  } -}  | 
