chrome 存储同步分解项目的算法

Algorithm to break down item for chrome storage sync

我正在尝试使用 chrome.storage.sync.set 保存一个字符串(更正:它是一个包含多个不同大小字符串的对象)但我收到错误: 错误:QUOTA_BYTES_PER_ITEM 超出配额

这是由于限制为 8092,所以我想将字符串分解成多个部分,然后在检索它们时能够重建它。

我给出现有错误的代码如下。

 var obj = {};
  obj[workspaceName] = stringToSave;  
  chrome.storage.sync.set(obj, function() {
    if (chrome.runtime.lastError) {
      return customAlert("Error!: " + chrome.runtime.lastError.message);
    }
  });

是否存在可以帮助我执行此操作的现有函数或代码?

写:生成一个像{foo0: chunkA, foo1: chunkB, foo2: chunkC, foo#: 3}.

这样的对象
function chunkedWrite(key, value) {
  return new Promise(resolve => {
    if (typeof key !== 'string') key = `${key}`;
    const str = JSON.stringify(value); // consider using LZString's compressToUTF16
    const len = chrome.storage.sync.QUOTA_BYTES_PER_ITEM - key.length - 4;
    const num = Math.ceil(str.length / len);
    const obj = {};
    obj[key + '#'] = num;
    for (let i = 0; i < num; i++) {
      obj[key + i] = str.substr(i * len, len);
    }
    chrome.storage.sync.set(obj, resolve);
  });
}

读取分为两部分:先读取键数,然后一次读取所有键。

function chunkedRead(key) {
  return new Promise(resolve => {
    if (typeof key !== 'string') key = `${key}`;
    const keyNum = key + '#';
    chrome.storage.sync.get(keyNum, data => {
      const num = data[keyNum];
      const keys = [];
      for (let i = 0; i < num; i++) {
        keys[i] = key + i;
      }
      chrome.storage.sync.get(keys, data => {
        const chunks = [];
        for (let i = 0; i < num; i++) {
          chunks.push(data[key + i] || '');
        }
        const str = chunks.join('');
        resolve(str ? JSON.parse(str) : undefined);
      });
    });
  });
}

删除类似于读取:读取key#,然后删除key数组。

function chunkedDelete(key) {
  return new Promise(resolve => {
    if (typeof key !== 'string') key = `${key}`;
    const keyNum = key + '#';
    chrome.storage.sync.get(keyNum, data => {
      const num = data[keyNum];
      const keys = [keyNum];
      for (let i = 0; i < num; i++) {
        keys.push(key + i);
      }
      chrome.storage.sync.remove(keys, resolve);
    });
  });
}