I have a code like below in my MV3 extension:
import _ from 'lodash';
const storageKey = 'state';
let state;
(async () => {
state = await chrome.storage.local.get(storageKey);
listener();
})();
const update = async (data) => {
await chrome.storage.local.set({[storageKey]: data});
}
let lastPick;
const listener = async () => {
const pick = _.pick(state, ...);
if (_.isEqual(pick, lastPick))
return;
lastPick = pick;
...
// do some stuff
}
chrome.storage.onChanged.addListener((changes, area) => {
if (area !== 'local' || !(storageKey in changes))
return;
const {newValue} = changes[storageKey];
state = newValue;
listener();
});
chrome.tabs.onActivated.addListener(async (data) => {
...
update(...);
...
update(...);
...
update(...);
});
With classic Manifest V2 extension I could be sure that value of lastPick
will be always persisted through listener
calls (which in turn caused by multiple update
calls), so "some stuff" logic within listener
won't be broken.
But what about Manifest V3, or to be more precise, its service workers? Can I be confident the above logic won't be broken there?