diff options
Diffstat (limited to 'bank/index.js')
-rw-r--r-- | bank/index.js | 1507 |
1 files changed, 859 insertions, 648 deletions
diff --git a/bank/index.js b/bank/index.js index 077e9190e..86a1bf29a 100644 --- a/bank/index.js +++ b/bank/index.js @@ -6667,12 +6667,21 @@ var TalerErrorCode; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_PAY_WIRE_METHOD_UNSUPPORTED"] = 2175] = "MERCHANT_POST_ORDERS_ID_PAY_WIRE_METHOD_UNSUPPORTED"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_PAID_CONTRACT_HASH_MISMATCH"] = 2200] = "MERCHANT_POST_ORDERS_ID_PAID_CONTRACT_HASH_MISMATCH"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_PAID_COIN_SIGNATURE_INVALID"] = 2201] = "MERCHANT_POST_ORDERS_ID_PAID_COIN_SIGNATURE_INVALID"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_TOKEN_FAMILY_CONFLICT"] = 2225] = "MERCHANT_POST_TOKEN_FAMILY_CONFLICT"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_PATCH_TOKEN_FAMILY_NOT_FOUND"] = 2226] = "MERCHANT_PATCH_TOKEN_FAMILY_NOT_FOUND"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_ABORT_EXCHANGE_REFUND_FAILED"] = 2251] = "MERCHANT_POST_ORDERS_ID_ABORT_EXCHANGE_REFUND_FAILED"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_ABORT_EXCHANGE_LOOKUP_FAILED"] = 2252] = "MERCHANT_POST_ORDERS_ID_ABORT_EXCHANGE_LOOKUP_FAILED"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_ABORT_CONTRACT_NOT_FOUND"] = 2253] = "MERCHANT_POST_ORDERS_ID_ABORT_CONTRACT_NOT_FOUND"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_ABORT_REFUND_REFUSED_PAYMENT_COMPLETE"] = 2254] = "MERCHANT_POST_ORDERS_ID_ABORT_REFUND_REFUSED_PAYMENT_COMPLETE"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_ABORT_CONTRACT_HASH_MISSMATCH"] = 2255] = "MERCHANT_POST_ORDERS_ID_ABORT_CONTRACT_HASH_MISSMATCH"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_ABORT_COINS_ARRAY_EMPTY"] = 2256] = "MERCHANT_POST_ORDERS_ID_ABORT_COINS_ARRAY_EMPTY"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_AWAITING_KEYS"] = 2258] = "MERCHANT_EXCHANGE_TRANSFERS_AWAITING_KEYS"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_AWAITING_LIST"] = 2259] = "MERCHANT_EXCHANGE_TRANSFERS_AWAITING_LIST"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_FATAL_NO_EXCHANGE"] = 2260] = "MERCHANT_EXCHANGE_TRANSFERS_FATAL_NO_EXCHANGE"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_FATAL_NOT_FOUND"] = 2261] = "MERCHANT_EXCHANGE_TRANSFERS_FATAL_NOT_FOUND"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_RATE_LIMITED"] = 2262] = "MERCHANT_EXCHANGE_TRANSFERS_RATE_LIMITED"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_TRANSIENT_FAILURE"] = 2263] = "MERCHANT_EXCHANGE_TRANSFERS_TRANSIENT_FAILURE"; + TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_HARD_FAILURE"] = 2264] = "MERCHANT_EXCHANGE_TRANSFERS_HARD_FAILURE"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_CLAIM_NOT_FOUND"] = 2300] = "MERCHANT_POST_ORDERS_ID_CLAIM_NOT_FOUND"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_CLAIM_ALREADY_CLAIMED"] = 2301] = "MERCHANT_POST_ORDERS_ID_CLAIM_ALREADY_CLAIMED"; TalerErrorCode2[TalerErrorCode2["MERCHANT_POST_ORDERS_ID_CLAIM_CLIENT_INTERNAL_FAILURE"] = 2302] = "MERCHANT_POST_ORDERS_ID_CLAIM_CLIENT_INTERNAL_FAILURE"; @@ -6708,13 +6717,6 @@ var TalerErrorCode; TalerErrorCode2[TalerErrorCode2["MERCHANT_PRIVATE_POST_TRANSFERS_ACCOUNT_NOT_FOUND"] = 2555] = "MERCHANT_PRIVATE_POST_TRANSFERS_ACCOUNT_NOT_FOUND"; TalerErrorCode2[TalerErrorCode2["MERCHANT_PRIVATE_DELETE_TRANSFERS_ALREADY_CONFIRMED"] = 2556] = "MERCHANT_PRIVATE_DELETE_TRANSFERS_ALREADY_CONFIRMED"; TalerErrorCode2[TalerErrorCode2["MERCHANT_PRIVATE_POST_TRANSFERS_CONFLICTING_SUBMISSION"] = 2557] = "MERCHANT_PRIVATE_POST_TRANSFERS_CONFLICTING_SUBMISSION"; - TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_AWAITING_KEYS"] = 2258] = "MERCHANT_EXCHANGE_TRANSFERS_AWAITING_KEYS"; - TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_AWAITING_LIST"] = 2259] = "MERCHANT_EXCHANGE_TRANSFERS_AWAITING_LIST"; - TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_FATAL_NO_EXCHANGE"] = 2260] = "MERCHANT_EXCHANGE_TRANSFERS_FATAL_NO_EXCHANGE"; - TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_FATAL_NOT_FOUND"] = 2261] = "MERCHANT_EXCHANGE_TRANSFERS_FATAL_NOT_FOUND"; - TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_RATE_LIMITED"] = 2262] = "MERCHANT_EXCHANGE_TRANSFERS_RATE_LIMITED"; - TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_TRANSIENT_FAILURE"] = 2263] = "MERCHANT_EXCHANGE_TRANSFERS_TRANSIENT_FAILURE"; - TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_HARD_FAILURE"] = 2264] = "MERCHANT_EXCHANGE_TRANSFERS_HARD_FAILURE"; TalerErrorCode2[TalerErrorCode2["MERCHANT_EXCHANGE_TRANSFERS_CONFLICTING_TRANSFERS"] = 2563] = "MERCHANT_EXCHANGE_TRANSFERS_CONFLICTING_TRANSFERS"; TalerErrorCode2[TalerErrorCode2["MERCHANT_PRIVATE_POST_INSTANCES_ALREADY_EXISTS"] = 2600] = "MERCHANT_PRIVATE_POST_INSTANCES_ALREADY_EXISTS"; TalerErrorCode2[TalerErrorCode2["MERCHANT_PRIVATE_POST_INSTANCES_BAD_AUTH"] = 2601] = "MERCHANT_PRIVATE_POST_INSTANCES_BAD_AUTH"; @@ -6842,6 +6844,8 @@ var TalerErrorCode; TalerErrorCode2[TalerErrorCode2["WALLET_EXCHANGE_UNAVAILABLE"] = 7032] = "WALLET_EXCHANGE_UNAVAILABLE"; TalerErrorCode2[TalerErrorCode2["WALLET_EXCHANGE_ENTRY_USED"] = 7033] = "WALLET_EXCHANGE_ENTRY_USED"; TalerErrorCode2[TalerErrorCode2["WALLET_DB_UNAVAILABLE"] = 7034] = "WALLET_DB_UNAVAILABLE"; + TalerErrorCode2[TalerErrorCode2["WALLET_TALER_URI_MALFORMED"] = 7035] = "WALLET_TALER_URI_MALFORMED"; + TalerErrorCode2[TalerErrorCode2["WALLET_CORE_REQUEST_CANCELLED"] = 7036] = "WALLET_CORE_REQUEST_CANCELLED"; TalerErrorCode2[TalerErrorCode2["ANASTASIS_GENERIC_BACKEND_TIMEOUT"] = 8e3] = "ANASTASIS_GENERIC_BACKEND_TIMEOUT"; TalerErrorCode2[TalerErrorCode2["ANASTASIS_GENERIC_INVALID_PAYMENT_REQUEST"] = 8001] = "ANASTASIS_GENERIC_INVALID_PAYMENT_REQUEST"; TalerErrorCode2[TalerErrorCode2["ANASTASIS_GENERIC_BACKEND_ERROR"] = 8002] = "ANASTASIS_GENERIC_BACKEND_ERROR"; @@ -6909,6 +6913,8 @@ var TalerErrorCode; TalerErrorCode2[TalerErrorCode2["ANASTASIS_REDUCER_INTERNAL_ERROR"] = 8419] = "ANASTASIS_REDUCER_INTERNAL_ERROR"; TalerErrorCode2[TalerErrorCode2["ANASTASIS_REDUCER_PROVIDERS_ALREADY_SYNCED"] = 8420] = "ANASTASIS_REDUCER_PROVIDERS_ALREADY_SYNCED"; TalerErrorCode2[TalerErrorCode2["DONAU_GENERIC_KEYS_MISSING"] = 8607] = "DONAU_GENERIC_KEYS_MISSING"; + TalerErrorCode2[TalerErrorCode2["DONAU_CHARITY_SIGNATURE_INVALID"] = 8608] = "DONAU_CHARITY_SIGNATURE_INVALID"; + TalerErrorCode2[TalerErrorCode2["DONAU_CHARITY_NOT_FOUND"] = 8609] = "DONAU_CHARITY_NOT_FOUND"; TalerErrorCode2[TalerErrorCode2["LIBEUFIN_NEXUS_GENERIC_ERROR"] = 9e3] = "LIBEUFIN_NEXUS_GENERIC_ERROR"; TalerErrorCode2[TalerErrorCode2["LIBEUFIN_NEXUS_UNCAUGHT_EXCEPTION"] = 9001] = "LIBEUFIN_NEXUS_UNCAUGHT_EXCEPTION"; TalerErrorCode2[TalerErrorCode2["LIBEUFIN_SANDBOX_GENERIC_ERROR"] = 9500] = "LIBEUFIN_SANDBOX_GENERIC_ERROR"; @@ -7104,6 +7110,38 @@ var amountFractionalBase = 1e8; var amountFractionalLength = 8; var amountMaxValue = 2 ** 52; var FRAC_SEPARATOR = "."; +var Amount = class _Amount { + static from(a5) { + return new _Amount(Amounts.parseOrThrow(a5), 0); + } + static zeroOfCurrency(currency) { + return new _Amount(Amounts.zeroOfCurrency(currency), 0); + } + add(...a5) { + if (this.saturated) { + return this; + } + const r3 = Amounts.add(this.val, ...a5); + return new _Amount(r3.amount, r3.saturated ? 1 : 0); + } + mult(n2) { + if (this.saturated) { + return this; + } + const r3 = Amounts.mult(this, n2); + return new _Amount(r3.amount, r3.saturated ? 1 : 0); + } + toJson() { + return { ...this.val }; + } + toString() { + return Amounts.stringify(this.val); + } + constructor(val, saturated) { + this.val = val; + this.saturated = saturated; + } +}; function codecForAmountString() { return { decode(x6, c4) { @@ -7147,6 +7185,9 @@ var Amounts = class _Amounts { if (typeof amt === "string") { return _Amounts.parseOrThrow(amt); } + if (amt instanceof Amount) { + return amt.toJson(); + } return amt; } static divmod(a1, a22) { @@ -7366,6 +7407,9 @@ var Amounts = class _Amounts { * throw if the input is not a valid amount. */ static parseOrThrow(s5) { + if (s5 instanceof Amount) { + return s5.toJson(); + } if (typeof s5 === "object") { if (typeof s5.currency !== "string") { throw Error("invalid amount object"); @@ -9140,14 +9184,21 @@ function parseURL(input, options) { }); } var URLImpl = class { + //Include URL type for "url" and "base" params. constructor(url, base2) { let parsedBase = null; if (base2 !== void 0) { + if (base2 instanceof URL) { + base2 = base2.href; + } parsedBase = basicURLParse(base2); if (parsedBase === null) { throw new TypeError(`Invalid base URL: ${base2}`); } } + if (url instanceof URL) { + url = url.href; + } const parsedURL = basicURLParse(url, { baseURL: parsedBase }); if (parsedURL === null) { throw new TypeError(`Invalid URL: ${url}`); @@ -10353,36 +10404,36 @@ var Duration; Duration2.clamp = clamp; })(Duration || (Duration = {})); var AbsoluteTime; -(function(AbsoluteTime4) { +(function(AbsoluteTime5) { function getStampMsNow() { return (/* @__PURE__ */ new Date()).getTime(); } - AbsoluteTime4.getStampMsNow = getStampMsNow; + AbsoluteTime5.getStampMsNow = getStampMsNow; function getStampMsNever() { return Number.MAX_SAFE_INTEGER; } - AbsoluteTime4.getStampMsNever = getStampMsNever; + AbsoluteTime5.getStampMsNever = getStampMsNever; function now() { return { t_ms: (/* @__PURE__ */ new Date()).getTime() + timeshift, [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.now = now; + AbsoluteTime5.now = now; function never() { return { t_ms: "never", [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.never = never; + AbsoluteTime5.never = never; function fromMilliseconds(ms) { return { t_ms: ms, [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.fromMilliseconds = fromMilliseconds; + AbsoluteTime5.fromMilliseconds = fromMilliseconds; function cmp(t1, t22) { if (t1.t_ms === "never") { if (t22.t_ms === "never") { @@ -10401,7 +10452,7 @@ var AbsoluteTime; } return -1; } - AbsoluteTime4.cmp = cmp; + AbsoluteTime5.cmp = cmp; function min(t1, t22) { if (t1.t_ms === "never") { return { t_ms: t22.t_ms, [opaque_AbsoluteTime]: true }; @@ -10411,7 +10462,7 @@ var AbsoluteTime; } return { t_ms: Math.min(t1.t_ms, t22.t_ms), [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.min = min; + AbsoluteTime5.min = min; function max(t1, t22) { if (t1.t_ms === "never") { return { t_ms: "never", [opaque_AbsoluteTime]: true }; @@ -10421,7 +10472,7 @@ var AbsoluteTime; } return { t_ms: Math.max(t1.t_ms, t22.t_ms), [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.max = max; + AbsoluteTime5.max = max; function difference(t1, t22) { if (t1.t_ms === "never") { return { d_ms: "forever" }; @@ -10431,15 +10482,15 @@ var AbsoluteTime; } return { d_ms: Math.abs(t1.t_ms - t22.t_ms) }; } - AbsoluteTime4.difference = difference; + AbsoluteTime5.difference = difference; function isExpired(t4) { return cmp(t4, now()) <= 0; } - AbsoluteTime4.isExpired = isExpired; + AbsoluteTime5.isExpired = isExpired; function isNever(t4) { return t4.t_ms === "never"; } - AbsoluteTime4.isNever = isNever; + AbsoluteTime5.isNever = isNever; function fromProtocolTimestamp(t4) { if (t4.t_s === "never") { return { t_ms: "never", [opaque_AbsoluteTime]: true }; @@ -10449,14 +10500,14 @@ var AbsoluteTime; [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.fromProtocolTimestamp = fromProtocolTimestamp; + AbsoluteTime5.fromProtocolTimestamp = fromProtocolTimestamp; function fromStampMs(stampMs) { return { t_ms: stampMs, [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.fromStampMs = fromStampMs; + AbsoluteTime5.fromStampMs = fromStampMs; function fromPreciseTimestamp(t4) { if (t4.t_s === "never") { return { t_ms: "never", [opaque_AbsoluteTime]: true }; @@ -10467,14 +10518,14 @@ var AbsoluteTime; [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.fromPreciseTimestamp = fromPreciseTimestamp; + AbsoluteTime5.fromPreciseTimestamp = fromPreciseTimestamp; function toStampMs(at2) { if (at2.t_ms === "never") { return Number.MAX_SAFE_INTEGER; } return at2.t_ms; } - AbsoluteTime4.toStampMs = toStampMs; + AbsoluteTime5.toStampMs = toStampMs; function toPreciseTimestamp(at2) { if (at2.t_ms == "never") { return { @@ -10488,7 +10539,7 @@ var AbsoluteTime; off_us }; } - AbsoluteTime4.toPreciseTimestamp = toPreciseTimestamp; + AbsoluteTime5.toPreciseTimestamp = toPreciseTimestamp; function toProtocolTimestamp(at2) { if (at2.t_ms === "never") { return { t_s: "never" }; @@ -10497,7 +10548,7 @@ var AbsoluteTime; t_s: Math.floor(at2.t_ms / 1e3) }; } - AbsoluteTime4.toProtocolTimestamp = toProtocolTimestamp; + AbsoluteTime5.toProtocolTimestamp = toProtocolTimestamp; function isBetween(t4, start, end) { if (cmp(t4, start) < 0) { return false; @@ -10507,7 +10558,7 @@ var AbsoluteTime; } return true; } - AbsoluteTime4.isBetween = isBetween; + AbsoluteTime5.isBetween = isBetween; function toIsoString(t4) { if (t4.t_ms === "never") { return "<never>"; @@ -10515,14 +10566,14 @@ var AbsoluteTime; return new Date(t4.t_ms).toISOString(); } } - AbsoluteTime4.toIsoString = toIsoString; + AbsoluteTime5.toIsoString = toIsoString; function addDuration(t1, d5) { if (t1.t_ms === "never" || d5.d_ms === "forever") { return { t_ms: "never", [opaque_AbsoluteTime]: true }; } return { t_ms: t1.t_ms + d5.d_ms, [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.addDuration = addDuration; + AbsoluteTime5.addDuration = addDuration; function remaining(t1) { if (t1.t_ms === "never") { return Duration.getForever(); @@ -10533,7 +10584,7 @@ var AbsoluteTime; } return Duration.fromMilliseconds(Math.max(0, t1.t_ms - stampNow.t_ms)); } - AbsoluteTime4.remaining = remaining; + AbsoluteTime5.remaining = remaining; function subtractDuraction(t1, d5) { if (t1.t_ms === "never") { return { t_ms: "never", [opaque_AbsoluteTime]: true }; @@ -10543,14 +10594,14 @@ var AbsoluteTime; } return { t_ms: Math.max(0, t1.t_ms - d5.d_ms), [opaque_AbsoluteTime]: true }; } - AbsoluteTime4.subtractDuraction = subtractDuraction; + AbsoluteTime5.subtractDuraction = subtractDuraction; function stringify(t4) { if (t4.t_ms === "never") { return "never"; } return new Date(t4.t_ms).toISOString(); } - AbsoluteTime4.stringify = stringify; + AbsoluteTime5.stringify = stringify; })(AbsoluteTime || (AbsoluteTime = {})); var SECONDS = 1e3; var MINUTES = SECONDS * 60; @@ -10584,6 +10635,9 @@ function durationMul(d5, n2) { } var codecForAbsoluteTime = { decode(x6, c4) { + if (x6 === void 0) { + throw Error(`got undefined and expected absolute time at ${renderContext(c4)}`); + } const t_ms = x6.t_ms; if (typeof t_ms === "string") { if (t_ms === "never") { @@ -10597,6 +10651,9 @@ var codecForAbsoluteTime = { }; var codecForTimestamp = { decode(x6, c4) { + if (x6 === void 0) { + throw Error(`got undefined and expected timestamp at ${renderContext(c4)}`); + } const t_ms = x6.t_ms; if (typeof t_ms === "string") { if (t_ms === "never") { @@ -11545,6 +11602,177 @@ function parsePaytoUri(s5) { }; } +// ../taler-util/lib/http-common.js +var textEncoder = new TextEncoder(); +var logger3 = new Logger("http.ts"); +var DEFAULT_REQUEST_TIMEOUT_MS = 6e4; +var Headers2 = class { + constructor() { + this.headerMap = /* @__PURE__ */ new Map(); + } + get(name) { + const r3 = this.headerMap.get(name.toLowerCase()); + if (r3) { + return r3; + } + return null; + } + set(name, value) { + const normalizedName = name.toLowerCase(); + const existing = this.headerMap.get(normalizedName); + if (existing !== void 0) { + this.headerMap.set(normalizedName, existing + "," + value); + } else { + this.headerMap.set(normalizedName, value); + } + } + toJSON() { + const m5 = {}; + this.headerMap.forEach((v3, k5) => m5[k5] = v3); + return m5; + } +}; +async function readTalerErrorResponse(httpResponse) { + const contentType = httpResponse.headers.get("content-type"); + if (contentType !== "application/json") { + throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + contentType: contentType || "<null>" + }, "Error response did not even contain JSON. The request URL might be wrong or the service might be unavailable."); + } + let errJson; + try { + errJson = await httpResponse.json(); + } catch (e4) { + throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + validationError: e4.toString() + }, "Couldn't parse JSON format from error response"); + } + const talerErrorCode = errJson.code; + if (typeof talerErrorCode !== "number") { + logger3.warn(`malformed error response (status ${httpResponse.status}): ${j2s(errJson)}`); + throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status + }, "Error response did not contain error code"); + } + return errJson; +} +async function readSuccessResponseJsonOrErrorCode(httpResponse, codec) { + if (!(httpResponse.status >= 200 && httpResponse.status < 300)) { + return { + isError: true, + talerErrorResponse: await readTalerErrorResponse(httpResponse) + }; + } + let respJson; + try { + respJson = await httpResponse.json(); + } catch (e4) { + throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + validationError: e4.toString() + }, "Couldn't parse JSON format from response"); + } + let parsedResponse; + try { + parsedResponse = codec.decode(respJson); + } catch (e4) { + throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + validationError: e4.toString() + }, "Response invalid"); + } + return { + isError: false, + response: parsedResponse + }; +} +function throwUnexpectedRequestError(httpResponse, talerErrorResponse) { + throw TalerError.fromDetail(TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR, { + requestUrl: httpResponse.requestUrl, + requestMethod: httpResponse.requestMethod, + httpStatusCode: httpResponse.status, + errorResponse: talerErrorResponse + }, `Unexpected HTTP status ${httpResponse.status} in response`); +} +async function readSuccessResponseJsonOrThrow(httpResponse, codec) { + const r3 = await readSuccessResponseJsonOrErrorCode(httpResponse, codec); + if (!r3.isError) { + return r3.response; + } + throwUnexpectedRequestError(httpResponse, r3.talerErrorResponse); +} +function encodeBody(body) { + if (body == null) { + return new ArrayBuffer(0); + } + if (typeof body === "string") { + return textEncoder.encode(body).buffer; + } else if (ArrayBuffer.isView(body)) { + return body.buffer; + } else if (body instanceof ArrayBuffer) { + return body; + } else if (typeof body === "object") { + return textEncoder.encode(JSON.stringify(body)).buffer; + } + throw new TypeError("unsupported request body type"); +} +function getDefaultHeaders(method) { + const headers = {}; + if (method === "POST" || method === "PUT" || method === "PATCH") { + headers["Content-Type"] = "application/json"; + } + headers["Accept"] = "application/json"; + return headers; +} +function makeBasicAuthHeader(username, password) { + const auth = `${username}:${password}`; + const authEncoded = base64FromArrayBuffer(stringToBytes(auth)); + return `Basic ${authEncoded}`; +} + +// ../taler-util/lib/operation.js +async function opSuccessFromHttp(resp, codec) { + const body = await readSuccessResponseJsonOrThrow(resp, codec); + return { type: "ok", body }; +} +function opFixedSuccess(body) { + return { type: "ok", body }; +} +function opEmptySuccess(resp) { + return { type: "ok", body: void 0 }; +} +async function opKnownAlternativeFailure(resp, s5, codec) { + const body = await readSuccessResponseJsonOrThrow(resp, codec); + return { type: "fail", case: s5, body }; +} +async function opKnownHttpFailure(s5, resp) { + const detail = await readTalerErrorResponse(resp); + return { type: "fail", case: s5, detail }; +} +function opKnownTalerFailure(s5, detail) { + return { type: "fail", case: s5, detail }; +} +function opUnknownFailure(resp, error2) { + throw TalerError.fromDetail(TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR, { + requestUrl: resp.requestUrl, + requestMethod: resp.requestMethod, + httpStatusCode: resp.status, + errorResponse: error2 + }, `Unexpected HTTP status ${resp.status} in response`); +} + // ../taler-util/lib/taleruri.js function codecForTalerUriString() { return { @@ -11559,24 +11787,33 @@ function codecForTalerUriString() { } }; } -function parseWithdrawUri(s5) { - const pi = parseProtoInfo(s5, "withdraw"); - if (!pi) { - return void 0; +function parseWithdrawUriWithError(s5) { + const pi = parseProtoInfoWithError(s5, "withdraw"); + if (pi.type === "fail") { + return pi; } - const parts = pi.rest.split("/"); + const parts = pi.body.rest.split("/"); if (parts.length < 2) { - return void 0; + return opKnownTalerFailure(TalerErrorCode.WALLET_TALER_URI_MALFORMED, { + code: TalerErrorCode.WALLET_TALER_URI_MALFORMED + }); } const host = parts[0].toLowerCase(); const pathSegments = parts.slice(1, parts.length - 1); const withdrawId = parts[parts.length - 1]; const p4 = [host, ...pathSegments].join("/"); - return { + const result = { type: TalerUriAction.Withdraw, - bankIntegrationApiBaseUrl: canonicalizeBaseUrl(`${pi.innerProto}://${p4}/`), + bankIntegrationApiBaseUrl: canonicalizeBaseUrl(`${pi.body.innerProto}://${p4}/`), withdrawalOperationId: withdrawId }; + return opFixedSuccess(result); +} +function parseWithdrawUri(s5) { + const r3 = parseWithdrawUriWithError(s5); + if (r3.type === "fail") + return void 0; + return r3.body; } var TalerUriType; (function(TalerUriType2) { @@ -11621,6 +11858,30 @@ function parseProtoInfo(s5, action) { return void 0; } } +function parseProtoInfoWithError(s5, action) { + if (!s5.toLowerCase().startsWith("taler://") && !s5.toLowerCase().startsWith("taler+http://")) { + return opKnownTalerFailure(TalerErrorCode.WALLET_TALER_URI_MALFORMED, { + code: TalerErrorCode.WALLET_TALER_URI_MALFORMED + }); + } + const pfxPlain = `taler://${action}/`; + const pfxHttp = `taler+http://${action}/`; + if (s5.toLowerCase().startsWith(pfxPlain)) { + return opFixedSuccess({ + innerProto: "https", + rest: s5.substring(pfxPlain.length) + }); + } else if (s5.toLowerCase().startsWith(pfxHttp)) { + return opFixedSuccess({ + innerProto: "http", + rest: s5.substring(pfxHttp.length) + }); + } else { + return opKnownTalerFailure(TalerErrorCode.WALLET_TALER_URI_MALFORMED, { + code: TalerErrorCode.WALLET_TALER_URI_MALFORMED + }); + } +} var parsers = { [TalerUriAction.Pay]: parsePayUri, [TalerUriAction.PayPull]: parsePayPullUri, @@ -11930,6 +12191,7 @@ function getUrlInfo(baseUrl, params = {}) { // ../taler-util/lib/http-client/types.js var codecForAccessToken = codecForString; var codecForTokenSuccessResponse = () => buildCodecForObject().property("access_token", codecForAccessToken()).property("expiration", codecForTimestamp).build("TalerAuthentication.TokenSuccessResponse"); +var codecForTokenSuccessResponseMerchant = () => buildCodecForObject().property("token", codecForAccessToken()).property("expiration", codecForTimestamp).build("TalerAuthentication.TokenSuccessResponseMerchant"); var codecForCurrencySpecificiation = () => buildCodecForObject().property("name", codecForString()).property("num_fractional_input_digits", codecForNumber()).property("num_fractional_normal_digits", codecForNumber()).property("num_fractional_trailing_zero_digits", codecForNumber()).property("alt_unit_names", codecForMap(codecForString())).build("CurrencySpecification"); var codecForCoreBankConfig = () => buildCodecForObject().property("name", codecForConstString("libeufin-bank")).property("version", codecForString()).property("bank_name", codecForString()).property("allow_conversion", codecForBoolean()).property("allow_registrations", codecForBoolean()).property("allow_deletions", codecForBoolean()).property("allow_edit_name", codecForBoolean()).property("allow_edit_cashout_payto_uri", codecForBoolean()).property("default_debit_threshold", codecForAmountString()).property("currency", codecForString()).property("currency_specification", codecForCurrencySpecificiation()).property("supported_tan_channels", codecForList(codecForEither(codecForConstString(TalerCorebankApi.TanChannel.SMS), codecForConstString(TalerCorebankApi.TanChannel.EMAIL)))).property("wire_type", codecForString()).build("TalerCorebankApi.Config"); var codecForBalance = () => buildCodecForObject().property("amount", codecForAmountString()).property("credit_debit_indicator", codecForEither(codecForConstString("credit"), codecForConstString("debit"))).build("TalerCorebankApi.Balance"); @@ -11997,68 +12259,68 @@ var TalerMerchantApi; // ../taler-util/lib/http-status-codes.js var HttpStatusCode; -(function(HttpStatusCode2) { - HttpStatusCode2[HttpStatusCode2["Continue"] = 100] = "Continue"; - HttpStatusCode2[HttpStatusCode2["SwitchingProtocols"] = 101] = "SwitchingProtocols"; - HttpStatusCode2[HttpStatusCode2["Processing"] = 102] = "Processing"; - HttpStatusCode2[HttpStatusCode2["Ok"] = 200] = "Ok"; - HttpStatusCode2[HttpStatusCode2["Created"] = 201] = "Created"; - HttpStatusCode2[HttpStatusCode2["Accepted"] = 202] = "Accepted"; - HttpStatusCode2[HttpStatusCode2["NonAuthoritativeInformation"] = 203] = "NonAuthoritativeInformation"; - HttpStatusCode2[HttpStatusCode2["NoContent"] = 204] = "NoContent"; - HttpStatusCode2[HttpStatusCode2["ResetContent"] = 205] = "ResetContent"; - HttpStatusCode2[HttpStatusCode2["PartialContent"] = 206] = "PartialContent"; - HttpStatusCode2[HttpStatusCode2["MultiStatus"] = 207] = "MultiStatus"; - HttpStatusCode2[HttpStatusCode2["AlreadyReported"] = 208] = "AlreadyReported"; - HttpStatusCode2[HttpStatusCode2["ImUsed"] = 226] = "ImUsed"; - HttpStatusCode2[HttpStatusCode2["MultipleChoices"] = 300] = "MultipleChoices"; - HttpStatusCode2[HttpStatusCode2["MovedPermanently"] = 301] = "MovedPermanently"; - HttpStatusCode2[HttpStatusCode2["Found"] = 302] = "Found"; - HttpStatusCode2[HttpStatusCode2["SeeOther"] = 303] = "SeeOther"; - HttpStatusCode2[HttpStatusCode2["NotModified"] = 304] = "NotModified"; - HttpStatusCode2[HttpStatusCode2["UseProxy"] = 305] = "UseProxy"; - HttpStatusCode2[HttpStatusCode2["SwitchProxy"] = 306] = "SwitchProxy"; - HttpStatusCode2[HttpStatusCode2["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpStatusCode2[HttpStatusCode2["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpStatusCode2[HttpStatusCode2["BadRequest"] = 400] = "BadRequest"; - HttpStatusCode2[HttpStatusCode2["Unauthorized"] = 401] = "Unauthorized"; - HttpStatusCode2[HttpStatusCode2["PaymentRequired"] = 402] = "PaymentRequired"; - HttpStatusCode2[HttpStatusCode2["Forbidden"] = 403] = "Forbidden"; - HttpStatusCode2[HttpStatusCode2["NotFound"] = 404] = "NotFound"; - HttpStatusCode2[HttpStatusCode2["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpStatusCode2[HttpStatusCode2["NotAcceptable"] = 406] = "NotAcceptable"; - HttpStatusCode2[HttpStatusCode2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpStatusCode2[HttpStatusCode2["RequestTimeout"] = 408] = "RequestTimeout"; - HttpStatusCode2[HttpStatusCode2["Conflict"] = 409] = "Conflict"; - HttpStatusCode2[HttpStatusCode2["Gone"] = 410] = "Gone"; - HttpStatusCode2[HttpStatusCode2["LengthRequired"] = 411] = "LengthRequired"; - HttpStatusCode2[HttpStatusCode2["PreconditionFailed"] = 412] = "PreconditionFailed"; - HttpStatusCode2[HttpStatusCode2["PayloadTooLarge"] = 413] = "PayloadTooLarge"; - HttpStatusCode2[HttpStatusCode2["UriTooLong"] = 414] = "UriTooLong"; - HttpStatusCode2[HttpStatusCode2["UnsupportedMediaType"] = 415] = "UnsupportedMediaType"; - HttpStatusCode2[HttpStatusCode2["RangeNotSatisfiable"] = 416] = "RangeNotSatisfiable"; - HttpStatusCode2[HttpStatusCode2["ExpectationFailed"] = 417] = "ExpectationFailed"; - HttpStatusCode2[HttpStatusCode2["IAmATeapot"] = 418] = "IAmATeapot"; - HttpStatusCode2[HttpStatusCode2["MisdirectedRequest"] = 421] = "MisdirectedRequest"; - HttpStatusCode2[HttpStatusCode2["UnprocessableEntity"] = 422] = "UnprocessableEntity"; - HttpStatusCode2[HttpStatusCode2["Locked"] = 423] = "Locked"; - HttpStatusCode2[HttpStatusCode2["FailedDependency"] = 424] = "FailedDependency"; - HttpStatusCode2[HttpStatusCode2["UpgradeRequired"] = 426] = "UpgradeRequired"; - HttpStatusCode2[HttpStatusCode2["PreconditionRequired"] = 428] = "PreconditionRequired"; - HttpStatusCode2[HttpStatusCode2["TooManyRequests"] = 429] = "TooManyRequests"; - HttpStatusCode2[HttpStatusCode2["RequestHeaderFieldsTooLarge"] = 431] = "RequestHeaderFieldsTooLarge"; - HttpStatusCode2[HttpStatusCode2["UnavailableForLegalReasons"] = 451] = "UnavailableForLegalReasons"; - HttpStatusCode2[HttpStatusCode2["InternalServerError"] = 500] = "InternalServerError"; - HttpStatusCode2[HttpStatusCode2["NotImplemented"] = 501] = "NotImplemented"; - HttpStatusCode2[HttpStatusCode2["BadGateway"] = 502] = "BadGateway"; - HttpStatusCode2[HttpStatusCode2["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpStatusCode2[HttpStatusCode2["GatewayTimeout"] = 504] = "GatewayTimeout"; - HttpStatusCode2[HttpStatusCode2["HttpVersionNotSupported"] = 505] = "HttpVersionNotSupported"; - HttpStatusCode2[HttpStatusCode2["VariantAlsoNegotiates"] = 506] = "VariantAlsoNegotiates"; - HttpStatusCode2[HttpStatusCode2["InsufficientStorage"] = 507] = "InsufficientStorage"; - HttpStatusCode2[HttpStatusCode2["LoopDetected"] = 508] = "LoopDetected"; - HttpStatusCode2[HttpStatusCode2["NotExtended"] = 510] = "NotExtended"; - HttpStatusCode2[HttpStatusCode2["NetworkAuthenticationRequired"] = 511] = "NetworkAuthenticationRequired"; +(function(HttpStatusCode3) { + HttpStatusCode3[HttpStatusCode3["Continue"] = 100] = "Continue"; + HttpStatusCode3[HttpStatusCode3["SwitchingProtocols"] = 101] = "SwitchingProtocols"; + HttpStatusCode3[HttpStatusCode3["Processing"] = 102] = "Processing"; + HttpStatusCode3[HttpStatusCode3["Ok"] = 200] = "Ok"; + HttpStatusCode3[HttpStatusCode3["Created"] = 201] = "Created"; + HttpStatusCode3[HttpStatusCode3["Accepted"] = 202] = "Accepted"; + HttpStatusCode3[HttpStatusCode3["NonAuthoritativeInformation"] = 203] = "NonAuthoritativeInformation"; + HttpStatusCode3[HttpStatusCode3["NoContent"] = 204] = "NoContent"; + HttpStatusCode3[HttpStatusCode3["ResetContent"] = 205] = "ResetContent"; + HttpStatusCode3[HttpStatusCode3["PartialContent"] = 206] = "PartialContent"; + HttpStatusCode3[HttpStatusCode3["MultiStatus"] = 207] = "MultiStatus"; + HttpStatusCode3[HttpStatusCode3["AlreadyReported"] = 208] = "AlreadyReported"; + HttpStatusCode3[HttpStatusCode3["ImUsed"] = 226] = "ImUsed"; + HttpStatusCode3[HttpStatusCode3["MultipleChoices"] = 300] = "MultipleChoices"; + HttpStatusCode3[HttpStatusCode3["MovedPermanently"] = 301] = "MovedPermanently"; + HttpStatusCode3[HttpStatusCode3["Found"] = 302] = "Found"; + HttpStatusCode3[HttpStatusCode3["SeeOther"] = 303] = "SeeOther"; + HttpStatusCode3[HttpStatusCode3["NotModified"] = 304] = "NotModified"; + HttpStatusCode3[HttpStatusCode3["UseProxy"] = 305] = "UseProxy"; + HttpStatusCode3[HttpStatusCode3["SwitchProxy"] = 306] = "SwitchProxy"; + HttpStatusCode3[HttpStatusCode3["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpStatusCode3[HttpStatusCode3["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpStatusCode3[HttpStatusCode3["BadRequest"] = 400] = "BadRequest"; + HttpStatusCode3[HttpStatusCode3["Unauthorized"] = 401] = "Unauthorized"; + HttpStatusCode3[HttpStatusCode3["PaymentRequired"] = 402] = "PaymentRequired"; + HttpStatusCode3[HttpStatusCode3["Forbidden"] = 403] = "Forbidden"; + HttpStatusCode3[HttpStatusCode3["NotFound"] = 404] = "NotFound"; + HttpStatusCode3[HttpStatusCode3["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpStatusCode3[HttpStatusCode3["NotAcceptable"] = 406] = "NotAcceptable"; + HttpStatusCode3[HttpStatusCode3["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpStatusCode3[HttpStatusCode3["RequestTimeout"] = 408] = "RequestTimeout"; + HttpStatusCode3[HttpStatusCode3["Conflict"] = 409] = "Conflict"; + HttpStatusCode3[HttpStatusCode3["Gone"] = 410] = "Gone"; + HttpStatusCode3[HttpStatusCode3["LengthRequired"] = 411] = "LengthRequired"; + HttpStatusCode3[HttpStatusCode3["PreconditionFailed"] = 412] = "PreconditionFailed"; + HttpStatusCode3[HttpStatusCode3["PayloadTooLarge"] = 413] = "PayloadTooLarge"; + HttpStatusCode3[HttpStatusCode3["UriTooLong"] = 414] = "UriTooLong"; + HttpStatusCode3[HttpStatusCode3["UnsupportedMediaType"] = 415] = "UnsupportedMediaType"; + HttpStatusCode3[HttpStatusCode3["RangeNotSatisfiable"] = 416] = "RangeNotSatisfiable"; + HttpStatusCode3[HttpStatusCode3["ExpectationFailed"] = 417] = "ExpectationFailed"; + HttpStatusCode3[HttpStatusCode3["IAmATeapot"] = 418] = "IAmATeapot"; + HttpStatusCode3[HttpStatusCode3["MisdirectedRequest"] = 421] = "MisdirectedRequest"; + HttpStatusCode3[HttpStatusCode3["UnprocessableEntity"] = 422] = "UnprocessableEntity"; + HttpStatusCode3[HttpStatusCode3["Locked"] = 423] = "Locked"; + HttpStatusCode3[HttpStatusCode3["FailedDependency"] = 424] = "FailedDependency"; + HttpStatusCode3[HttpStatusCode3["UpgradeRequired"] = 426] = "UpgradeRequired"; + HttpStatusCode3[HttpStatusCode3["PreconditionRequired"] = 428] = "PreconditionRequired"; + HttpStatusCode3[HttpStatusCode3["TooManyRequests"] = 429] = "TooManyRequests"; + HttpStatusCode3[HttpStatusCode3["RequestHeaderFieldsTooLarge"] = 431] = "RequestHeaderFieldsTooLarge"; + HttpStatusCode3[HttpStatusCode3["UnavailableForLegalReasons"] = 451] = "UnavailableForLegalReasons"; + HttpStatusCode3[HttpStatusCode3["InternalServerError"] = 500] = "InternalServerError"; + HttpStatusCode3[HttpStatusCode3["NotImplemented"] = 501] = "NotImplemented"; + HttpStatusCode3[HttpStatusCode3["BadGateway"] = 502] = "BadGateway"; + HttpStatusCode3[HttpStatusCode3["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpStatusCode3[HttpStatusCode3["GatewayTimeout"] = 504] = "GatewayTimeout"; + HttpStatusCode3[HttpStatusCode3["HttpVersionNotSupported"] = 505] = "HttpVersionNotSupported"; + HttpStatusCode3[HttpStatusCode3["VariantAlsoNegotiates"] = 506] = "VariantAlsoNegotiates"; + HttpStatusCode3[HttpStatusCode3["InsufficientStorage"] = 507] = "InsufficientStorage"; + HttpStatusCode3[HttpStatusCode3["LoopDetected"] = 508] = "LoopDetected"; + HttpStatusCode3[HttpStatusCode3["NotExtended"] = 510] = "NotExtended"; + HttpStatusCode3[HttpStatusCode3["NetworkAuthenticationRequired"] = 511] = "NetworkAuthenticationRequired"; })(HttpStatusCode || (HttpStatusCode = {})); // ../taler-util/lib/http-impl.missing.js @@ -12068,146 +12330,6 @@ var HttpLibImpl = class { } }; -// ../taler-util/lib/http-common.js -var textEncoder = new TextEncoder(); -var logger3 = new Logger("http.ts"); -var DEFAULT_REQUEST_TIMEOUT_MS = 6e4; -var Headers2 = class { - constructor() { - this.headerMap = /* @__PURE__ */ new Map(); - } - get(name) { - const r3 = this.headerMap.get(name.toLowerCase()); - if (r3) { - return r3; - } - return null; - } - set(name, value) { - const normalizedName = name.toLowerCase(); - const existing = this.headerMap.get(normalizedName); - if (existing !== void 0) { - this.headerMap.set(normalizedName, existing + "," + value); - } else { - this.headerMap.set(normalizedName, value); - } - } - toJSON() { - const m5 = {}; - this.headerMap.forEach((v3, k5) => m5[k5] = v3); - return m5; - } -}; -async function readTalerErrorResponse(httpResponse) { - const contentType = httpResponse.headers.get("content-type"); - if (contentType !== "application/json") { - throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { - requestUrl: httpResponse.requestUrl, - requestMethod: httpResponse.requestMethod, - httpStatusCode: httpResponse.status, - contentType: contentType || "<null>" - }, "Error response did not even contain JSON. The request URL might be wrong or the service might be unavailable."); - } - let errJson; - try { - errJson = await httpResponse.json(); - } catch (e4) { - throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { - requestUrl: httpResponse.requestUrl, - requestMethod: httpResponse.requestMethod, - httpStatusCode: httpResponse.status, - validationError: e4.toString() - }, "Couldn't parse JSON format from error response"); - } - const talerErrorCode = errJson.code; - if (typeof talerErrorCode !== "number") { - logger3.warn(`malformed error response (status ${httpResponse.status}): ${j2s(errJson)}`); - throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { - requestUrl: httpResponse.requestUrl, - requestMethod: httpResponse.requestMethod, - httpStatusCode: httpResponse.status - }, "Error response did not contain error code"); - } - return errJson; -} -async function readSuccessResponseJsonOrErrorCode(httpResponse, codec) { - if (!(httpResponse.status >= 200 && httpResponse.status < 300)) { - return { - isError: true, - talerErrorResponse: await readTalerErrorResponse(httpResponse) - }; - } - let respJson; - try { - respJson = await httpResponse.json(); - } catch (e4) { - throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { - requestUrl: httpResponse.requestUrl, - requestMethod: httpResponse.requestMethod, - httpStatusCode: httpResponse.status, - validationError: e4.toString() - }, "Couldn't parse JSON format from response"); - } - let parsedResponse; - try { - parsedResponse = codec.decode(respJson); - } catch (e4) { - throw TalerError.fromDetail(TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, { - requestUrl: httpResponse.requestUrl, - requestMethod: httpResponse.requestMethod, - httpStatusCode: httpResponse.status, - validationError: e4.toString() - }, "Response invalid"); - } - return { - isError: false, - response: parsedResponse - }; -} -function throwUnexpectedRequestError(httpResponse, talerErrorResponse) { - throw TalerError.fromDetail(TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR, { - requestUrl: httpResponse.requestUrl, - requestMethod: httpResponse.requestMethod, - httpStatusCode: httpResponse.status, - errorResponse: talerErrorResponse - }, `Unexpected HTTP status ${httpResponse.status} in response`); -} -async function readSuccessResponseJsonOrThrow(httpResponse, codec) { - const r3 = await readSuccessResponseJsonOrErrorCode(httpResponse, codec); - if (!r3.isError) { - return r3.response; - } - throwUnexpectedRequestError(httpResponse, r3.talerErrorResponse); -} -function encodeBody(body) { - if (body == null) { - return new ArrayBuffer(0); - } - if (typeof body === "string") { - return textEncoder.encode(body).buffer; - } else if (ArrayBuffer.isView(body)) { - return body.buffer; - } else if (body instanceof ArrayBuffer) { - return body; - } else if (typeof body === "object") { - return textEncoder.encode(JSON.stringify(body)).buffer; - } - throw new TypeError("unsupported request body type"); -} -function getDefaultHeaders(method) { - const headers = {}; - if (method === "POST" || method === "PUT" || method === "PATCH") { - headers["Content-Type"] = "application/json"; - } - headers["Accept"] = "application/json"; - return headers; -} -function makeBasicAuthHeader(username, password) { - const auth = `${username}:${password}`; - const authEncoded = base64FromArrayBuffer(stringToBytes(auth)); - return `Basic ${authEncoded}`; -} - // ../taler-util/lib/http.js function createPlatformHttpLib(args) { return new HttpLibImpl(args); @@ -12249,38 +12371,6 @@ var LibtoolVersion; LibtoolVersion2.parseVersion = parseVersion; })(LibtoolVersion || (LibtoolVersion = {})); -// ../taler-util/lib/operation.js -async function opSuccessFromHttp(resp, codec) { - const body = await readSuccessResponseJsonOrThrow(resp, codec); - return { type: "ok", body }; -} -function opFixedSuccess(body) { - return { type: "ok", body }; -} -function opEmptySuccess(resp) { - return { type: "ok", body: void 0 }; -} -async function opKnownAlternativeFailure(resp, s5, codec) { - const body = await readSuccessResponseJsonOrThrow(resp, codec); - return { type: "fail", case: s5, body }; -} -async function opKnownHttpFailure(s5, resp) { - const detail = await readTalerErrorResponse(resp); - return { type: "fail", case: s5, detail }; -} -async function opKnownTalerFailure(s5, resp) { - const detail = await readTalerErrorResponse(resp); - return { type: "fail", case: s5, detail }; -} -function opUnknownFailure(resp, text) { - throw TalerError.fromDetail(TalerErrorCode.WALLET_UNEXPECTED_REQUEST_ERROR, { - requestUrl: resp.requestUrl, - requestMethod: resp.requestMethod, - httpStatusCode: resp.status, - errorResponse: text - }, `Unexpected HTTP status ${resp.status} in response`); -} - // ../taler-util/lib/MerchantApiClient.js var logger4 = new Logger("MerchantApiClient.ts"); @@ -12646,6 +12736,10 @@ function getErrorDetailFromException(e4) { if (e4 instanceof TalerError) { return e4.errorDetail; } + if (e4 instanceof CancellationToken.CancellationError) { + const err2 = makeErrorDetail(TalerErrorCode.WALLET_CORE_REQUEST_CANCELLED, {}); + return err2; + } if (e4 instanceof Error) { const err2 = makeErrorDetail(TalerErrorCode.WALLET_UNEXPECTED_EXCEPTION, { stack: e4.stack @@ -12764,12 +12858,19 @@ var TransactionType; TransactionType2["PeerPullDebit"] = "peer-pull-debit"; TransactionType2["PeerPullCredit"] = "peer-pull-credit"; TransactionType2["Recoup"] = "recoup"; + TransactionType2["DenomLoss"] = "denom-loss"; })(TransactionType || (TransactionType = {})); var WithdrawalType; (function(WithdrawalType2) { WithdrawalType2["TalerBankIntegrationApi"] = "taler-bank-integration-api"; WithdrawalType2["ManualTransfer"] = "manual-transfer"; })(WithdrawalType || (WithdrawalType = {})); +var DenomLossEventType; +(function(DenomLossEventType2) { + DenomLossEventType2["DenomExpired"] = "denom-expired"; + DenomLossEventType2["DenomVanished"] = "denom-vanished"; + DenomLossEventType2["DenomUnoffered"] = "denom-unoffered"; +})(DenomLossEventType || (DenomLossEventType = {})); var PaymentStatus; (function(PaymentStatus2) { PaymentStatus2["Aborted"] = "aborted"; @@ -12810,6 +12911,7 @@ var ScopeType; var CoinStatus; (function(CoinStatus2) { CoinStatus2["Fresh"] = "fresh"; + CoinStatus2["DenomLoss"] = "denom-loss"; CoinStatus2["FreshSuspended"] = "fresh-suspended"; CoinStatus2["Dormant"] = "dormant"; })(CoinStatus || (CoinStatus = {})); @@ -12971,7 +13073,7 @@ var TalerBankConversionHttpClient = class { case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13011,7 +13113,7 @@ var TalerBankConversionHttpClient = class { case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13051,7 +13153,7 @@ var TalerBankConversionHttpClient = class { case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13077,16 +13179,15 @@ var TalerBankConversionHttpClient = class { case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } }; // ../taler-util/lib/http-client/authentication.js var TalerAuthenticationHttpClient = class { - constructor(baseUrl, username, httpClient) { + constructor(baseUrl, httpClient) { this.baseUrl = baseUrl; - this.username = username; this.PROTOCOL_VERSION = "0:0:0"; this.httpLib = httpClient ?? createPlatformHttpLib(); } @@ -13099,12 +13200,12 @@ var TalerAuthenticationHttpClient = class { * * @returns */ - async createAccessToken(password, body) { + async createAccessTokenBasic(username, password, body) { const url = new URL(`token`, this.baseUrl); const resp = await this.httpLib.fetch(url.href, { method: "POST", headers: { - Authorization: makeBasicAuthHeader(this.username, password) + Authorization: makeBasicAuthHeader(username, password) }, body }); @@ -13116,7 +13217,31 @@ var TalerAuthenticationHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); + } + } + /** + * + * @returns + */ + async createAccessTokenBearer(token, body) { + const url = new URL(`token`, this.baseUrl); + const resp = await this.httpLib.fetch(url.href, { + method: "POST", + headers: { + Authorization: makeBearerTokenAuthHeader(token) + }, + body + }); + switch (resp.status) { + case HttpStatusCode.Ok: + return opSuccessFromHttp(resp, codecForTokenSuccessResponseMerchant()); + case HttpStatusCode.Unauthorized: + return opKnownHttpFailure(resp.status, resp); + case HttpStatusCode.NotFound: + return opKnownHttpFailure(resp.status, resp); + default: + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } async deleteAccessToken(token) { @@ -13133,7 +13258,7 @@ var TalerAuthenticationHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } }; @@ -13174,8 +13299,10 @@ var TalerCoreBankHttpClient = class { switch (resp.status) { case HttpStatusCode.Ok: return opSuccessFromHttp(resp, codecForCoreBankConfig()); + case HttpStatusCode.NotFound: + return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } // @@ -13187,12 +13314,14 @@ var TalerCoreBankHttpClient = class { */ async createAccount(auth, body) { const url = new URL(`accounts`, this.baseUrl); + const headers = {}; + if (auth) { + headers.Authorization = makeBearerTokenAuthHeader(auth); + } const resp = await this.httpLib.fetch(url.href, { method: "POST", body, - headers: { - Authorization: makeBearerTokenAuthHeader(auth) - } + headers }); switch (resp.status) { case HttpStatusCode.Ok: { @@ -13204,31 +13333,30 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { - const body2 = await resp.json(); - const details = codecForTalerErrorDetail().decode(body2); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_REGISTER_USERNAME_REUSE: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_REGISTER_PAYTO_URI_REUSE: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_RESERVED_USERNAME_CONFLICT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_NON_ADMIN_PATCH_DEBT_LIMIT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_NON_ADMIN_SET_TAN_CHANNEL: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_TAN_CHANNEL_NOT_SUPPORTED: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_MISSING_TAN_INFO: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body2); + return opUnknownFailure(resp, details); } } default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13254,19 +13382,18 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { - const body = await resp.json(); - const details = codecForTalerErrorDetail().decode(body); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_RESERVED_USERNAME_CONFLICT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_ACCOUNT_BALANCE_NOT_ZERO: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body); + return opUnknownFailure(resp, details); } } default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13293,25 +13420,24 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { - const body2 = await resp.json(); - const details = codecForTalerErrorDetail().decode(body2); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_NON_ADMIN_PATCH_LEGAL_NAME: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_NON_ADMIN_PATCH_CASHOUT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_NON_ADMIN_PATCH_DEBT_LIMIT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_TAN_CHANNEL_NOT_SUPPORTED: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_MISSING_TAN_INFO: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body2); + return opUnknownFailure(resp, details); } } default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13338,19 +13464,18 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { - const body2 = await resp.json(); - const details = codecForTalerErrorDetail().decode(body2); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_NON_ADMIN_PATCH_MISSING_OLD_PASSWORD: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_PATCH_BAD_OLD_PASSWORD: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body2); + return opUnknownFailure(resp, details); } } default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13374,7 +13499,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opFixedSuccess({ public_accounts: [] }); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13401,7 +13526,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13424,7 +13549,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } // @@ -13454,7 +13579,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13477,7 +13602,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13506,23 +13631,22 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { - const body2 = await resp.json(); - const details = codecForTalerErrorDetail().decode(body2); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_ADMIN_CREDITOR: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_SAME_ACCOUNT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_UNKNOWN_CREDITOR: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body2); + return opUnknownFailure(resp, details); } } default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } // @@ -13551,7 +13675,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13577,21 +13701,20 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { - const body = await resp.json(); - const details = codecForTalerErrorDetail().decode(body); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_CONFIRM_ABORT_CONFLICT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_CONFIRM_INCOMPLETE: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body); + return opUnknownFailure(resp, details); } } default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13616,7 +13739,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.Conflict: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13640,7 +13763,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } // @@ -13668,35 +13791,33 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { - const body2 = await resp.json(); - const details = codecForTalerErrorDetail().decode(body2); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TRANSFER_REQUEST_UID_REUSED: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_BAD_CONVERSION: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_UNALLOWED_DEBIT: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_CONFIRM_INCOMPLETE: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body2); + return opUnknownFailure(resp, details); } } case HttpStatusCode.BadGateway: { - const body2 = await resp.json(); - const details = codecForTalerErrorDetail().decode(body2); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TAN_CHANNEL_SCRIPT_FAILED: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body2); + return opUnknownFailure(resp, details); } } case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13719,7 +13840,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13743,7 +13864,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13767,7 +13888,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotImplemented: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } // @@ -13793,17 +13914,16 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.BadGateway: { - const body = await resp.json(); - const details = codecForTalerErrorDetail().decode(body); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TAN_CHANNEL_SCRIPT_FAILED: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body); + return opUnknownFailure(resp, details); } } default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } /** @@ -13827,21 +13947,20 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.NotFound: return opKnownHttpFailure(resp.status, resp); case HttpStatusCode.Conflict: { - const body2 = await resp.json(); - const details = codecForTalerErrorDetail().decode(body2); + const details = await readTalerErrorResponse(resp); switch (details.code) { case TalerErrorCode.BANK_TAN_CHALLENGE_EXPIRED: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); case TalerErrorCode.BANK_TAN_CHALLENGE_FAILED: - return opKnownTalerFailure(details.code, resp); + return opKnownTalerFailure(details.code, details); default: - return opUnknownFailure(resp, body2); + return opUnknownFailure(resp, details); } } case HttpStatusCode.TooManyRequests: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } // @@ -13856,8 +13975,11 @@ var TalerCoreBankHttpClient = class { if (params.timeframe) { url.searchParams.set("timeframe", TalerCorebankApi.MonitorTimeframeParam[params.timeframe]); } - if (params.which) { - url.searchParams.set("which", String(params.which)); + if (params.date) { + const { t_s: seconds } = AbsoluteTime.toProtocolTimestamp(params.date); + if (seconds !== "never") { + url.searchParams.set("date_s", String(seconds)); + } } const resp = await this.httpLib.fetch(url.href, { method: "GET", @@ -13873,7 +13995,7 @@ var TalerCoreBankHttpClient = class { case HttpStatusCode.Unauthorized: return opKnownHttpFailure(resp.status, resp); default: - return opUnknownFailure(resp, await resp.text()); + return opUnknownFailure(resp, await readTalerErrorResponse(resp)); } } // @@ -13920,10 +14042,37 @@ var TalerCoreBankHttpClient = class { var TalerMerchantInstanceCacheEviction; (function(TalerMerchantInstanceCacheEviction2) { TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["CREATE_ORDER"] = 0] = "CREATE_ORDER"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["UPDATE_ORDER"] = 1] = "UPDATE_ORDER"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_ORDER"] = 2] = "DELETE_ORDER"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["UPDATE_CURRENT_INSTANCE"] = 3] = "UPDATE_CURRENT_INSTANCE"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_CURRENT_INSTANCE"] = 4] = "DELETE_CURRENT_INSTANCE"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["CREATE_BANK_ACCOUNT"] = 5] = "CREATE_BANK_ACCOUNT"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["UPDATE_BANK_ACCOUNT"] = 6] = "UPDATE_BANK_ACCOUNT"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_BANK_ACCOUNT"] = 7] = "DELETE_BANK_ACCOUNT"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["CREATE_PRODUCT"] = 8] = "CREATE_PRODUCT"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["UPDATE_PRODUCT"] = 9] = "UPDATE_PRODUCT"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_PRODUCT"] = 10] = "DELETE_PRODUCT"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["CREATE_TRANSFER"] = 11] = "CREATE_TRANSFER"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_TRANSFER"] = 12] = "DELETE_TRANSFER"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["CREATE_DEVICE"] = 13] = "CREATE_DEVICE"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["UPDATE_DEVICE"] = 14] = "UPDATE_DEVICE"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_DEVICE"] = 15] = "DELETE_DEVICE"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["CREATE_TEMPLATE"] = 16] = "CREATE_TEMPLATE"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["UPDATE_TEMPLATE"] = 17] = "UPDATE_TEMPLATE"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_TEMPLATE"] = 18] = "DELETE_TEMPLATE"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["CREATE_WEBHOOK"] = 19] = "CREATE_WEBHOOK"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["UPDATE_WEBHOOK"] = 20] = "UPDATE_WEBHOOK"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_WEBHOOK"] = 21] = "DELETE_WEBHOOK"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["CREATE_TOKENFAMILY"] = 22] = "CREATE_TOKENFAMILY"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["UPDATE_TOKENFAMILY"] = 23] = "UPDATE_TOKENFAMILY"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["DELETE_TOKENFAMILY"] = 24] = "DELETE_TOKENFAMILY"; + TalerMerchantInstanceCacheEviction2[TalerMerchantInstanceCacheEviction2["LAST"] = 25] = "LAST"; })(TalerMerchantInstanceCacheEviction || (TalerMerchantInstanceCacheEviction = {})); var TalerMerchantManagementCacheEviction; (function(TalerMerchantManagementCacheEviction2) { - TalerMerchantManagementCacheEviction2[TalerMerchantManagementCacheEviction2["CREATE_INSTANCE"] = 0] = "CREATE_INSTANCE"; + TalerMerchantManagementCacheEviction2[TalerMerchantManagementCacheEviction2["CREATE_INSTANCE"] = 26] = "CREATE_INSTANCE"; + TalerMerchantManagementCacheEviction2[TalerMerchantManagementCacheEviction2["UPDATE_INSTANCE"] = 27] = "UPDATE_INSTANCE"; + TalerMerchantManagementCacheEviction2[TalerMerchantManagementCacheEviction2["DELETE_INSTANCE"] = 28] = "DELETE_INSTANCE"; })(TalerMerchantManagementCacheEviction || (TalerMerchantManagementCacheEviction = {})); // ../taler-util/lib/i18n.js @@ -14048,6 +14197,7 @@ var ObservabilityEventType; ObservabilityEventType2["CryptoStart"] = "crypto-start"; ObservabilityEventType2["CryptoFinishSuccess"] = "crypto-finish-success"; ObservabilityEventType2["CryptoFinishError"] = "crypto-finish-error"; + ObservabilityEventType2["Message"] = "message"; })(ObservabilityEventType || (ObservabilityEventType = {})); // ../taler-util/lib/observability.js @@ -14972,7 +15122,7 @@ function strToUTF8Arr(sDOMStr) { async function defaultRequestHandler(baseUrl, endpoint, options = {}) { const requestHeaders = {}; if (options.token) { - requestHeaders.Authorization = `Bearer ${options.token}`; + requestHeaders.Authorization = `Bearer secret-token:${options.token}`; } else if (options.basicAuth) { requestHeaders.Authorization = `Basic ${base64encode( `${options.basicAuth.username}:${options.basicAuth.password}` @@ -22521,6 +22671,8 @@ var useTranslationContext = () => q2(Context2); var ActiviyTracker = class { constructor() { this.observers = new Array(); + this.notify = this.notify.bind(this); + this.subscribe = this.subscribe.bind(this); } notify(data) { this.observers.forEach((observer) => observer(data)); @@ -22538,6 +22690,7 @@ var ActiviyTracker = class { }; var BankContext = B(void 0); var useBankCoreApiContext = () => q2(BankContext); +var CONFIG_FAIL_TRY_AGAIN_MS = 5e3; var BankApiProvider = ({ baseUrl, children, @@ -22548,24 +22701,41 @@ var BankApiProvider = ({ const { i18n: i18n2 } = useTranslationContext(); const { getRemoteConfig, VERSION: VERSION2, lib, cancelRequest, onActivity } = buildBankApiClient(baseUrl, evictors); h2(() => { - getRemoteConfig().then((config) => { - if (LibtoolVersion.compare(VERSION2, config.version)) { - setChecked({ type: "ok", config, hints: [] }); - } else { - setChecked({ - type: "incompatible", - result: config, - supported: VERSION2 - }); - } - }).catch((error2) => { - if (error2 instanceof TalerError) { - setChecked({ type: "error", error: error2 }); + let keepRetrying = true; + async function testConfig() { + try { + const config = await getRemoteConfig(); + if (LibtoolVersion.compare(VERSION2, config.version)) { + setChecked({ type: "ok", config, hints: [] }); + } else { + setChecked({ + type: "incompatible", + result: config, + supported: VERSION2 + }); + } + } catch (error2) { + if (error2 instanceof TalerError) { + if (keepRetrying) { + setTimeout(() => { + testConfig(); + }, CONFIG_FAIL_TRY_AGAIN_MS); + } + setChecked({ type: "error", error: error2 }); + } else { + setChecked({ type: "error", error: TalerError.fromException(error2) }); + } } - }); + } + testConfig(); + return () => { + keepRetrying = false; + }; }, []); if (checked === void 0) { - return h(frameOnError, { children: h("div", {}, "checking compatibility with server...") }); + return h(frameOnError, { + children: h("div", {}, "checking compatibility with server...") + }); } if (checked.type === "error") { return h(frameOnError, { @@ -22605,11 +22775,7 @@ function buildBankApiClient(url, evictors) { tracker.notify(ev); } }); - const bank = new TalerCoreBankHttpClient( - url.href, - httpLib, - evictors.bank - ); + const bank = new TalerCoreBankHttpClient(url.href, httpLib, evictors.bank); const conversion = new TalerBankConversionHttpClient( bank.getConversionInfoAPI().href, httpLib, @@ -22617,11 +22783,13 @@ function buildBankApiClient(url, evictors) { ); const auth = (user) => new TalerAuthenticationHttpClient( bank.getAuthenticationAPI(user).href, - user, httpLib ); async function getRemoteConfig() { const resp = await bank.getConfig(); + if (resp.type === "fail") { + throw TalerError.fromUncheckedDetail(resp.detail); + } return resp.body; } return { @@ -24090,7 +24258,10 @@ var codecForSessionState = () => buildCodecForUnion().discriminateOn("status").a var defaultState = { status: "loggedOut" }; -var SESSION_STATE_KEY = buildStorageKey("bank-session", codecForSessionState()); +var SESSION_STATE_KEY = buildStorageKey( + "bank-session", + codecForSessionState() +); function useSessionState() { const { value: state, update } = useLocalStorage( SESSION_STATE_KEY, @@ -24196,7 +24367,8 @@ function undefinedIfEmpty(obj) { (k5) => obj[k5] !== void 0 ) ? obj : void 0; } -var PAGE_SIZE = 5; +var PAGINATED_LIST_SIZE = 5; +var PAGINATED_LIST_REQUEST = PAGINATED_LIST_SIZE + 1; var COUNTRY_TABLE = { AE: "U.A.E.", AF: "Afghanistan", @@ -24435,7 +24607,11 @@ function PaytoWireTransferForm({ const [inputType, setInputType] = p3("form"); const isRawPayto = inputType !== "form"; const { state: credentials } = useSessionState(); - const { lib: { bank: api }, config, url } = useBankCoreApiContext(); + const { + lib: { bank: api }, + config, + url + } = useBankCoreApiContext(); const sendingToFixedAccount = withAccount !== void 0; const [account, setAccount] = p3(withAccount); const [subject, setSubject] = p3(withSubject); @@ -28016,7 +28192,9 @@ function RegistrationForm({ const [repeatPassword, setRepeatPassword] = p3(); const [notification, , handleError] = useLocalNotification(); const settings = useSettingsContext(); - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const { i18n: i18n2 } = useTranslationContext(); const errors2 = undefinedIfEmpty({ name: !name ? i18n2.str`Missing name` : void 0, @@ -28036,7 +28214,7 @@ function RegistrationForm({ }); async function doRegistrationAndLogin(name2, username2, password2, onComplete) { await handleError(async (onError) => { - const resp = await api.createAccount("", { + const resp = await api.createAccount(void 0, { name: name2, username: username2, password: password2 @@ -28276,7 +28454,9 @@ function LoginForm({ ); const [password, setPassword] = p3(); const { i18n: i18n2 } = useTranslationContext(); - const { lib: { auth: authenticator } } = useBankCoreApiContext(); + const { + lib: { auth: authenticator } + } = useBankCoreApiContext(); const [notification, withErrorHandler] = useLocalNotificationHandler(); const { config } = useBankCoreApiContext(); const ref = _2(null); @@ -28291,8 +28471,7 @@ function LoginForm({ session.logOut(); } const loginHandler = !username || !password ? void 0 : withErrorHandler( - async () => authenticator(username).createAccessToken(password, { - // scope: "readwrite" as "write", // FIX: different than merchant + async () => authenticator(username).createAccessTokenBasic(username, password, { scope: "readwrite", duration: { d_us: "forever" }, refreshable: true @@ -28440,7 +28619,9 @@ function revalidateAccountDetails() { } function useAccountDetails(account) { const { state: credentials } = useSessionState(); - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); async function fetcher([username, token2]) { return await api.getAccount({ username, token: token2 }); } @@ -28453,7 +28634,9 @@ function useAccountDetails(account) { return void 0; } function useWithdrawalDetails(wid) { - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const [latestStatus, setLatestStatus] = p3(); async function fetcher([wid2, old_state]) { return await api.getWithdrawalById( @@ -28493,12 +28676,14 @@ async function revalidatePublicAccounts() { } function usePublicAccounts(filterAccount, initial3) { const [offset, setOffset] = p3(initial3); - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); async function fetcher([account, txid]) { return await api.getPublicAccounts( { account }, { - limit: PAGE_SIZE, + limit: PAGINATED_LIST_REQUEST, offset: txid ? String(txid) : void 0, order: "asc" } @@ -28515,32 +28700,39 @@ function usePublicAccounts(filterAccount, initial3) { shouldRetryOnError: false, keepPreviousData: true }); - const isLastPage = data && data.type === "ok" && data.body.public_accounts.length <= PAGE_SIZE; - const isFirstPage = !offset; - const result = data && data.type == "ok" ? structuredClone(data.body.public_accounts) : []; - if (result.length == PAGE_SIZE + 1) { + if (error2) + return error2; + if (data === void 0) + return void 0; + return buildPaginatedResult( + data.body.public_accounts, + offset, + setOffset, + (d5) => d5.row_id ?? 0 + ); +} +function buildPaginatedResult(data, offset, setOffset, getId) { + const isLastPage = data.length < PAGINATED_LIST_REQUEST; + const isFirstPage = offset === void 0; + const result = structuredClone(data); + if (result.length == PAGINATED_LIST_REQUEST) { result.pop(); } - const pagination = { - result, + return { + type: "ok", + body: result, isLastPage, isFirstPage, loadNext: () => { if (!result.length) return; - setOffset(result[result.length - 1].row_id); + const id = getId(result[result.length - 1]); + setOffset(id); }, loadFirst: () => { - setOffset(0); + setOffset(void 0); } }; - if (data) { - return { ok: true, data: data.body, ...pagination }; - } - if (error2) { - return error2; - } - return void 0; } function revalidateTransactions() { return mutate( @@ -28553,12 +28745,14 @@ function useTransactions(account, initial3) { const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? void 0 : credentials.token; const [offset, setOffset] = p3(initial3); - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); async function fetcher([username, token2, txid]) { return await api.getTransactions( { username, token: token2 }, { - limit: PAGE_SIZE + 1, + limit: PAGINATED_LIST_REQUEST, offset: txid ? String(txid) : void 0, order: "dec" } @@ -28573,32 +28767,18 @@ function useTransactions(account, initial3) { revalidateOnFocus: false, revalidateOnReconnect: false }); - const isLastPage = data && data.type === "ok" && data.body.transactions.length <= PAGE_SIZE; - const isFirstPage = !offset; - const result = data && data.type == "ok" ? structuredClone(data.body.transactions) : []; - if (result.length == PAGE_SIZE + 1) { - result.pop(); - } - const pagination = { - result, - isLastPage, - isFirstPage, - loadNext: () => { - if (!result.length) - return; - setOffset(result[result.length - 1].row_id); - }, - loadFirst: () => { - setOffset(0); - } - }; - if (data) { - return { ok: true, data, ...pagination }; - } - if (error2) { + if (error2) return error2; - } - return void 0; + if (data === void 0) + return void 0; + if (data.type !== "ok") + return data; + return buildPaginatedResult( + data.body.transactions, + offset, + setOffset, + (d5) => d5.row_id + ); } // src/pages/AccountPage/state.ts @@ -28689,20 +28869,26 @@ function useComponentState2({ account, routeCreateWireTransfer }) { - const txResult = useTransactions(account); - if (!txResult) { + const result = useTransactions(account); + if (!result) { return { status: "loading", error: void 0 }; } - if (txResult instanceof TalerError) { + if (result instanceof TalerError) { return { status: "loading-error", - error: txResult + error: result + }; + } + if (result.type === "fail") { + return { + status: "loading", + error: void 0 }; } - const transactions = txResult.result.map((tx) => { + const transactions = result.body.map((tx) => { const negative = tx.direction === "debit"; const cp = parsePaytoUri( negative ? tx.creditor_payto_uri : tx.debtor_payto_uri @@ -28724,8 +28910,8 @@ function useComponentState2({ error: void 0, routeCreateWireTransfer, transactions, - onGoNext: txResult.isLastPage ? void 0 : txResult.loadNext, - onGoStart: txResult.isFirstPage ? void 0 : txResult.loadFirst + onGoNext: result.isLastPage ? void 0 : result.loadNext, + onGoStart: result.isFirstPage ? void 0 : result.loadFirst }; } @@ -30676,48 +30862,6 @@ function formatISO(date, options) { return result; } -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/getDate/index.js -function getDate(dirtyDate) { - requiredArgs2(1, arguments); - var date = toDate2(dirtyDate); - var dayOfMonth = date.getDate(); - return dayOfMonth; -} - -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/getDaysInMonth/index.js -function getDaysInMonth(dirtyDate) { - requiredArgs2(1, arguments); - var date = toDate2(dirtyDate); - var year = date.getFullYear(); - var monthIndex = date.getMonth(); - var lastDayOfMonth = /* @__PURE__ */ new Date(0); - lastDayOfMonth.setFullYear(year, monthIndex + 1, 0); - lastDayOfMonth.setHours(0, 0, 0, 0); - return lastDayOfMonth.getDate(); -} - -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/getHours/index.js -function getHours(dirtyDate) { - requiredArgs2(1, arguments); - var date = toDate2(dirtyDate); - var hours = date.getHours(); - return hours; -} - -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/getMonth/index.js -function getMonth(dirtyDate) { - requiredArgs2(1, arguments); - var date = toDate2(dirtyDate); - var month = date.getMonth(); - return month; -} - -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/getYear/index.js -function getYear(dirtyDate) { - requiredArgs2(1, arguments); - return toDate2(dirtyDate).getFullYear(); -} - // ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/intervalToDuration/index.js function intervalToDuration(interval) { requiredArgs2(1, arguments); @@ -30760,51 +30904,6 @@ function subDays(dirtyDate, dirtyAmount) { return addDays(dirtyDate, -amount); } -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/setMonth/index.js -function setMonth(dirtyDate, dirtyMonth) { - requiredArgs2(2, arguments); - var date = toDate2(dirtyDate); - var month = toInteger2(dirtyMonth); - var year = date.getFullYear(); - var day = date.getDate(); - var dateWithDesiredMonth = /* @__PURE__ */ new Date(0); - dateWithDesiredMonth.setFullYear(year, month, 15); - dateWithDesiredMonth.setHours(0, 0, 0, 0); - var daysInMonth = getDaysInMonth(dateWithDesiredMonth); - date.setMonth(month, Math.min(day, daysInMonth)); - return date; -} - -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/setDate/index.js -function setDate(dirtyDate, dirtyDayOfMonth) { - requiredArgs2(2, arguments); - var date = toDate2(dirtyDate); - var dayOfMonth = toInteger2(dirtyDayOfMonth); - date.setDate(dayOfMonth); - return date; -} - -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/setHours/index.js -function setHours(dirtyDate, dirtyHours) { - requiredArgs2(2, arguments); - var date = toDate2(dirtyDate); - var hours = toInteger2(dirtyHours); - date.setHours(hours); - return date; -} - -// ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/setYear/index.js -function setYear(dirtyDate, dirtyYear) { - requiredArgs2(2, arguments); - var date = toDate2(dirtyDate); - var year = toInteger2(dirtyYear); - if (isNaN(date.getTime())) { - return /* @__PURE__ */ new Date(NaN); - } - date.setFullYear(year); - return date; -} - // ../../node_modules/.pnpm/date-fns@2.29.3/node_modules/date-fns/esm/subMonths/index.js function subMonths(dirtyDate, dirtyAmount) { requiredArgs2(2, arguments); @@ -31069,7 +31168,9 @@ function useComponentState3({ const [bankState, updateBankState] = useBankState(); const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? void 0 : credentials; - const { lib: { bank } } = useBankCoreApiContext(); + const { + lib: { bank } + } = useBankCoreApiContext(); const [failure2, setFailure] = p3(); const amount = settings.maxWithdrawalAmount; async function doSilentStart() { @@ -31285,7 +31386,10 @@ function WithdrawalConfirmationQuestion({ const creds = credentials.status !== "loggedIn" ? void 0 : credentials; const [, updateBankState] = useBankState(); const [notification, notify2, handleError] = useLocalNotification(); - const { config, lib: { bank: api } } = useBankCoreApiContext(); + const { + config, + lib: { bank: api } + } = useBankCoreApiContext(); async function doTransfer() { await handleError(async () => { if (!creds) @@ -31851,7 +31955,10 @@ function OldWithdrawalForm({ const { i18n: i18n2 } = useTranslationContext(); const [settings] = usePreferences(); const [bankState, updateBankState] = useBankState(); - const { lib: { bank: api }, config } = useBankCoreApiContext(); + const { + lib: { bank: api }, + config + } = useBankCoreApiContext(); const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? void 0 : credentials; const [amountStr, setAmountStr] = p3( @@ -32368,7 +32475,7 @@ var AccountPage = utils_exports.compose( // src/pages/BankFrame.tsx init_preact_module(); init_hooks_module(); -var GIT_HASH = true ? "d57c7effa9ce2488131176c87af9d57ee5b799b1" : void 0; +var GIT_HASH = true ? "a08ad2c631da0283a5e10189d06977a96665afae" : void 0; var VERSION = true ? "0.9.3-dev.29" : void 0; function BankFrame({ children, @@ -32530,6 +32637,7 @@ function AppActivity() { case ObservabilityEventType.CryptoStart: case ObservabilityEventType.CryptoFinishSuccess: case ObservabilityEventType.CryptoFinishError: + case ObservabilityEventType.Message: return; default: { assertUnreachable(ev); @@ -32626,7 +32734,7 @@ init_hooks_module(); function PublicHistoriesPage() { const { i18n: i18n2 } = useTranslationContext(); const result = usePublicAccounts(void 0); - const firstAccount = result && !(result instanceof TalerError) && result.data.public_accounts.length > 0 ? result.data.public_accounts[0].username : void 0; + const firstAccount = result && !(result instanceof TalerError) && result.body.length > 0 ? result.body[0].username : void 0; const [showAccount, setShowAccount] = p3(firstAccount); if (!result) { return /* @__PURE__ */ h(Loading, null); @@ -32634,10 +32742,10 @@ function PublicHistoriesPage() { if (result instanceof TalerError) { return /* @__PURE__ */ h(Loading, null); } - const { data } = result; + const { body: accountList } = result; const txs = {}; const accountsBar = []; - for (const account of data.public_accounts) { + for (const account of accountList) { const isSelected = account.username == showAccount; accountsBar.push( /* @__PURE__ */ h( @@ -32699,7 +32807,10 @@ function revalidateConversionInfo() { ); } function useConversionInfo() { - const { lib: { conversion }, config } = useBankCoreApiContext(); + const { + lib: { conversion }, + config + } = useBankCoreApiContext(); async function fetcher() { return await conversion.getConfig(); } @@ -32721,7 +32832,9 @@ function useConversionInfo() { return void 0; } function useCashinEstimator() { - const { lib: { conversion } } = useBankCoreApiContext(); + const { + lib: { conversion } + } = useBankCoreApiContext(); return { estimateByCredit: async (fiatAmount, fee) => { const resp = await conversion.getCashinRate({ @@ -32772,7 +32885,9 @@ function useCashinEstimator() { }; } function useCashoutEstimator() { - const { lib: { conversion } } = useBankCoreApiContext(); + const { + lib: { conversion } + } = useBankCoreApiContext(); return { estimateByCredit: async (fiatAmount, fee) => { const resp = await conversion.getCashoutRate({ @@ -32832,15 +32947,17 @@ async function revalidateBusinessAccounts() { function useBusinessAccounts() { const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? void 0 : credentials.token; - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const [offset, setOffset] = p3(); - function fetcher([token2, offset2]) { + function fetcher([token2, aid]) { return api.getAccounts( token2, {}, { - limit: PAGE_SIZE + 1, - offset: String(offset2), + limit: PAGINATED_LIST_REQUEST, + offset: aid ? String(aid) : void 0, order: "asc" } ); @@ -32856,30 +32973,18 @@ function useBusinessAccounts() { shouldRetryOnError: false, keepPreviousData: true }); - const isLastPage = data && data.type === "ok" && data.body.accounts.length <= PAGE_SIZE; - const isFirstPage = !offset; - const result = data && data.type == "ok" ? structuredClone(data.body.accounts) : []; - if (result.length == PAGE_SIZE + 1) { - result.pop(); - } - const pagination = { - result, - isLastPage, - isFirstPage, - loadNext: () => { - if (!result.length) - return; - setOffset(result[result.length - 1].row_id); - }, - loadFirst: () => { - setOffset(0); - } - }; - if (data) - return { ok: true, data, ...pagination }; if (error2) return error2; - return void 0; + if (data === void 0) + return void 0; + if (data.type !== "ok") + return data; + return buildPaginatedResult( + data.body.accounts, + offset, + setOffset, + (d5) => d5.row_id ?? 0 + ); } function notUndefined(c4) { return c4 !== void 0; @@ -32891,7 +32996,10 @@ function revalidateCashouts() { } function useCashouts(account) { const { state: credentials } = useSessionState(); - const { lib: { bank: api }, config } = useBankCoreApiContext(); + const { + lib: { bank: api }, + config + } = useBankCoreApiContext(); const token = credentials.status !== "loggedIn" ? void 0 : credentials.token; async function fetcher([username, token2]) { const list = await api.getAccountCashouts({ username, token: token2 }); @@ -32934,7 +33042,9 @@ function useCashouts(account) { function useCashoutDetails(cashoutId) { const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? void 0 : credentials; - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); async function fetcher([username, token, id]) { return api.getCashoutById({ username, token }, id); } @@ -32960,13 +33070,15 @@ function useCashoutDetails(cashoutId) { return void 0; } function useLastMonitorInfo(currentMoment, previousMoment, timeframe) { - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? void 0 : credentials.token; async function fetcher([token2, timeframe2]) { const [current, previous] = await Promise.all([ - api.getMonitor(token2, { timeframe: timeframe2, which: currentMoment }), - api.getMonitor(token2, { timeframe: timeframe2, which: previousMoment }) + api.getMonitor(token2, { timeframe: timeframe2, date: currentMoment }), + api.getMonitor(token2, { timeframe: timeframe2, date: previousMoment }) ]); return { current, @@ -33014,7 +33126,9 @@ function QrCodeSection({ walletInegrationApi.publishTalerAction(withdrawUri); }, []); const [notification, handleError] = useLocalNotificationHandler(); - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const onAbortHandler = handleError( async () => { if (!creds) @@ -33274,7 +33388,9 @@ function SolveChallengePage({ onChallengeCompleted, routeClose }) { - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const { i18n: i18n2 } = useTranslationContext(); const [bankState, updateBankState] = useBankState(); const [code, setCode] = p3(void 0); @@ -33783,7 +33899,9 @@ function WithdrawalOperationPage({ routeClose, routeWithdrawalDetails }) { - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const uri = stringifyWithdrawUri({ bankIntegrationApiBaseUrl: api.getIntegrationAPI().href, withdrawalOperationId: operationId @@ -34162,7 +34280,11 @@ function CreateCashout({ const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? void 0 : credentials; const [, updateBankState] = useBankState(); - const { lib: { bank: api }, config, hints } = useBankCoreApiContext(); + const { + lib: { bank: api }, + config, + hints + } = useBankCoreApiContext(); const [form, setForm] = p3({ isDebit: true }); const [notification, notify2, handleError] = useLocalNotification(); const info = useConversionInfo(); @@ -35051,7 +35173,9 @@ function ShowAccountDetails({ const { i18n: i18n2 } = useTranslationContext(); const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" ? void 0 : credentials; - const { lib: { bank } } = useBankCoreApiContext(); + const { + lib: { bank } + } = useBankCoreApiContext(); const accountIsTheCurrentUser = credentials.status === "loggedIn" ? credentials.username === account : false; const [submitAccount, setSubmitAccount] = p3(); const [notification, notify2, handleError] = useLocalNotification(); @@ -35405,7 +35529,9 @@ function UpdateAccountPassword({ const { i18n: i18n2 } = useTranslationContext(); const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? void 0 : credentials.token; - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const [current, setCurrent] = p3(); const [password, setPassword] = p3(); const [repeat, setRepeat] = p3(); @@ -35634,17 +35760,17 @@ function AccountList({ if (result instanceof TalerError) { return /* @__PURE__ */ h(ErrorLoadingWithDebug, { error: result }); } - if (result.data.type === "fail") { - switch (result.data.case) { + if (result.type === "fail") { + switch (result.case) { case HttpStatusCode.Unauthorized: return /* @__PURE__ */ h(p2, null); default: - assertUnreachable(result.data.case); + assertUnreachable(result.case); } } const onGoStart = result.isFirstPage ? void 0 : result.loadFirst; const onGoNext = result.isLastPage ? void 0 : result.loadNext; - const accounts = result.result; + const accounts = result.body; return /* @__PURE__ */ h(p2, null, /* @__PURE__ */ h("div", { class: "px-4 sm:px-6 lg:px-8 mt-8" }, /* @__PURE__ */ h("div", { class: "sm:flex sm:items-center" }, /* @__PURE__ */ h("div", { class: "sm:flex-auto" }, /* @__PURE__ */ h("h1", { class: "text-base font-semibold leading-6 text-gray-900" }, /* @__PURE__ */ h(i18n2.Translate, null, "Accounts"))), /* @__PURE__ */ h("div", { class: "mt-4 sm:ml-16 sm:mt-0 sm:flex-none" }, /* @__PURE__ */ h( "a", { @@ -35784,19 +35910,20 @@ function AdminHome({ } )); } -function getDateForTimeframe(which, timeframe, locale6) { - const time = Date.now(); +function getDateForTimeframe(date, timeframe, locale6) { + if (date.t_ms === "never") + return "--"; switch (timeframe) { case TalerCorebankApi.MonitorTimeframeParam.hour: - return `${format(setHours(time, which), "HH", { locale: locale6 })}hs`; + return `${format(date.t_ms, "HH", { locale: locale6 })}hs`; case TalerCorebankApi.MonitorTimeframeParam.day: - return format(setDate(time, which), "EEEE", { locale: locale6 }); + return format(date.t_ms, "EEEE", { locale: locale6 }); case TalerCorebankApi.MonitorTimeframeParam.month: - return format(setMonth(time, which), "MMMM", { locale: locale6 }); + return format(date.t_ms, "MMMM", { locale: locale6 }); case TalerCorebankApi.MonitorTimeframeParam.year: - return format(setYear(time, which), "yyyy", { locale: locale6 }); + return format(date.t_ms, "yyyy", { locale: locale6 }); case TalerCorebankApi.MonitorTimeframeParam.decade: - return format(setYear(time, which), "yyyy", { locale: locale6 }); + return format(date.t_ms, "yyyy", { locale: locale6 }); } assertUnreachable(timeframe); } @@ -35804,28 +35931,48 @@ function getTimeframesForDate(time, timeframe) { switch (timeframe) { case TalerCorebankApi.MonitorTimeframeParam.hour: return { - current: getHours(sub(time, { hours: 1 })), - previous: getHours(sub(time, { hours: 2 })) + current: AbsoluteTime.fromMilliseconds( + sub(time, { hours: 1 }).getTime() + ), + previous: AbsoluteTime.fromMilliseconds( + sub(time, { hours: 2 }).getTime() + ) }; case TalerCorebankApi.MonitorTimeframeParam.day: return { - current: getDate(sub(time, { days: 1 })), - previous: getDate(sub(time, { days: 2 })) + current: AbsoluteTime.fromMilliseconds( + sub(time, { days: 1 }).getTime() + ), + previous: AbsoluteTime.fromMilliseconds( + sub(time, { days: 4 }).getTime() + ) }; case TalerCorebankApi.MonitorTimeframeParam.month: return { - current: getMonth(sub(time, { months: 1 })), - previous: getMonth(sub(time, { months: 2 })) + current: AbsoluteTime.fromMilliseconds( + sub(time, { months: 1 }).getTime() + ), + previous: AbsoluteTime.fromMilliseconds( + sub(time, { months: 2 }).getTime() + ) }; case TalerCorebankApi.MonitorTimeframeParam.year: return { - current: getYear(sub(time, { years: 1 })), - previous: getYear(sub(time, { years: 2 })) + current: AbsoluteTime.fromMilliseconds( + sub(time, { years: 1 }).getTime() + ), + previous: AbsoluteTime.fromMilliseconds( + sub(time, { years: 2 }).getTime() + ) }; case TalerCorebankApi.MonitorTimeframeParam.decade: return { - current: getYear(sub(time, { years: 10 })), - previous: getYear(sub(time, { years: 20 })) + current: AbsoluteTime.fromMilliseconds( + sub(time, { years: 10 }).getTime() + ), + previous: AbsoluteTime.fromMilliseconds( + sub(time, { years: 20 }).getTime() + ) }; default: assertUnreachable(timeframe); @@ -35857,12 +36004,60 @@ function Metrics({ case HttpStatusCode.NotImplemented: { return /* @__PURE__ */ h(Attention, { type: "danger", title: i18n2.str`Cashout are disabled` }, /* @__PURE__ */ h(i18n2.Translate, null, "Cashout should be enable by configuration and the conversion rate should be initialized with fee, ratio and rounding mode.")); } - default: + default: { assertUnreachable(respInfo.case); + } } } - if (resp.current.type !== "ok" || resp.previous.type !== "ok") { - return /* @__PURE__ */ h(p2, null); + if (resp.current.type !== "ok") { + switch (resp.current.case) { + case HttpStatusCode.BadRequest: + return /* @__PURE__ */ h( + Attention, + { + type: "warning", + title: i18n2.str`Querying for the current stats failed` + }, + /* @__PURE__ */ h(i18n2.Translate, null, "The request parameters are wrong") + ); + case HttpStatusCode.Unauthorized: + return /* @__PURE__ */ h( + Attention, + { + type: "warning", + title: i18n2.str`Querying for the current stats failed` + }, + /* @__PURE__ */ h(i18n2.Translate, null, "The user is unauthorized") + ); + default: { + assertUnreachable(resp.current); + } + } + } + if (resp.previous.type !== "ok") { + switch (resp.previous.case) { + case HttpStatusCode.BadRequest: + return /* @__PURE__ */ h( + Attention, + { + type: "warning", + title: i18n2.str`Querying for the previous stats failed` + }, + /* @__PURE__ */ h(i18n2.Translate, null, "The request parameters are wrong") + ); + case HttpStatusCode.Unauthorized: + return /* @__PURE__ */ h( + Attention, + { + type: "warning", + title: i18n2.str`Querying for the previous stats failed` + }, + /* @__PURE__ */ h(i18n2.Translate, null, "The user is unauthorized") + ); + default: { + assertUnreachable(resp.previous); + } + } } return /* @__PURE__ */ h("div", { class: "px-4 mt-4" }, /* @__PURE__ */ h("div", { class: "sm:flex sm:items-center mb-4" }, /* @__PURE__ */ h("div", { class: "sm:flex-auto" }, /* @__PURE__ */ h("h1", { class: "text-base font-semibold leading-6 text-gray-900" }, /* @__PURE__ */ h(i18n2.Translate, null, "Transaction volume report")))), /* @__PURE__ */ h("div", { class: "sm:hidden" }, /* @__PURE__ */ h("label", { for: "tabs", class: "sr-only" }, /* @__PURE__ */ h(i18n2.Translate, null, "Select a section")), /* @__PURE__ */ h( "select", @@ -36133,7 +36328,9 @@ function CreateNewAccount({ const { i18n: i18n2 } = useTranslationContext(); const { state: credentials } = useSessionState(); const token = credentials.status !== "loggedIn" ? void 0 : credentials.token; - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const [submitAccount, setSubmitAccount] = p3(); const [notification, notify2, handleError] = useLocalNotification(); async function doCreate() { @@ -36286,7 +36483,9 @@ function DownloadStats({ routeCancel }) { const { i18n: i18n2 } = useTranslationContext(); const { state: credentials } = useSessionState(); const creds = credentials.status !== "loggedIn" || !credentials.isUserAdministrator ? void 0 : credentials; - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const [options, setOptions] = p3({ compareWithPrevious: true, dayMetric: true, @@ -36623,14 +36822,14 @@ async function fetchAllStatus(api, token, options, references, progress) { progress(index, total); const previous = options.compareWithPrevious ? await api.getMonitor(token, { timeframe: frame.timeframe, - which: frame.moment.previous + date: frame.moment.previous }) : void 0; if (previous && previous.type === "fail" && options.endOnFirstFail) { throw TalerError.fromUncheckedDetail(previous.detail); } const current = await api.getMonitor(token, { timeframe: frame.timeframe, - which: frame.moment.current + date: frame.moment.current }); if (current.type === "fail" && options.endOnFirstFail) { throw TalerError.fromUncheckedDetail(current.detail); @@ -36720,7 +36919,9 @@ function RemoveAccount({ const [accountName, setAccountName] = p3(); const { state } = useSessionState(); const token = state.status !== "loggedIn" ? void 0 : state.token; - const { lib: { bank: api } } = useBankCoreApiContext(); + const { + lib: { bank: api } + } = useBankCoreApiContext(); const [notification, notify2, handleError] = useLocalNotification(); const [, updateBankState] = useBankState(); if (!result) { @@ -36949,7 +37150,9 @@ function useComponentState5({ } return function afterComponentLoads() { const { i18n: i18n3 } = useTranslationContext(); - const { lib: { conversion } } = useBankCoreApiContext(); + const { + lib: { conversion } + } = useBankCoreApiContext(); const [notification, notify2, handleError] = useLocalNotification(); const initalState = { amount: "100", @@ -37729,7 +37932,7 @@ var publicPages = { register: urlPattern(/\/register/, () => "#/register"), publicAccounts: urlPattern(/\/public-accounts/, () => "#/public-accounts"), operationDetails: urlPattern( - /\/operation\/(?<wopid>[a-zA-Z0-9]+)/, + /\/operation\/(?<wopid>[a-zA-Z0-9-]+)/, ({ wopid }) => `#/operation/${wopid}` ), solveSecondFactor: urlPattern(/\/2fa/, () => "#/2fa") @@ -37752,7 +37955,7 @@ function PublicRounting({ } async function doAutomaticLogin(username, password) { await handleError(async () => { - const resp = await lib.auth(username).createAccessToken(password, { + const resp = await lib.auth(username).createAccessTokenBasic(username, password, { scope: "readwrite", duration: { d_us: "forever" }, refreshable: true @@ -40394,35 +40597,43 @@ function App() { de: strings["de"].completeness } }, - /* @__PURE__ */ h(BankApiProvider, { baseUrl: new URL("/", baseUrl), frameOnError: BankFrame, evictors: { - bank: evictBankSwrCache, - conversion: evictConversionSwrCache - } }, /* @__PURE__ */ h( - SWRConfig2, + /* @__PURE__ */ h( + BankApiProvider, { - value: { - provider: WITH_LOCAL_STORAGE_CACHE ? localStorageProvider : void 0, - // normally, do not revalidate - revalidateOnFocus: false, - revalidateOnReconnect: false, - revalidateIfStale: false, - revalidateOnMount: void 0, - focusThrottleInterval: void 0, - // normally, do not refresh - refreshInterval: void 0, - dedupingInterval: 2e3, - refreshWhenHidden: false, - refreshWhenOffline: false, - // ignore errors - shouldRetryOnError: false, - errorRetryCount: 0, - errorRetryInterval: void 0, - // do not go to loading again if already has data - keepPreviousData: true + baseUrl: new URL("/", baseUrl), + frameOnError: BankFrame, + evictors: { + bank: evictBankSwrCache, + conversion: evictConversionSwrCache } }, - /* @__PURE__ */ h(TalerWalletIntegrationBrowserProvider, null, /* @__PURE__ */ h(BrowserHashNavigationProvider, null, /* @__PURE__ */ h(Routing, null))) - )) + /* @__PURE__ */ h( + SWRConfig2, + { + value: { + provider: WITH_LOCAL_STORAGE_CACHE ? localStorageProvider : void 0, + // normally, do not revalidate + revalidateOnFocus: false, + revalidateOnReconnect: false, + revalidateIfStale: false, + revalidateOnMount: void 0, + focusThrottleInterval: void 0, + // normally, do not refresh + refreshInterval: void 0, + dedupingInterval: 2e3, + refreshWhenHidden: false, + refreshWhenOffline: false, + // ignore errors + shouldRetryOnError: false, + errorRetryCount: 0, + errorRetryInterval: void 0, + // do not go to loading again if already has data + keepPreviousData: true + } + }, + /* @__PURE__ */ h(TalerWalletIntegrationBrowserProvider, null, /* @__PURE__ */ h(BrowserHashNavigationProvider, null, /* @__PURE__ */ h(Routing, null))) + ) + ) )); } window.setGlobalLogLevelFromString = setGlobalLogLevelFromString; |