diff options
Diffstat (limited to 'packages/taler-wallet-core/src/observable-wrappers.ts')
-rw-r--r-- | packages/taler-wallet-core/src/observable-wrappers.ts | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/packages/taler-wallet-core/src/observable-wrappers.ts b/packages/taler-wallet-core/src/observable-wrappers.ts index 77839e047..3df084268 100644 --- a/packages/taler-wallet-core/src/observable-wrappers.ts +++ b/packages/taler-wallet-core/src/observable-wrappers.ts @@ -21,6 +21,7 @@ /** * Imports. */ +import { IDBDatabase } from "@gnu-taler/idb-bridge"; import { ObservabilityContext, ObservabilityEventType, @@ -33,6 +34,12 @@ import { HttpResponse, } from "@gnu-taler/taler-util/http"; import { TaskIdStr } from "./common.js"; +import { + DbAccess, + DbReadOnlyTransaction, + DbReadWriteTransaction, + StoreNames, +} from "./query.js"; import { TaskScheduler } from "./shepherd.js"; /** @@ -129,3 +136,77 @@ export class ObservableHttpClientLibrary implements HttpRequestLibrary { } } } + +const locRegex = /\s*at\s*([a-zA-Z0-9_.!]*)\s*/; + +export function getCallerInfo(up: number = 2): string { + const stack = new Error().stack ?? ""; + const identifies: string[] = []; + for (const line of stack.split("\n")) { + let l = line.match(locRegex); + if (l) { + identifies.push(l[1]); + } + } + return identifies.slice(up, up + 2).join("/"); +} + +export class ObservableDbAccess<StoreMap> implements DbAccess<StoreMap> { + constructor( + private impl: DbAccess<StoreMap>, + private oc: ObservabilityContext, + ) {} + idbHandle(): IDBDatabase { + return this.impl.idbHandle(); + } + + runAllStoresReadWriteTx<T>( + txf: ( + tx: DbReadWriteTransaction<StoreMap, StoreNames<StoreMap>[]>, + ) => Promise<T>, + ): Promise<T> { + this.oc.observe({ + type: ObservabilityEventType.DbQueryStart, + name: "<unknown>", + location: getCallerInfo(), + }); + return this.impl.runAllStoresReadWriteTx(txf); + } + + runAllStoresReadOnlyTx<T>( + txf: ( + tx: DbReadOnlyTransaction<StoreMap, StoreNames<StoreMap>[]>, + ) => Promise<T>, + ): Promise<T> { + this.oc.observe({ + type: ObservabilityEventType.DbQueryStart, + name: "<unknown>", + location: getCallerInfo(), + }); + return this.impl.runAllStoresReadOnlyTx(txf); + } + + runReadWriteTx<T, StoreNameArray extends StoreNames<StoreMap>[]>( + storeNames: StoreNameArray, + txf: (tx: DbReadWriteTransaction<StoreMap, StoreNameArray>) => Promise<T>, + ): Promise<T> { + this.oc.observe({ + type: ObservabilityEventType.DbQueryStart, + name: "<unknown>", + location: getCallerInfo(), + }); + return this.impl.runReadWriteTx(storeNames, txf); + } + + runReadOnlyTx<T, StoreNameArray extends StoreNames<StoreMap>[]>( + storeNames: StoreNameArray, + txf: (tx: DbReadOnlyTransaction<StoreMap, StoreNameArray>) => Promise<T>, + ): Promise<T> { + this.oc.observe({ + type: ObservabilityEventType.DbQueryStart, + name: "<unknown>", + location: getCallerInfo(), + }); + return this.impl.runReadOnlyTx(storeNames, txf); + } +} |