be even more safe in db
This commit is contained in:
parent
700eb32f5a
commit
218c7d5bd6
@ -34,7 +34,7 @@ export class Store<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Index<S,T> {
|
export class Index<S extends IDBValidKey,T> {
|
||||||
indexName: string;
|
indexName: string;
|
||||||
storeName: string;
|
storeName: string;
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ export class Index<S,T> {
|
|||||||
* with indices.
|
* with indices.
|
||||||
*/
|
*/
|
||||||
export interface QueryStream<T> {
|
export interface QueryStream<T> {
|
||||||
indexJoin<S,I>(index: Index<I,S>,
|
indexJoin<S,I extends IDBValidKey>(index: Index<I,S>,
|
||||||
keyFn: (obj: T) => I): QueryStream<[T, S]>;
|
keyFn: (obj: T) => I): QueryStream<[T, S]>;
|
||||||
filter(f: (x: any) => boolean): QueryStream<T>;
|
filter(f: (x: any) => boolean): QueryStream<T>;
|
||||||
reduce<S>(f: (v: T, acc: S) => S, start?: S): Promise<S>;
|
reduce<S>(f: (v: T, acc: S) => S, start?: S): Promise<S>;
|
||||||
@ -92,7 +92,7 @@ abstract class QueryStreamBase<T> implements QueryStream<T> {
|
|||||||
return new QueryStreamFlatMap(this, f);
|
return new QueryStreamFlatMap(this, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
indexJoin<S,I>(index: Index<I,S>,
|
indexJoin<S,I extends IDBValidKey>(index: Index<I,S>,
|
||||||
keyFn: (obj: T) => I): QueryStream<[T, S]> {
|
keyFn: (obj: T) => I): QueryStream<[T, S]> {
|
||||||
this.root.addStoreAccess(index.storeName, false);
|
this.root.addStoreAccess(index.storeName, false);
|
||||||
return new QueryStreamIndexJoin(this, index.storeName, index.indexName, keyFn);
|
return new QueryStreamIndexJoin(this, index.storeName, index.indexName, keyFn);
|
||||||
@ -301,7 +301,7 @@ export class QueryRoot {
|
|||||||
return new IterQueryStream(this, store.name, {});
|
return new IterQueryStream(this, store.name, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
iterIndex<S,T>(index: Index<S,T>, only?: S): QueryStream<T> {
|
iterIndex<S extends IDBValidKey,T>(index: Index<S,T>, only?: S): QueryStream<T> {
|
||||||
this.stores.add(index.storeName);
|
this.stores.add(index.storeName);
|
||||||
return new IterQueryStream(this, index.storeName, {
|
return new IterQueryStream(this, index.storeName, {
|
||||||
only,
|
only,
|
||||||
@ -377,7 +377,7 @@ export class QueryRoot {
|
|||||||
/**
|
/**
|
||||||
* Get one object from a store by its key.
|
* Get one object from a store by its key.
|
||||||
*/
|
*/
|
||||||
getIndexed(storeName: string, indexName: string, key: any): Promise<any> {
|
getIndexed<I extends IDBValidKey,T>(index: Index<I,T>, key: I): Promise<T|undefined> {
|
||||||
if (key === void 0) {
|
if (key === void 0) {
|
||||||
throw Error("key must not be undefined");
|
throw Error("key must not be undefined");
|
||||||
}
|
}
|
||||||
@ -385,13 +385,13 @@ export class QueryRoot {
|
|||||||
const {resolve, promise} = openPromise();
|
const {resolve, promise} = openPromise();
|
||||||
|
|
||||||
const doGetIndexed = (tx: IDBTransaction) => {
|
const doGetIndexed = (tx: IDBTransaction) => {
|
||||||
const req = tx.objectStore(storeName).index(indexName).get(key);
|
const req = tx.objectStore(index.storeName).index(index.indexName).get(key);
|
||||||
req.onsuccess = () => {
|
req.onsuccess = () => {
|
||||||
resolve(req.result);
|
resolve(req.result);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
this.addWork(doGetIndexed, storeName, false);
|
this.addWork(doGetIndexed, index.storeName, false);
|
||||||
return Promise.resolve()
|
return Promise.resolve()
|
||||||
.then(() => this.finish())
|
.then(() => this.finish())
|
||||||
.then(() => promise);
|
.then(() => promise);
|
||||||
|
@ -329,9 +329,17 @@ namespace Stores {
|
|||||||
timestampIndex = new Index<number,HistoryRecord>(this, "timestamp");
|
timestampIndex = new Index<number,HistoryRecord>(this, "timestamp");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class TransactionsStore extends Store<Transaction> {
|
||||||
|
constructor() {
|
||||||
|
super("transactions");
|
||||||
|
}
|
||||||
|
|
||||||
|
repurchaseIndex = new Index<[string,string],Transaction>(this, "repurchase");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export let exchanges: ExchangeStore = new ExchangeStore();
|
export let exchanges: ExchangeStore = new ExchangeStore();
|
||||||
export let transactions: Store<Transaction> = new Store<Transaction>("transactions");
|
export let transactions: TransactionsStore = new TransactionsStore();
|
||||||
export let reserves: Store<ReserveRecord> = new Store<ReserveRecord>("reserves");
|
export let reserves: Store<ReserveRecord> = new Store<ReserveRecord>("reserves");
|
||||||
export let coins: CoinsStore = new CoinsStore();
|
export let coins: CoinsStore = new CoinsStore();
|
||||||
export let refresh: Store<RefreshSession> = new Store<RefreshSession>("refresh");
|
export let refresh: Store<RefreshSession> = new Store<RefreshSession>("refresh");
|
||||||
@ -1444,10 +1452,9 @@ export class Wallet {
|
|||||||
console.log("no repurchase: no correlation id");
|
console.log("no repurchase: no correlation id");
|
||||||
return {isRepurchase: false};
|
return {isRepurchase: false};
|
||||||
}
|
}
|
||||||
let result: Transaction = await (
|
let result: Transaction|undefined = await (
|
||||||
this.q()
|
this.q()
|
||||||
.getIndexed("transactions",
|
.getIndexed(Stores.transactions.repurchaseIndex,
|
||||||
"repurchase",
|
|
||||||
[
|
[
|
||||||
contract.merchant_pub,
|
contract.merchant_pub,
|
||||||
contract.repurchase_correlation_id
|
contract.repurchase_correlation_id
|
||||||
|
Loading…
Reference in New Issue
Block a user