aboutsummaryrefslogtreecommitdiff
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.ts138
1 files changed, 118 insertions, 20 deletions
diff --git a/packages/taler-wallet-core/src/observable-wrappers.ts b/packages/taler-wallet-core/src/observable-wrappers.ts
index 3df084268..f2c76ae5b 100644
--- a/packages/taler-wallet-core/src/observable-wrappers.ts
+++ b/packages/taler-wallet-core/src/observable-wrappers.ts
@@ -34,6 +34,7 @@ import {
HttpResponse,
} from "@gnu-taler/taler-util/http";
import { TaskIdStr } from "./common.js";
+import { TalerCryptoInterface } from "./index.js";
import {
DbAccess,
DbReadOnlyTransaction,
@@ -60,7 +61,7 @@ export class ObservableTaskScheduler implements TaskScheduler {
if (!this.taskDepCache.has(taskId)) {
this.taskDepCache.add(taskId);
this.oc.observe({
- type: ObservabilityEventType.TaskDependency,
+ type: ObservabilityEventType.DeclareTaskDependency,
taskId,
});
}
@@ -76,7 +77,7 @@ export class ObservableTaskScheduler implements TaskScheduler {
startShepherdTask(taskId: TaskIdStr): void {
this.declareDep(taskId);
this.oc.observe({
- type: ObservabilityEventType.StartTask,
+ type: ObservabilityEventType.TaskStart,
taskId,
});
return this.impl.startShepherdTask(taskId);
@@ -84,7 +85,7 @@ export class ObservableTaskScheduler implements TaskScheduler {
stopShepherdTask(taskId: TaskIdStr): void {
this.declareDep(taskId);
this.oc.observe({
- type: ObservabilityEventType.StopTask,
+ type: ObservabilityEventType.TaskStop,
taskId,
});
return this.impl.stopShepherdTask(taskId);
@@ -95,7 +96,7 @@ export class ObservableTaskScheduler implements TaskScheduler {
this.taskDepCache.clear();
}
this.oc.observe({
- type: ObservabilityEventType.ResetTask,
+ type: ObservabilityEventType.TaskReset,
taskId,
});
return this.impl.resetTaskRetries(taskId);
@@ -160,53 +161,150 @@ export class ObservableDbAccess<StoreMap> implements DbAccess<StoreMap> {
return this.impl.idbHandle();
}
- runAllStoresReadWriteTx<T>(
+ async runAllStoresReadWriteTx<T>(
txf: (
tx: DbReadWriteTransaction<StoreMap, StoreNames<StoreMap>[]>,
) => Promise<T>,
): Promise<T> {
+ const location = getCallerInfo();
this.oc.observe({
type: ObservabilityEventType.DbQueryStart,
name: "<unknown>",
- location: getCallerInfo(),
+ location,
});
- return this.impl.runAllStoresReadWriteTx(txf);
+ try {
+ const ret = await this.impl.runAllStoresReadWriteTx(txf);
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryFinishSuccess,
+ name: "<unknown>",
+ location,
+ });
+ return ret;
+ } catch (e) {
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryFinishError,
+ name: "<unknown>",
+ location,
+ });
+ throw e;
+ }
}
- runAllStoresReadOnlyTx<T>(
+ async runAllStoresReadOnlyTx<T>(
txf: (
tx: DbReadOnlyTransaction<StoreMap, StoreNames<StoreMap>[]>,
) => Promise<T>,
): Promise<T> {
+ const location = getCallerInfo();
this.oc.observe({
type: ObservabilityEventType.DbQueryStart,
name: "<unknown>",
- location: getCallerInfo(),
+ location,
});
- return this.impl.runAllStoresReadOnlyTx(txf);
+ try {
+ const ret = await this.impl.runAllStoresReadOnlyTx(txf);
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryFinishSuccess,
+ name: "<unknown>",
+ location,
+ });
+ return ret;
+ } catch (e) {
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryFinishError,
+ name: "<unknown>",
+ location,
+ });
+ throw e;
+ }
}
- runReadWriteTx<T, StoreNameArray extends StoreNames<StoreMap>[]>(
+ async runReadWriteTx<T, StoreNameArray extends StoreNames<StoreMap>[]>(
storeNames: StoreNameArray,
txf: (tx: DbReadWriteTransaction<StoreMap, StoreNameArray>) => Promise<T>,
): Promise<T> {
+ const location = getCallerInfo();
this.oc.observe({
type: ObservabilityEventType.DbQueryStart,
name: "<unknown>",
- location: getCallerInfo(),
+ location,
});
- return this.impl.runReadWriteTx(storeNames, txf);
+ try {
+ const ret = await this.impl.runReadWriteTx(storeNames, txf);
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryFinishSuccess,
+ name: "<unknown>",
+ location,
+ });
+ return ret;
+ } catch (e) {
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryFinishError,
+ name: "<unknown>",
+ location,
+ });
+ throw e;
+ }
}
- runReadOnlyTx<T, StoreNameArray extends StoreNames<StoreMap>[]>(
+ async 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);
+ const location = getCallerInfo();
+ try {
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryStart,
+ name: "<unknown>",
+ location,
+ });
+ const ret = await this.impl.runReadOnlyTx(storeNames, txf);
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryFinishSuccess,
+ name: "<unknown>",
+ location,
+ });
+ return ret;
+ } catch (e) {
+ this.oc.observe({
+ type: ObservabilityEventType.DbQueryFinishError,
+ name: "<unknown>",
+ location,
+ });
+ throw e;
+ }
}
}
+
+export function observeTalerCrypto(
+ impl: TalerCryptoInterface,
+ oc: ObservabilityContext,
+): TalerCryptoInterface {
+ return Object.fromEntries(
+ Object.keys(impl).map((name) => {
+ return [
+ name,
+ async (req: any) => {
+ oc.observe({
+ type: ObservabilityEventType.CryptoStart,
+ operation: name,
+ });
+ try {
+ const res = await (impl as any)[name](req);
+ oc.observe({
+ type: ObservabilityEventType.CryptoFinishSuccess,
+ operation: name,
+ });
+ return res;
+ } catch (e) {
+ oc.observe({
+ type: ObservabilityEventType.CryptoFinishError,
+ operation: name,
+ });
+ throw e;
+ }
+ },
+ ];
+ }),
+ ) as any;
+}