|
@@ -30,8 +30,10 @@
|
|
|
this.onDbReady(evt.target.result);
|
|
this.onDbReady(evt.target.result);
|
|
|
};
|
|
};
|
|
|
});
|
|
});
|
|
|
- MediaStorage.Instance.addEventListener("doneLoading", (evt) => {
|
|
|
|
|
- this.pushMedias(MediaStorage.Instance.medias, MediaStorage.Instance.getDbVersion());
|
|
|
|
|
|
|
+ MediaStorage.Instance.addEventListener("doneLoading", async evt => {
|
|
|
|
|
+ await this.pushMedias(MediaStorage.Instance.medias, MediaStorage.Instance.getDbVersion());
|
|
|
|
|
+ let removed = await this.removeObsolete();
|
|
|
|
|
+ removed.length && MediaStorage.Instance.removeMedia(removed);
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -87,6 +89,54 @@
|
|
|
return { medias: data, version: data.length ? this.#version : 0 };
|
|
return { medias: data, version: data.length ? this.#version : 0 };
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ allKeyCount() {
|
|
|
|
|
+ return new Promise(async ok => {
|
|
|
|
|
+ let count = 0;
|
|
|
|
|
+ let transaction = this.#db.transaction([INDEXEDCACHE_DATABASE_NAME], IDBTransaction.READ);
|
|
|
|
|
+ transaction.oncomplete = () => ok(count);
|
|
|
|
|
+ transaction.onerror = () => ok(count);
|
|
|
|
|
+ count = (await (new Promise(okKey => {
|
|
|
|
|
+ let req = transaction.objectStore(INDEXEDCACHE_DATABASE_NAME).getAllKeys();
|
|
|
|
|
+ req.onsuccess = evt => {
|
|
|
|
|
+ okKey(req?.result || []);
|
|
|
|
|
+ }
|
|
|
|
|
+ }))).length;
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ #getObsoleteKeys() {
|
|
|
|
|
+ return new Promise((ok, ko) => {
|
|
|
|
|
+ $.get(`/api/media/sumlist`, async srvKeys => {
|
|
|
|
|
+ let transaction = this.#db.transaction([INDEXEDCACHE_DATABASE_NAME], IDBTransaction.READ);
|
|
|
|
|
+ let obsoleteIndexes = [];
|
|
|
|
|
+ transaction.oncomplete = () => ok(obsoleteIndexes);
|
|
|
|
|
+ transaction.onerror = () => ok(obsoleteIndexes);
|
|
|
|
|
+ obsoleteIndexes = (await (new Promise((okLocalKey) => {
|
|
|
|
|
+ let req = transaction.objectStore(INDEXEDCACHE_DATABASE_NAME).getAllKeys();
|
|
|
|
|
+ req.onsuccess = evt => {
|
|
|
|
|
+ okLocalKey(req?.result || []);
|
|
|
|
|
+ }
|
|
|
|
|
+ }))).filter(i => srvKeys.data.indexOf(i) === -1);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ async removeObsolete() {
|
|
|
|
|
+ await this.#openReq;
|
|
|
|
|
+ if (!this.#db)
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ let obsoleteIndexes = await this.#getObsoleteKeys();
|
|
|
|
|
+ for (let i of obsoleteIndexes)
|
|
|
|
|
+ await new Promise((ok, ko) => {
|
|
|
|
|
+ let transaction = this.#db.transaction([INDEXEDCACHE_DATABASE_NAME], IDBTransaction.READ_WRITE);
|
|
|
|
|
+ transaction.oncomplete = ok;
|
|
|
|
|
+ transaction.onerror = ko;
|
|
|
|
|
+ transaction.objectStore(INDEXEDCACHE_DATABASE_NAME).delete(i);
|
|
|
|
|
+ });
|
|
|
|
|
+ return obsoleteIndexes;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
async pushMedias(mediaArr, version) {
|
|
async pushMedias(mediaArr, version) {
|
|
|
await this.#openReq;
|
|
await this.#openReq;
|
|
|
if (!this.#db)
|
|
if (!this.#db)
|