diff --git a/packages/app/.eslintignore b/packages/app/.eslintignore index 20c8dbdc5..40ec8e899 100644 --- a/packages/app/.eslintignore +++ b/packages/app/.eslintignore @@ -2,4 +2,4 @@ dist/ node_modules/ coverage/ tmp/ -src/background/shared/subworkers.js \ No newline at end of file +src/background/shared/*.js diff --git a/packages/app/src/background/services/injector/__tests__/injector.test.ts b/packages/app/src/background/services/injector/__tests__/injector.test.ts index 748029a32..5efb0475f 100644 --- a/packages/app/src/background/services/injector/__tests__/injector.test.ts +++ b/packages/app/src/background/services/injector/__tests__/injector.test.ts @@ -18,10 +18,23 @@ Object.defineProperty(global, "chrome", { value: { offscreen: { closeDocument: jest.fn(), + hasDocument: jest.fn(), + createDocument: jest.fn(), + Reason: jest.fn(() => ({ + DOM_SCRAPING: "DOM_SCRAPING", + })), }, }, }); +jest.mock("@cryptkeeperzk/semaphore-proof", (): unknown => ({ + generateProof: jest.fn(), +})); + +jest.mock("@cryptkeeperzk/zk", (): unknown => ({ + getMerkleProof: jest.fn(), +})); + jest.mock("@src/background/controllers/browserUtils", (): unknown => ({ getInstance: jest.fn(() => ({ closePopup: jest.fn(), @@ -172,7 +185,7 @@ describe("background/services/injector", () => { ); }); - test("should be able to genearte semaphore proof", async () => { + test("should be able to generate semaphore proof", async () => { const service = InjectorService.getInstance(); await service.connect({ origin: mockDefaultHost }); diff --git a/packages/app/src/background/services/injector/index.ts b/packages/app/src/background/services/injector/index.ts index 7e191fe4b..0d2f8e05f 100644 --- a/packages/app/src/background/services/injector/index.ts +++ b/packages/app/src/background/services/injector/index.ts @@ -1,5 +1,5 @@ import { RPCAction } from "@cryptkeeperzk/providers"; -import { FullProof, generateProof } from "@cryptkeeperzk/semaphore-proof"; +import { generateProof } from "@cryptkeeperzk/semaphore-proof"; import { getMerkleProof } from "@cryptkeeperzk/zk"; import browser from "webextension-polyfill"; @@ -77,7 +77,7 @@ export default class InjectorService { generateSemaphoreProof = async ( { merkleStorageAddress, externalNullifier, signal, merkleProofArtifacts }: SemaphoreProofRequest, meta: IMeta, - ): Promise => { + ): Promise => { const browserPlatform = getBrowserPlatform(); const { isUnlocked } = await this.lockerService.getStatus(); @@ -149,9 +149,9 @@ export default class InjectorService { zkeyFilePath: semaphoreRequest.zkeyFilePath, }); - return fullProof; + return { fullProof }; } catch (e) { - throw new Error("Error in generateSemaphoreProof"); + throw new Error(`${e as string}`); } finally { if (browserPlatform !== BrowserPlatform.Firefox) { await closeChromeOffscreen(); diff --git a/packages/app/src/background/shared/subworkers.js b/packages/app/src/background/shared/subworkers.js index 73e3c486c..5a61b48ed 100644 --- a/packages/app/src/background/shared/subworkers.js +++ b/packages/app/src/background/shared/subworkers.js @@ -1,136 +1,139 @@ -// +// eslint-disable // A workaround for resolving `Worker is not defined` error with MV3 on Chromium based platforms. (async function () { - if (global.chrome) { - /* Detect if we're in a worker or not */ - let isWorker = false; - try { - document; - } catch (e) { - isWorker = true; - } + if (!global.chrome) { + return; + } + + /* Detect if we're in a worker or not */ + let isWorker = false; + try { + document; + } catch (e) { + isWorker = true; + } - if (isWorker) { - if (!self.Worker) { - self.Worker = function (path) { - const that = this; - this.id = Math.random().toString(36).substr(2, 5); + if (isWorker) { + if (!self.Worker) { + self.Worker = function (path) { + const that = this; + this.id = Math.random().toString(36).substr(2, 5); - this.eventListeners = { - message: [], - }; - self.addEventListener("message", (e) => { - if (e.data._from === that.id) { - const newEvent = new MessageEvent("message"); - newEvent.initMessageEvent("message", false, false, e.data.message, that, "", null, []); - that.dispatchEvent(newEvent); - if (that.onmessage) { - that.onmessage(newEvent); - } + this.eventListeners = { + message: [], + }; + self.addEventListener("message", (e) => { + if (e.data._from === that.id) { + const newEvent = new MessageEvent("message"); + newEvent.initMessageEvent("message", false, false, e.data.message, that, "", null, []); + that.dispatchEvent(newEvent); + if (that.onmessage) { + that.onmessage(newEvent); } - }); + } + }); - const location = self.location.pathname; - const slashedPath = path.charAt(0) == "/" ? path : `/${path}`; - const absPath = location.substring(0, location.lastIndexOf("/")) + slashedPath; + const location = self.location.pathname; + const slashedPath = path.charAt(0) == "/" ? path : `/${path}`; + const absPath = location.substring(0, location.lastIndexOf("/")) + slashedPath; + self.postMessage({ + _subworker: true, + cmd: "newWorker", + id: this.id, + path: absPath, + }); + }; + Worker.prototype = { + onerror: null, + onmessage: null, + postMessage(message, transfer) { + self.postMessage( + { + _subworker: true, + id: this.id, + cmd: "passMessage", + message, + transfer, + }, + transfer, + ); + }, + terminate() { self.postMessage({ _subworker: true, - cmd: "newWorker", + cmd: "terminate", id: this.id, - path: absPath, }); - }; - Worker.prototype = { - onerror: null, - onmessage: null, - postMessage(message, transfer) { - self.postMessage( - { - _subworker: true, - id: this.id, - cmd: "passMessage", - message, - transfer, - }, - transfer, - ); - }, - terminate() { - self.postMessage({ - _subworker: true, - cmd: "terminate", - id: this.id, - }); - }, - addEventListener(type, listener, useCapture) { - if (this.eventListeners[type]) { - this.eventListeners[type].push(listener); - } - }, - removeEventListener(type, listener, useCapture) { - if (!(type in this.eventListeners)) { - return; - } - const index = this.eventListeners[type].indexOf(listener); - if (index !== -1) { - this.eventListeners[type].splice(index, 1); - } - }, - dispatchEvent(event) { - const listeners = this.eventListeners[event.type]; - for (let i = 0; i < listeners.length; i++) { - listeners[i](event); - } - }, - }; - } + }, + addEventListener(type, listener, useCapture) { + if (this.eventListeners[type]) { + this.eventListeners[type].push(listener); + } + }, + removeEventListener(type, listener, useCapture) { + if (!(type in this.eventListeners)) { + return; + } + const index = this.eventListeners[type].indexOf(listener); + if (index !== -1) { + this.eventListeners[type].splice(index, 1); + } + }, + dispatchEvent(event) { + const listeners = this.eventListeners[event.type]; + for (let i = 0; i < listeners.length; i++) { + listeners[i](event); + } + }, + }; } + } - const allWorkers = {}; - const cmds = { - newWorker(event) { - const worker = new Worker(event.data.path); - worker.addEventListener("message", (e) => { - const envelope = { - _from: event.data.id, - message: e.data, - }; - event.target.postMessage(envelope); - }); - allWorkers[event.data.id] = worker; - }, - terminate(event) { - allWorkers[event.data.id].terminate(); - }, - passMessage(event) { - allWorkers[event.data.id].postMessage(event.data.message, event.data.transfer); - }, - }; - const messageRecieved = function (event) { - if (event.data._subworker) { - cmds[event.data.cmd](event); - } - }; + const allWorkers = {}; + const cmds = { + newWorker(event) { + const worker = new Worker(event.data.path); + worker.addEventListener("message", (e) => { + const envelope = { + _from: event.data.id, + message: e.data, + }; + event.target.postMessage(envelope); + }); + allWorkers[event.data.id] = worker; + }, + terminate(event) { + allWorkers[event.data.id].terminate(); + }, + passMessage(event) { + allWorkers[event.data.id].postMessage(event.data.message, event.data.transfer); + }, + }; + const messageRecieved = function (event) { + if (event.data._subworker) { + cmds[event.data.cmd](event); + } + }; - /* Hijack Worker */ - const oldWorker = Worker; - Worker = function (path) { - if (this.constructor !== Worker) { - throw new TypeError( - "Failed to construct 'Worker': Please use the 'new' operator, this DOM object constructor cannot be called as a function.", - ); - } + /* Hijack Worker */ + const oldWorker = Worker; + Worker = function (path) { + if (this.constructor !== Worker) { + throw new TypeError( + "Failed to construct 'Worker': Please use the 'new' operator, this DOM object constructor cannot be called as a function.", + ); + } - const blobIndex = path.indexOf("blob:"); + const blobIndex = path.indexOf("blob:"); - if (blobIndex !== -1 && blobIndex !== 0) { - path = path.substring(blobIndex); - } + if (blobIndex !== -1 && blobIndex !== 0) { + path = path.substring(blobIndex); + } - const newWorker = new oldWorker(path); - newWorker.addEventListener("message", messageRecieved); + const newWorker = new oldWorker(path); + newWorker.addEventListener("message", messageRecieved); - return newWorker; - }; - } + return newWorker; + }; })(); +// eslint-enable diff --git a/packages/app/webpack.common.js b/packages/app/webpack.common.js index f45eb1abe..5fde92693 100644 --- a/packages/app/webpack.common.js +++ b/packages/app/webpack.common.js @@ -13,6 +13,7 @@ const envPlugin = new Dotenv({ }); const TARGET = process.env.TARGET || "chrome"; +const MANIFEST_VERSION = process.env.MANIFEST_VERSION || "3"; module.exports = { entry: { @@ -39,10 +40,7 @@ module.exports = { patterns: [ { from: path.resolve(__dirname, "./src/static/icons"), to: path.resolve(__dirname, "./dist/[name][ext]") }, { - from: - TARGET === "firefox" - ? path.resolve(__dirname, `./src/manifest/v2/manifest.${TARGET}.json`) - : path.resolve(__dirname, `./src/manifest/v3/manifest.${TARGET}.json`), + from: path.resolve(__dirname, `./src/manifest/v${MANIFEST_VERSION}/manifest.${TARGET}.json`), to: path.resolve(__dirname, "./dist/manifest.json"), }, { @@ -54,10 +52,6 @@ module.exports = { to: path.resolve(__dirname, "./dist/LICENSE"), }, { from: path.resolve(__dirname, "../../zkeyFiles"), to: path.resolve(__dirname, "./dist/js/zkeyFiles") }, - { - from: path.resolve(__dirname, "./src/background/shared/subworkers.js"), - to: path.resolve(__dirname, "./dist/js/subworkers.js"), - }, ], }), new HtmlWebpackPlugin({