summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/observable-wrappers.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-core/src/observable-wrappers.ts')
-rw-r--r--packages/taler-wallet-core/src/observable-wrappers.ts81
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);
+ }
+}