Как хранить ArrayBuffers в веб-расширении браузера? - PullRequest
0 голосов
/ 11 июля 2019

Иногда расширения браузера должны сохранять некоторые данные, для которых MDN предлагает использовать интерфейс browser.storage.<StorageArea> (см. здесь ).Однако он говорит:

Значения могут быть примитивными типами (такими как числа, логические значения и строки) или типами массивов.

Как правило, невозможно хранить другие типы, такие как функция, Date, RegExp, Set, Map, ArrayBuffer и так далее.Некоторые из этих неподдерживаемых типов восстанавливаются как пустой объект, а некоторые вызывают set () для выдачи ошибки.Точное поведение здесь зависит от браузера.

(см .: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageArea/set)

Поскольку данные, которые я пытаюсь сохранить, представляют собой ArrayBuffers, которые содержат двоичные данные, мне интересноесли есть способ хранения таких двоичных данных, , отличных от , для преобразования их туда и обратно в промежуточное строковое представление?

с этот вопрос , которыйспрашивает также о том, как сохранить / сохранить ArrayBuffers с использованием IndexedDB, я испытываю желание поверить, что возможно использовать интерфейс IndexedDB, но я не уверен:

  1. На данный момент это самый высокий оцененный ответ действительно говорит, что ArrayBuffers должно работать из-за их структурированной ситуации клонирования.Но даже этот ответ подвергается сомнению из-за неясной / недостающей спецификации / стандарта / ссылки.
  2. MDN намекает на использование browser.storage.local над другими API-интерфейсами для сохранения данных, такими как, например, localStorage, поскольку последний более склонен к его использованию.данные удаляются.

Хотя этот API * [browser.storage.local] (аналогичен Window.localStorage, рекомендуется не использовать Window.localStorage в коде расширения.Firefox удалит данные, сохраненные расширениями, используя API localStorage в различных сценариях, когда пользователи очищают свою историю посещений и данные из соображений конфиденциальности, тогда как данные, сохраненные с помощью API storage.local, будут правильно сохраняться в этих сценариях.

Что заставляет меня сомневаться и в надежности IndexedDB.

Однако я не могу, но думаю, что было бы довольно скучно, если в веб-расширениях не было бы способа хранить двоичные данные. Поэтому вопрос:

** Как веб-расширения должны хранить двоичные данные, такие как ArrayBuffers? **

ОБНОВЛЕНИЕ

Помимо цитируемого предупреждения от MDN представляется возможным хранить ArrayBuffers без каких-либо проблем, подобных этой:

var u8array = new Uint8Array(100);
for(var i=0;i<u8array.length;i++)u8array[i]=i;
var storedPromise = 
   browser.storage.local.set({"u8arraybuffer":u8array.buffer});
storedPromise.then(()=>{
   browser.storage.local.get("u8arraybuffer").then((result)=>{
       var u8arrayFromStorage = new Uint8Array(result.u8arraybuffer);
       console.log("u8arrayFromStorage",u8arrayFromStorage);
       // prints:
       // u8arrayFromStorage 
       // Uint8Array(100) [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, … ]
   });      
});

что, по-видимому, говорит о том, что действительно нет никаких проблем (или больше) для хранения ArrayBuffer в browser.storage.local API.Может быть, ответ поможет подтвердить, что, несмотря на предупреждения MDN, вполне возможно / допустимо хранить ArrayBuffer s через browser.storage.<StorageArea>

...