diff options
Diffstat (limited to 'packages/taler-wallet-core/src/observable-wrappers.ts')
-rw-r--r-- | packages/taler-wallet-core/src/observable-wrappers.ts | 138 |
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; +} |