1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
import { writable } from 'svelte/store';
import { initSearch } from './search';
import { initDeck } from './deck';
import { setCardDb, setAltId } from './card_db';
import idChangelog from './id_changelog.json';
let isLoading = writable(true);
async function noCacheFetch(url) {
const timestamp = new Date().getTime();
return fetch(url + '?t=' + timestamp);
}
const DB_NAME = 'CardDatabase';
const STORE_NAME = 'cardStore';
async function openidxdb() {
return new Promise((resolve, reject) => {
const request = indexedDB.open(DB_NAME, 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
if (!db.objectStoreNames.contains(STORE_NAME)) {
db.createObjectStore(STORE_NAME);
}
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
async function getidxdbitem(key) {
let db = await openidxdb();
return new Promise((resolve, reject) => {
const transaction = db.transaction(STORE_NAME, 'readonly');
const store = transaction.objectStore(STORE_NAME);
const request = store.get(key);
request.onsuccess = () => resolve(request.result);
request.onerror = () => resolve(null);
});
}
async function setidxdbitem(key, value) {
const db = await openidxdb();
return new Promise((resolve, reject) => {
const transaction = db.transaction(STORE_NAME, 'readwrite');
const store = transaction.objectStore(STORE_NAME);
const request = store.put(value, key);
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
}
async function fetchCardDb() {
let localVer = localStorage.getItem('card_db_ver');
try {
// load card db
let response = await noCacheFetch("https://raye.mistivia.com/card_db_parts/version.json");
if (!response.ok) {
throw new Error('Network response was not ok');
}
let data = await response.json();
data = String(data)
if (localVer === data && await getidxdbitem('card_db') !== null) {
setCardDb(JSON.parse(await getidxdbitem('card_db')));
} else {
localVer = data;
response = await noCacheFetch("https://raye.mistivia.com/card_db_parts/index.json");
if (!response.ok) {
throw new Error('Network response was not ok');
}
data = await response.json();
let tasks = data.map((i)=>noCacheFetch('https://raye.mistivia.com/card_db_parts/' + i));
let datas = await Promise.all(tasks);
datas = await Promise.all(datas.map((x) => x.text()));
data = JSON.parse(datas.join(''));
setCardDb(data);
localStorage.setItem('card_db_ver', localVer);
await setidxdbitem('card_db', datas.join(''));
}
setAltId(idChangelog);
} catch (error) {
console.log(error);
alert("加载失败!请刷新重试");
return;
}
isLoading.set(false);
initDeck();
initSearch();
}
fetchCardDb();
export {
isLoading,
};
|