From 64c12c228684987592b2e68f1ae2f4b88728ec13 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Wed, 16 Feb 2022 14:00:14 -0300 Subject: [PATCH] use a mutex to prevent multiple prompts from opening in loop. --- extension/background.js | 22 ++++++++++++++-------- package.json | 1 + yarn.lock | 12 ++++++++++++ 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/extension/background.js b/extension/background.js index 45e9099..a4d4d9f 100644 --- a/extension/background.js +++ b/extension/background.js @@ -1,6 +1,7 @@ import browser from 'webextension-polyfill' import {validateEvent, signEvent, getEventHash, getPublicKey} from 'nostr-tools' import {encrypt, decrypt} from 'nostr-tools/nip04' +import {Mutex} from 'async-mutex' import { PERMISSIONS_REQUIRED, @@ -8,7 +9,9 @@ import { updatePermission } from './common' -const prompts = {} +let openPrompt = null +let promptMutex = new Mutex() +let releasePromptMutex = () => {} browser.runtime.onMessage.addListener(async (req, sender) => { let {prompt} = req @@ -89,25 +92,28 @@ function handlePromptMessage({id, condition, host, level}, sender) { switch (condition) { case 'forever': case 'expirable': - prompts[id]?.resolve?.() + openPrompt?.resolve?.() updatePermission(host, { level, condition }) break case 'single': - prompts[id]?.resolve?.() + openPrompt?.resolve?.() break case 'no': - prompts[id]?.reject?.() + openPrompt?.reject?.() break } - delete prompts[id] + openPrompt = null + releasePromptMutex() browser.windows.remove(sender.tab.windowId) } -function promptPermission(host, level, params) { +async function promptPermission(host, level, params) { + releasePromptMutex = await promptMutex.acquire() + let id = Math.random().toString().slice(4) let qs = new URLSearchParams({ host, @@ -117,13 +123,13 @@ function promptPermission(host, level, params) { }) return new Promise((resolve, reject) => { + openPrompt = {resolve, reject} + browser.windows.create({ url: `${browser.runtime.getURL('prompt.html')}?${qs.toString()}`, type: 'popup', width: 340, height: 330 }) - - prompts[id] = {resolve, reject} }) } diff --git a/package.json b/package.json index 9f758b6..b6bfc2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "dependencies": { "@esbuild-plugins/node-globals-polyfill": "^0.1.1", + "async-mutex": "^0.3.2", "esbuild": "^0.14.11", "esbuild-plugin-alias": "^0.2.1", "eslint": "^8.6.0", diff --git a/yarn.lock b/yarn.lock index 447862f..52151bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -113,6 +113,13 @@ array.prototype.flatmap@^1.2.5: define-properties "^1.1.3" es-abstract "^1.19.0" +async-mutex@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.3.2.tgz#1485eda5bda1b0ec7c8df1ac2e815757ad1831df" + integrity sha512-HuTK7E7MT7jZEh1P9GtRW9+aTWiDWWi9InbZ5hjxrnRa39KS4BW04+xLBhYNS2aXhHUIKZSw3gj4Pn1pj+qGAA== + dependencies: + tslib "^2.3.1" + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1404,6 +1411,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +tslib@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tstl@^2.0.7: version "2.5.2" resolved "https://registry.yarnpkg.com/tstl/-/tstl-2.5.2.tgz#655ae93192e4c18ac74495cea2bf862159775cd9"