+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* unused harmony export evictStatus */
+/* unused harmony export evictStatuses */
+/* unused harmony export putAccounts */
+/* unused harmony export putStatuses */
+/* harmony export (immutable) */ __webpack_exports__["a"] = freeStorage;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__db__ = __webpack_require__(3);
+
+
+var accountAssetKeys = ['avatar', 'avatar_static', 'header', 'header_static'];
+var storageMargin = 8388608;
+var storeLimit = 1024;
+
+function openCache() {
+ // ServiceWorker and Cache API is not available on iOS 11
+ // https://webkit.org/status/#specification-service-workers
+ return self.caches ? caches.open('mastodon-system') : Promise.reject();
+}
+
+function printErrorIfAvailable(error) {
+ if (error) {
+ console.warn(error);
+ }
+}
+
+function put(name, objects, onupdate, oncreate) {
+ return Object(__WEBPACK_IMPORTED_MODULE_0__db__["a" /* default */])().then(function (db) {
+ return new Promise(function (resolve, reject) {
+ var putTransaction = db.transaction(name, 'readwrite');
+ var putStore = putTransaction.objectStore(name);
+ var putIndex = putStore.index('id');
+
+ objects.forEach(function (object) {
+ putIndex.getKey(object.id).onsuccess = function (retrieval) {
+ function addObject() {
+ putStore.add(object);
+ }
+
+ function deleteObject() {
+ putStore.delete(retrieval.target.result).onsuccess = addObject;
+ }
+
+ if (retrieval.target.result) {
+ if (onupdate) {
+ onupdate(object, retrieval.target.result, putStore, deleteObject);
+ } else {
+ deleteObject();
+ }
+ } else {
+ if (oncreate) {
+ oncreate(object, addObject);
+ } else {
+ addObject();
+ }
+ }
+ };
+ });
+
+ putTransaction.oncomplete = function () {
+ var readTransaction = db.transaction(name, 'readonly');
+ var readStore = readTransaction.objectStore(name);
+ var count = readStore.count();
+
+ count.onsuccess = function () {
+ var excess = count.result - storeLimit;
+
+ if (excess > 0) {
+ var retrieval = readStore.getAll(null, excess);
+
+ retrieval.onsuccess = function () {
+ return resolve(retrieval.result);
+ };
+ retrieval.onerror = reject;
+ } else {
+ resolve([]);
+ }
+ };
+
+ count.onerror = reject;
+ };
+
+ putTransaction.onerror = reject;
+ }).then(function (resolved) {
+ db.close();
+ return resolved;
+ }, function (error) {
+ db.close();
+ throw error;
+ });
+ });
+}
+
+function evictAccountsByRecords(records) {
+ return Object(__WEBPACK_IMPORTED_MODULE_0__db__["a" /* default */])().then(function (db) {
+ var transaction = db.transaction(['accounts', 'statuses'], 'readwrite');
+ var accounts = transaction.objectStore('accounts');
+ var accountsIdIndex = accounts.index('id');
+ var accountsMovedIndex = accounts.index('moved');
+ var statuses = transaction.objectStore('statuses');
+ var statusesIndex = statuses.index('account');
+
+ function evict(toEvict) {
+ toEvict.forEach(function (record) {
+ openCache().then(function (cache) {
+ return accountAssetKeys.forEach(function (key) {
+ return cache.delete(records[key]);
+ });
+ }).catch(printErrorIfAvailable);
+
+ accountsMovedIndex.getAll(record.id).onsuccess = function (_ref) {
+ var target = _ref.target;
+ return evict(target.result);
+ };
+
+ statusesIndex.getAll(record.id).onsuccess = function (_ref2) {
+ var target = _ref2.target;
+ return evictStatusesByRecords(target.result);
+ };
+
+ accountsIdIndex.getKey(record.id).onsuccess = function (_ref3) {
+ var target = _ref3.target;
+ return target.result && accounts.delete(target.result);
+ };
+ });
+ }
+
+ evict(records);
+
+ db.close();
+ }).catch(printErrorIfAvailable);
+}
+
+function evictStatus(id) {
+ evictStatuses([id]);
+}
+
+function evictStatuses(ids) {
+ return Object(__WEBPACK_IMPORTED_MODULE_0__db__["a" /* default */])().then(function (db) {
+ var transaction = db.transaction('statuses', 'readwrite');
+ var store = transaction.objectStore('statuses');
+ var idIndex = store.index('id');
+ var reblogIndex = store.index('reblog');
+
+ ids.forEach(function (id) {
+ reblogIndex.getAllKeys(id).onsuccess = function (_ref4) {
+ var target = _ref4.target;
+ return target.result.forEach(function (reblogKey) {
+ return store.delete(reblogKey);
+ });
+ };
+
+ idIndex.getKey(id).onsuccess = function (_ref5) {
+ var target = _ref5.target;
+ return target.result && store.delete(target.result);
+ };
+ });
+
+ db.close();
+ }).catch(printErrorIfAvailable);
+}
+
+function evictStatusesByRecords(records) {
+ return evictStatuses(records.map(function (_ref6) {
+ var id = _ref6.id;
+ return id;
+ }));
+}
+
+function putAccounts(records, avatarStatic) {
+ var avatarKey = avatarStatic ? 'avatar_static' : 'avatar';
+ var newURLs = [];
+
+ put('accounts', records, function (newRecord, oldKey, store, oncomplete) {
+ store.get(oldKey).onsuccess = function (_ref7) {
+ var target = _ref7.target;
+
+ accountAssetKeys.forEach(function (key) {
+ var newURL = newRecord[key];
+ var oldURL = target.result[key];
+
+ if (newURL !== oldURL) {
+ openCache().then(function (cache) {
+ return cache.delete(oldURL);
+ }).catch(printErrorIfAvailable);
+ }
+ });
+
+ var newURL = newRecord[avatarKey];
+ var oldURL = target.result[avatarKey];
+
+ if (newURL !== oldURL) {
+ newURLs.push(newURL);
+ }
+
+ oncomplete();
+ };
+ }, function (newRecord, oncomplete) {
+ newURLs.push(newRecord[avatarKey]);
+ oncomplete();
+ }).then(function (records) {
+ return Promise.all([evictAccountsByRecords(records), openCache().then(function (cache) {
+ return cache.addAll(newURLs);
+ })]);
+ }).then(freeStorage, function (error) {
+ freeStorage();
+ throw error;
+ }).catch(printErrorIfAvailable);
+}
+
+function putStatuses(records) {
+ put('statuses', records).then(evictStatusesByRecords).catch(printErrorIfAvailable);
+}
+
+function freeStorage() {
+ return navigator.storage.estimate().then(function (_ref8) {
+ var quota = _ref8.quota,
+ usage = _ref8.usage;
+
+ if (usage + storageMargin < quota) {
+ return null;
+ }
+
+ return Object(__WEBPACK_IMPORTED_MODULE_0__db__["a" /* default */])().then(function (db) {
+ return new Promise(function (resolve, reject) {
+ var retrieval = db.transaction('accounts', 'readonly').objectStore('accounts').getAll(null, 1);
+
+ retrieval.onsuccess = function () {
+ if (retrieval.result.length > 0) {
+ resolve(evictAccountsByRecords(retrieval.result).then(freeStorage));
+ } else {
+ resolve(caches.delete('mastodon-system'));
+ }
+ };
+
+ retrieval.onerror = reject;
+
+ db.close();
+ });
+ });
+ });
+}
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = (function () {
+ return new Promise(function (resolve, reject) {
+ // ServiceWorker is required to synchronize the login state.
+ // Microsoft Edge 17 does not support getAll according to:
+ // Catalog of standard and vendor APIs across browsers - Microsoft Edge Development
+ // https://developer.microsoft.com/en-us/microsoft-edge/platform/catalog/?q=specName%3Aindexeddb
+ if (!('caches' in self && 'getAll' in IDBObjectStore.prototype)) {
+ reject();
+ return;
+ }
+
+ var request = indexedDB.open('mastodon');
+
+ request.onerror = reject;
+ request.onsuccess = function (_ref) {
+ var target = _ref.target;
+ return resolve(target.result);
+ };
+
+ request.onupgradeneeded = function (_ref2) {
+ var target = _ref2.target;
+
+ var accounts = target.result.createObjectStore('accounts', { autoIncrement: true });
+ var statuses = target.result.createObjectStore('statuses', { autoIncrement: true });
+
+ accounts.createIndex('id', 'id', { unique: true });
+ accounts.createIndex('moved', 'moved');
+
+ statuses.createIndex('id', 'id', { unique: true });
+ statuses.createIndex('account', 'account');
+ statuses.createIndex('reblog', 'reblog');
+ };
+ });
+});
+
+/***/ }),
+/* 4 */