From bc817a638d4ddfff0d5f05b51453c6ca790b24ec Mon Sep 17 00:00:00 2001 From: Sebastian Date: Sun, 16 Jan 2022 17:54:48 -0300 Subject: #7120 manifest v3: first iteration working new permission needed: scripting chrome.browserAction -> chrome.action webRequestBlocking is not possible anymore chrome.extension.getUrl -> chrome.runtime.getUrl new serviceWorkerHttpLib: using fetch new serviceWorkerCryptoWorkerFactory: using syncCryptoImpl few other minor changes still missing some other changes like migrating setTimeout to chrome.alarms api --- .../src/serviceWorkerHttpLib.ts | 146 +++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 packages/taler-wallet-webextension/src/serviceWorkerHttpLib.ts (limited to 'packages/taler-wallet-webextension/src/serviceWorkerHttpLib.ts') diff --git a/packages/taler-wallet-webextension/src/serviceWorkerHttpLib.ts b/packages/taler-wallet-webextension/src/serviceWorkerHttpLib.ts new file mode 100644 index 000000000..f8953f73f --- /dev/null +++ b/packages/taler-wallet-webextension/src/serviceWorkerHttpLib.ts @@ -0,0 +1,146 @@ +/* + This file is part of GNU Taler + (C) 2020 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +/** + * Imports. + */ +import { Logger, TalerErrorCode } from "@gnu-taler/taler-util"; +import { + Headers, HttpRequestLibrary, + HttpRequestOptions, + HttpResponse, + OperationFailedError +} from "@gnu-taler/taler-wallet-core"; + +const logger = new Logger("browserHttpLib"); + +/** + * An implementation of the [[HttpRequestLibrary]] using the + * browser's XMLHttpRequest. + */ +export class ServiceWorkerHttpLib implements HttpRequestLibrary { + async fetch(requestUrl: string, options?: HttpRequestOptions): Promise { + const requestMethod = options?.method ?? "GET"; + const requestBody = options?.body; + const requestHeader = options?.headers; + + const response = await fetch(requestUrl, { + headers: requestHeader, + body: requestBody, + method: requestMethod, + // timeout: options?.timeout + }) + + const headerMap = new Headers(); + response.headers.forEach(addLineToMap(headerMap)); + + return { + headers: headerMap, + status: response.status, + requestMethod, + requestUrl, + json: makeJsonHandler(response, requestUrl), + text: makeTextHandler(response, requestUrl), + bytes: async () => (await response.blob()).arrayBuffer(), + } + + } + + + get(url: string, opt?: HttpRequestOptions): Promise { + return this.fetch(url, { + method: "GET", + ...opt, + }); + } + + postJson( + url: string, + body: any, + opt?: HttpRequestOptions, + ): Promise { + return this.fetch(url, { + method: "POST", + body: JSON.stringify(body), + ...opt, + }); + } + + stop(): void { + // Nothing to do + } +} + +function makeTextHandler(response: Response, requestUrl: string) { + return async function getJsonFromResponse(): Promise { + let respText; + try { + respText = await response.text() + } catch (e) { + throw OperationFailedError.fromCode( + TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, + "Invalid JSON from HTTP response", + { + requestUrl, + httpStatusCode: response.status, + }, + ); + } + return respText + } +} + +function makeJsonHandler(response: Response, requestUrl: string) { + return async function getJsonFromResponse(): Promise { + let responseJson; + try { + responseJson = await response.json() + } catch (e) { + throw OperationFailedError.fromCode( + TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, + "Invalid JSON from HTTP response", + { + requestUrl, + httpStatusCode: response.status, + }, + ); + } + if (responseJson === null || typeof responseJson !== "object") { + throw OperationFailedError.fromCode( + TalerErrorCode.WALLET_RECEIVED_MALFORMED_RESPONSE, + "Invalid JSON from HTTP response", + { + requestUrl, + httpStatusCode: response.status, + }, + ); + } + return responseJson + } +} + +function addLineToMap(map: { set(k: string, v: string): void }) { + return (line: string) => { + const parts = line.split(": "); + const headerName = parts.shift(); + if (!headerName) { + logger.warn("skipping invalid header"); + return; + } + const value = parts.join(": "); + map.set(headerName, value); + } +} \ No newline at end of file -- cgit v1.2.3