summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/dev-experiments.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2022-10-12 22:27:50 +0200
committerFlorian Dold <florian@dold.me>2022-10-12 22:27:50 +0200
commitded00b680a776d03cd8c928354c87c0be8690f56 (patch)
tree2608e9c7ba1ce8bfb105a421c56cdc201a78f3c9 /packages/taler-wallet-core/src/dev-experiments.ts
parent3da1e82a245851c384c22293c928fcef1c4c2f34 (diff)
downloadwallet-core-ded00b680a776d03cd8c928354c87c0be8690f56.tar.gz
wallet-core-ded00b680a776d03cd8c928354c87c0be8690f56.tar.bz2
wallet-core-ded00b680a776d03cd8c928354c87c0be8690f56.zip
wallet-core: implement enabling/disabling dev mode
Diffstat (limited to 'packages/taler-wallet-core/src/dev-experiments.ts')
-rw-r--r--packages/taler-wallet-core/src/dev-experiments.ts118
1 files changed, 117 insertions, 1 deletions
diff --git a/packages/taler-wallet-core/src/dev-experiments.ts b/packages/taler-wallet-core/src/dev-experiments.ts
index 8e2ce5882..c3167b3e4 100644
--- a/packages/taler-wallet-core/src/dev-experiments.ts
+++ b/packages/taler-wallet-core/src/dev-experiments.ts
@@ -25,14 +25,130 @@
* Imports.
*/
-import { Logger } from "@gnu-taler/taler-util";
+import { Logger, parseDevExperimentUri } from "@gnu-taler/taler-util";
+import { ConfigRecordKey } from "./db.js";
import { InternalWalletState } from "./internal-wallet-state.js";
+import {
+ HttpRequestLibrary,
+ HttpRequestOptions,
+ HttpResponse,
+} from "./util/http.js";
const logger = new Logger("dev-experiments.ts");
+/**
+ * Apply a dev experiment to the wallet database / state.
+ */
export async function applyDevExperiment(
ws: InternalWalletState,
uri: string,
): Promise<void> {
logger.info(`applying dev experiment ${uri}`);
+ const parsedUri = parseDevExperimentUri(uri);
+ if (!parsedUri) {
+ logger.info("unable to parse dev experiment URI");
+ return;
+ }
+ if (parsedUri.devExperimentId == "enable-devmode") {
+ logger.info("enabling devmode");
+ await ws.db
+ .mktx((x) => [x.config])
+ .runReadWrite(async (tx) => {
+ tx.config.put({
+ key: ConfigRecordKey.DevMode,
+ value: true,
+ });
+ });
+ await maybeInitDevMode(ws);
+ return;
+ }
+ if (parsedUri.devExperimentId === "disable-devmode") {
+ logger.info("disabling devmode");
+ await ws.db
+ .mktx((x) => [x.config])
+ .runReadWrite(async (tx) => {
+ tx.config.put({
+ key: ConfigRecordKey.DevMode,
+ value: false,
+ });
+ });
+ await leaveDevMode(ws);
+ return;
+ }
+ if (!ws.devModeActive) {
+ throw Error(
+ "can't handle devmode URI (other than enable-devmode) unless devmode is active",
+ );
+ }
+ throw Error(`dev-experiment id not understood ${parsedUri.devExperimentId}`);
+}
+
+/**
+ * Enter dev mode, if the wallet's config entry in the DB demands it.
+ */
+export async function maybeInitDevMode(ws: InternalWalletState): Promise<void> {
+ const devMode = await ws.db
+ .mktx((x) => [x.config])
+ .runReadOnly(async (tx) => {
+ const rec = await tx.config.get(ConfigRecordKey.DevMode);
+ if (!rec || rec.key !== ConfigRecordKey.DevMode) {
+ return false;
+ }
+ return rec.value;
+ });
+ if (!devMode) {
+ ws.devModeActive = false;
+ return;
+ }
+ ws.devModeActive = true;
+ if (ws.http instanceof DevExperimentHttpLib) {
+ return;
+ }
+ ws.http = new DevExperimentHttpLib(ws.http);
+}
+
+export async function leaveDevMode(ws: InternalWalletState): Promise<void> {
+ if (ws.http instanceof DevExperimentHttpLib) {
+ ws.http = ws.http.underlyingLib;
+ }
+ ws.devModeActive = false;
+}
+
+export class DevExperimentHttpLib implements HttpRequestLibrary {
+ _isDevExperimentLib = true;
+ underlyingLib: HttpRequestLibrary;
+
+ constructor(lib: HttpRequestLibrary) {
+ this.underlyingLib = lib;
+ }
+
+ get(
+ url: string,
+ opt?: HttpRequestOptions | undefined,
+ ): Promise<HttpResponse> {
+ return this.fetch(url, {
+ method: "GET",
+ ...opt,
+ });
+ }
+
+ postJson(
+ url: string,
+ body: any,
+ opt?: HttpRequestOptions | undefined,
+ ): Promise<HttpResponse> {
+ return this.fetch(url, {
+ method: "POST",
+ body,
+ ...opt,
+ });
+ }
+
+ fetch(
+ url: string,
+ opt?: HttpRequestOptions | undefined,
+ ): Promise<HttpResponse> {
+ logger.info(`devexperiment httplib ${url}`);
+ return this.underlyingLib.fetch(url, opt);
+ }
}