LevelStorage = async ({ path, valueEncoding } = {}) => {
  path = path || defaultPath
  valueEncoding = valueEncoding || defaultValueEncoding

  const db = new Level(path, { valueEncoding, passive: true })
  await db.open()

  /**
   * Puts data to Level.
   * @function
   * @param {string} hash The hash of the data to put.
   * @param {*} data The data to store.
   * @memberof module:Storage.Storage-Level
   * @instance
   */
  const put = async (hash, value) => {
    await db.put(hash, value)
  }

  /**
   * Deletes data from Level.
   * @function
   * @param {string} hash The hash of the data to delete.
   * @param {*} data The data to store.
   * @memberof module:Storage.Storage-Level
   * @instance
   */
  const del = async (hash) => {
    await db.del(hash)
  }

  /**
   * Gets data from Level.
   * @function
   * @param {string} hash The hash of the data to get.
   * @memberof module:Storage.Storage-Level
   * @instance
   */
  const get = async (hash) => {
    try {
      const value = await db.get(hash)
      if (value) {
        return value
      }
    } catch (e) {
      // LEVEL_NOT_FOUND (ie. key not found)
    }
  }

  /**
   * Iterates over records stored in Level.
   * @function
   * @yields [string, string] The next key/value pair from Level.
   * @memberof module:Storage.Storage-Level
   * @instance
   */
  const iterator = async function * ({ amount, reverse } = {}) {
    const iteratorOptions = { limit: amount || -1, reverse: reverse || false }
    for await (const [key, value] of db.iterator(iteratorOptions)) {
      yield [key, value]
    }
  }
  const merge = async (other) => {}

  /**
  * Clears the contents of the Level db.
  * @function
  * @memberof module:Storage.Storage-Level
  * @instance
  */
  const clear = async () => {
    await db.clear()
  }

  /**
  * Closes the Level db.
  * @function
  * @memberof module:Storage.Storage-Level
  * @instance
  */
  const close = async () => {
    await db.close()
  }

  return {
    put,
    del,
    get,
    iterator,
    merge,
    clear,
    close
  }
}
Creates an instance of LevelStorage.
@function
@param {Object} [params={}] One or more parameters for configuring
LevelStorage.
@param {string} [params.path=defaultPath] The Level path.
@param {string} [params.valueEncoding=defaultValueEncoding] Value encoding.
@return {module:Storage.Storage-Level} An instance of LevelStorage.
@memberof module:Storage
@instance