Search code examples
javascriptnode.jsgoogle-chrome-extensionindexeddbchrome-extension-manifest-v3

Sometime indexedDB takes so much to store the data


I am facing one weird issue while working with indexedDB. Whenever I install another extension, sometimes indexedDB takes so much of time to write the data into db. I tried to fix this issue by using indexedDB API and a library based on indexedDB but nothing seems to work.

Here is the code I am using

function updateRecord({
  sessionId,
  ...record
}) {
  return new Promise(async(resolve, reject) => {
    try {
      console.log(
        '%c Inside update record ',
        'background: #222; color: #bada55'
      );
      const dbPromise = await idb.openDB('testbuddyExtension', 1, {
        upgrade(db) {
          const store = db.createObjectStore('testbuddy', {
            keyPath: 'sessionId',
          });
          store.createIndex('keyIndex', 'tabId');
        },
      });

      const existingRecord = await dbPromise.get('testbuddy', sessionId);

      const updatedPayload = {
        ...record,
        ...(existingRecord ? existingRecord : {}),
      };

      await dbPromise.put('testbuddy', { ...updatedPayload,
        sessionId
      });
      console.log(
        '%c Everything is now done! ',
        'background: #222; color: #bada55'
      );
      resolve(true);
    } catch (error) {
      console.log('%c Error found! ', 'background: #222; color: #bada55');
      console.log({
        error
      });
      reject(false);
    }
  });
}

And here is a video that might help you understand. Also, it is not the case that it is slowing down because I am writing a whole lot of data at once. I have used the same script to write down megabytes of data at once.


Solution

  • This issue is resolved now. As you can see in the video, when I enabled another extension, my extension raised some errors. And that was because I was running some script whenever the extension is enabled. And I forgot to mention the extension id.

    chrome.management.onEnabled.addListener(() => {
      //This code was running whenever any extension is installed
      destroyDatabase().catch((error) => {
        console.error('Failed to delete database', error);
      });
      reExecuteScript();
    });

    And this is how it should be done.

    chrome.management.onEnabled.addListener((data) => {
      if (data.id === chrome.runtime.id) {
        destroyDatabase().catch((error) => {
          console.error('Failed to delete database', error);
        });
        reExecuteScript();
      }
    });