2015-02-05 5 views
4

ServiceWorker - новая api, доступная в Chrome. Одна из многих вещей, которую он позволяет вам сделать, - перехватить сетевые запросы и ответить кешированной версией. Я реализую кнопку «Принять это офлайн», которая динамически добавляет вещи в кеш. Я хотел бы сообщить пользователю, сколько места я использую, и сколько записей я вложил в кеш.Как я могу получить размер и/или количество элементов в кеше ServiceWorker?

Возможно ли запросить кеш, чтобы получить количество элементов в нем? Могу ли я сообщить об общем размере вещей, хранящихся в нем?

+0

Как уже упоминалось в нижеприведенном ответе, вы можете использовать 'cacheName.keys(). Then (function (keys) {keys.length})'. В настоящее время нет способа вычислить размер на диске, но вы можете посмотреть заголовок 'content-size' для каждого ответа, но он не будет точно соответствовать тому, что хранится на диске. (Также некоторые http-серверы не задают размер содержимого правильно.) В этой области есть открытая спецификация с помощью quota-api и на ServiceWorkers: https://github.com/slightlyoff/ServiceWorker/issues/587 –

+1

Спасибо @ BenKelly за ссылку на обсуждение этой проблемы github. Я буду взвешивать свои 2 цента. – Rob

ответ

2

Очевидно, вы можете использовать cacheName.keys().length, как показано на рисунке trained to thrill, вы также можете циклически переключаться на отдельные записи и вычислять общий вес.

+0

Спасибо за ссылку источника github. Я вижу, что это будет работать для моих целей, но похоже, что может быть дорого обойти все элементы в кеше, чтобы добавить размер. В зависимости от реализации кэша это может быть много прочитанных. В идеале объект кеша будет содержать подсчет размера элементов, которые он содержит, и обновлять его, поскольку элементы добавляются и удаляются. – Rob

0

Вы можете сделать что-то вроде следующего, чтобы найти приблизительный размер кэша:

// returns approximate size of a single cache (in bytes) 
 
function cacheSize(c) { 
 
    return c.keys().then(a => { 
 
    return Promise.all(
 
     a.map(req => c.match(req).then(res => res.clone().blob().then(b => b.size))) 
 
    ).then(a => a.reduce((acc, n) => acc + n, 0)); 
 
    }); 
 
} 
 

 
// returns approximate size of all caches (in bytes) 
 
function cachesSize() { 
 
    return caches.keys().then(a => { 
 
    return Promise.all(
 
     a.map(n => caches.open(n).then(c => cacheSize(c))) 
 
    ).then(a => a.reduce((acc, n) => acc + n, 0)); 
 
    }); 
 
}

Там есть несколько предостережений:

  • Графы размером ответа корпус только. (Это может быть частично исправлено.)
  • Подсчет непрозрачных ответов. (Это не может быть исправлено.)