class IDB{
	constructor(...args){
		this.init(...args)
	}
	init(name, store){
		this.name = name
		this.store = store
	}
	start(){
		if(this.db){
			return Promise.resolve(this.db)
		}
		var request = indexedDB.open(this.name)
		request.onupgradeneeded = event => {
			var db = event.target.result
			db.createObjectStore(this.store)
		}
		return this.promise(request).then(result => {
			this.db = result
			return this.db
		}, target =>
			console.warn("DB error", target)
		)
	}
	promise(request){
		return new Promise((resolve, reject) => {
			return pageEvents.race(request, "success", "error").then(response => {
				if(response.type === "success"){
					return resolve(event.target.result)
				}else{
					return reject(event.target)
				}
			})
		})
	}
	transaction(method, ...args){
		return this.start().then(db =>
			db.transaction(this.store, "readwrite").objectStore(this.store)[method](...args)
		).then(this.promise.bind(this))
	}
	getItem(name){
		return this.transaction("get", name)
	}
	setItem(name, value){
		return this.transaction("put", value, name)
	}
	removeItem(name){
		return this.transaction("delete", name)
	}
	removeDB(){
		delete this.db
		return indexedDB.deleteDatabase(this.name)
	}
}
