@gudhub/core 1.2.4-beta.16 → 1.2.4-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/GUDHUB/DataService/AppDataService.js +4 -0
- package/GUDHUB/DataService/IndexedDB/IndexedDBAppService.js +312 -60
- package/GUDHUB/DataService/IndexedDB/IndexedDBChunkService.js +61 -47
- package/GUDHUB/DataService/IndexedDB/IndexedDBService.js +327 -2
- package/GUDHUB/DataService/IndexedDB/StoreManager/BaseStoreManager.js +111 -0
- package/GUDHUB/DataService/IndexedDB/StoreManager/managers.js +79 -0
- package/GUDHUB/DataService/IndexedDB/appDataConf.js +3 -3
- package/GUDHUB/DataService/IndexedDB/chunkDataConf.js +3 -3
- package/GUDHUB/DataService/IndexedDB/consts.js +3 -1
- package/GUDHUB/DataService/IndexedDB/init.js +14 -13
- package/GUDHUB/DataService/IndexedDB/storeManagerConf/chunkCacheStoreManagerConf.js +11 -0
- package/GUDHUB/DataService/IndexedDB/storeManagerConf/init.js +1 -0
- package/GUDHUB/DataService/export.js +3 -0
- package/package.json +1 -1
- package/umd/appRequestWorker.js +1 -1
- package/umd/library.min.js +1 -1
|
@@ -1,9 +1,334 @@
|
|
|
1
|
+
import { appsConf } from "./appDataConf.js";
|
|
2
|
+
import { chunksConf } from "./chunkDataConf.js";
|
|
3
|
+
import { dbName, dbVersion } from "./consts.js";
|
|
4
|
+
import { chunksMergeConf } from "./storeManagerConf/chunkCacheStoreManagerConf.js";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
// этот класс для наследования был создан, т.е. надо подумать как его скомпоновать с IndexedDBManager
|
|
1
8
|
export class IndexedDBService {
|
|
2
9
|
constructor(conf) {
|
|
3
10
|
this.store = conf.store;
|
|
4
11
|
this.dbName = conf.dbName;
|
|
5
12
|
this.dbVersion = conf.dbVersion;
|
|
6
13
|
|
|
7
|
-
this.requestCache = new Map; // id -> promise
|
|
14
|
+
this.requestCache = new Map; // id -> promise ///TODO seems irrelevant to class IndexedDBManager (could be renamed to Facade already)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
//Maybe rename to Facade
|
|
20
|
+
export class IndexedDBManager {
|
|
21
|
+
constructor(
|
|
22
|
+
dbName,
|
|
23
|
+
// dbVersion,
|
|
24
|
+
storeNameList,
|
|
25
|
+
) {
|
|
26
|
+
if (
|
|
27
|
+
!IndexedDBManager.dbNameToInstanceMap
|
|
28
|
+
) {
|
|
29
|
+
IndexedDBManager.dbNameToInstanceMap = new Map;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (
|
|
33
|
+
IndexedDBManager.dbNameToInstanceMap.has(dbName)
|
|
34
|
+
) return IndexedDBManager.dbNameToInstanceMap.get(dbName);
|
|
35
|
+
|
|
36
|
+
this.db = null;
|
|
37
|
+
// this.queue = [];
|
|
38
|
+
// this.isProcessing = false;
|
|
39
|
+
|
|
40
|
+
this.dbName = dbName;
|
|
41
|
+
// this.dbVersion = dbVersion;
|
|
42
|
+
this.storeNameList = storeNameList;
|
|
43
|
+
// this.storeNameList = [];
|
|
44
|
+
|
|
45
|
+
IndexedDBManager.dbNameToInstanceMap.set(dbName, this);
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
// this.db = new Promise((resolve, reject) => {
|
|
49
|
+
|
|
50
|
+
// });
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
// this.db = this.openDB();
|
|
54
|
+
|
|
55
|
+
// this
|
|
56
|
+
|
|
57
|
+
// this.openDB();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// TODO also remove outdated stores
|
|
61
|
+
async checkAndCreateStore(storeName) {
|
|
62
|
+
const databases = await indexedDB.databases();
|
|
63
|
+
const dbInfo = databases.find(db => db.name === this.dbName);
|
|
64
|
+
|
|
65
|
+
let storeExists = false;
|
|
66
|
+
|
|
67
|
+
let self = this;
|
|
68
|
+
|
|
69
|
+
if (
|
|
70
|
+
dbInfo
|
|
71
|
+
) {
|
|
72
|
+
storeExists = await new Promise((resolve, reject) => {
|
|
73
|
+
const request = indexedDB.open(self.dbName);
|
|
74
|
+
|
|
75
|
+
request.onsuccess = function(event) {
|
|
76
|
+
const db = event.target.result;
|
|
77
|
+
const exists = db.objectStoreNames.contains(storeName);
|
|
78
|
+
db.close();
|
|
79
|
+
resolve(exists);
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
request.onerror = function(event) {
|
|
83
|
+
reject(event.target.error);
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
//TODO try catch for promise reject
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (
|
|
91
|
+
!storeExists
|
|
92
|
+
) {
|
|
93
|
+
return new Promise((resolve, reject) => {
|
|
94
|
+
const request = indexedDB.open(self.dbName, dbInfo ? dbInfo.version + 1 : 1);
|
|
95
|
+
|
|
96
|
+
request.onupgradeneeded = function(event) {
|
|
97
|
+
const db = event.target.result;
|
|
98
|
+
if (
|
|
99
|
+
!db.objectStoreNames.contains(storeName)
|
|
100
|
+
) {
|
|
101
|
+
db.createObjectStore(storeName);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
request.onsuccess = function(event) {
|
|
106
|
+
const db = event.target.result;
|
|
107
|
+
db.close();
|
|
108
|
+
resolve();
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
request.onerror = reject;
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
//TODO try catch for reject
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//TODO maybe not return anything it will be ok for promise resolve
|
|
119
|
+
return true;
|
|
8
120
|
}
|
|
9
|
-
|
|
121
|
+
|
|
122
|
+
// // Usage example
|
|
123
|
+
// checkAndCreateStore('myDatabase', 'myObjectStore').then(() => {
|
|
124
|
+
// console.log('Check and creation (if necessary) complete.');
|
|
125
|
+
// }).catch(error => {
|
|
126
|
+
// console.error('Error checking and creating object store:', error);
|
|
127
|
+
// });
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
async openDB() {
|
|
131
|
+
|
|
132
|
+
// TODO remove outdated stores before also
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
if (this.db) return this.db;
|
|
136
|
+
|
|
137
|
+
for (let storeName of this.storeNameList) {
|
|
138
|
+
await this.checkAndCreateStore(storeName);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
let self = this;
|
|
144
|
+
|
|
145
|
+
return new Promise((resolve, reject) => {
|
|
146
|
+
// const request = indexedDB.open(this.dbName, this.dbVersion);
|
|
147
|
+
const request = indexedDB.open(self.dbName);
|
|
148
|
+
|
|
149
|
+
// request.onupgradeneeded = (event) => {
|
|
150
|
+
// const db = event.target.result;
|
|
151
|
+
|
|
152
|
+
// this.storeNameList.forEach(storeName => {
|
|
153
|
+
// if (
|
|
154
|
+
// !db.objectStoreNames.contains(storeName)
|
|
155
|
+
// ) {
|
|
156
|
+
// db.createObjectStore(storeName);
|
|
157
|
+
// }
|
|
158
|
+
// });
|
|
159
|
+
// };
|
|
160
|
+
|
|
161
|
+
request.onsuccess = (event) => {
|
|
162
|
+
self.db = event.target.result;
|
|
163
|
+
|
|
164
|
+
// let version = this.db.version;
|
|
165
|
+
|
|
166
|
+
resolve(self.db);
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
request.onerror = reject;
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async executeOperation(storeName, operation) {
|
|
174
|
+
|
|
175
|
+
await this.openDB();
|
|
176
|
+
|
|
177
|
+
// if (
|
|
178
|
+
// !this.db
|
|
179
|
+
// ) {
|
|
180
|
+
// throw new Error("Database not initialized. Call openDB first.");
|
|
181
|
+
// }
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
// await this.db;
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
let self = this;
|
|
188
|
+
|
|
189
|
+
// await this.db;
|
|
190
|
+
|
|
191
|
+
return new Promise((resolve, reject) => {
|
|
192
|
+
const transaction = self.db.transaction(storeName, 'readwrite'); //TODO not all operations readwrite
|
|
193
|
+
const store = transaction.objectStore(storeName);
|
|
194
|
+
|
|
195
|
+
transaction.oncomplete = () => resolve();
|
|
196
|
+
transaction.onerror = (event) => reject(`Transaction failed: ${event.target.error}`);
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
operation(store);
|
|
200
|
+
} catch (error) {
|
|
201
|
+
reject(`Operation failed: ${error.message}`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
// в инете пишут что индексдб сам хендлит транзакции, может не нужно вообще городить эти конструкции
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
// async enqueueOperation(storeName, type, operation) {
|
|
211
|
+
// await this.ensureStoreExists(storeName); // Ensure the store exists <-----------------------
|
|
212
|
+
// const db = await this.dbPromise;
|
|
213
|
+
// return new Promise((resolve, reject) => {
|
|
214
|
+
// const transaction = db.transaction(storeName, type);
|
|
215
|
+
// const store = transaction.objectStore(storeName);
|
|
216
|
+
// const request = operation(store);
|
|
217
|
+
|
|
218
|
+
// request.onsuccess = (event) => {
|
|
219
|
+
// resolve(event.target.result);
|
|
220
|
+
// };
|
|
221
|
+
|
|
222
|
+
// request.onerror = (event) => {
|
|
223
|
+
// reject(event.target.error);
|
|
224
|
+
// };
|
|
225
|
+
// });
|
|
226
|
+
// }
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
async enqueueOperation(storeName, operation) {
|
|
230
|
+
this.queue.push({ storeName, operation });
|
|
231
|
+
|
|
232
|
+
if (!this.isProcessing) {
|
|
233
|
+
this.isProcessing = true;
|
|
234
|
+
while (this.queue.length > 0) {
|
|
235
|
+
const { storeName, operation } = this.queue.shift();
|
|
236
|
+
try {
|
|
237
|
+
await this.executeOperation(storeName, operation);
|
|
238
|
+
} catch (error) {
|
|
239
|
+
console.error('Operation failed:', error);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
this.isProcessing = false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// единственное что тут не нравится - версия динамически меняется
|
|
247
|
+
async ensureStoreExists(storeName) {
|
|
248
|
+
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
// async ensureStoreExists(storeName) {
|
|
253
|
+
// const db = await this.dbPromise;
|
|
254
|
+
// if (!db.objectStoreNames.contains(storeName)) {
|
|
255
|
+
// this.db.close();
|
|
256
|
+
// const version = db.version + 1;
|
|
257
|
+
// const request = indexedDB.open(this.dbName, version);
|
|
258
|
+
|
|
259
|
+
// request.onupgradeneeded = (event) => {
|
|
260
|
+
// const upgradedDb = event.target.result;
|
|
261
|
+
// if (!upgradedDb.objectStoreNames.contains(storeName)) {
|
|
262
|
+
// upgradedDb.createObjectStore(storeName, { keyPath: 'id', autoIncrement: true });
|
|
263
|
+
// }
|
|
264
|
+
// };
|
|
265
|
+
|
|
266
|
+
// return new Promise((resolve, reject) => {
|
|
267
|
+
// request.onsuccess = (event) => {
|
|
268
|
+
// this.db = event.target.result;
|
|
269
|
+
// this.dbPromise = Promise.resolve(this.db); // Update the dbPromise
|
|
270
|
+
// resolve(this.db);
|
|
271
|
+
// };
|
|
272
|
+
|
|
273
|
+
// request.onerror = (event) => {
|
|
274
|
+
// reject(event.target.error);
|
|
275
|
+
// };
|
|
276
|
+
// });
|
|
277
|
+
// }
|
|
278
|
+
// return Promise.resolve(db);
|
|
279
|
+
// }
|
|
280
|
+
|
|
281
|
+
async createObjectStore(storeName) {
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
// async createObjectStore(storeName) {
|
|
285
|
+
// const db = await this.dbPromise;
|
|
286
|
+
// if (!db.objectStoreNames.contains(storeName)) {
|
|
287
|
+
// db.close();
|
|
288
|
+
// const version = db.version + 1;
|
|
289
|
+
// const request = indexedDB.open(this.dbName, version);
|
|
290
|
+
|
|
291
|
+
// request.onupgradeneeded = (event) => {
|
|
292
|
+
// const upgradedDb = event.target.result;
|
|
293
|
+
// if (!upgradedDb.objectStoreNames.contains(storeName)) {
|
|
294
|
+
// upgradedDb.createObjectStore(storeName, { keyPath: 'id', autoIncrement: true });
|
|
295
|
+
// }
|
|
296
|
+
// };
|
|
297
|
+
|
|
298
|
+
// return new Promise((resolve, reject) => {
|
|
299
|
+
// request.onsuccess = (event) => {
|
|
300
|
+
// this.db = event.target.result;
|
|
301
|
+
// resolve(this.db);
|
|
302
|
+
// };
|
|
303
|
+
|
|
304
|
+
// request.onerror = (event) => {
|
|
305
|
+
// reject(event.target.error);
|
|
306
|
+
// };
|
|
307
|
+
// });
|
|
308
|
+
// }
|
|
309
|
+
// return Promise.resolve(db);
|
|
310
|
+
// }
|
|
311
|
+
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
export const gudhubIndexedDBManager = new IndexedDBManager(
|
|
316
|
+
dbName,
|
|
317
|
+
// dbVersion,
|
|
318
|
+
[
|
|
319
|
+
appsConf.store,
|
|
320
|
+
chunksConf.store,
|
|
321
|
+
chunksMergeConf.store,
|
|
322
|
+
],
|
|
323
|
+
);
|
|
324
|
+
|
|
325
|
+
// export default dbManager;
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
// последний ответ посмотри, там я спрашивал можно ли не закрывать и открывать дб из каждого сторменеджера
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
// await this.ensureStoreExists(storeName); // Ensure the store exists - вот этот код вроде ок, т.е. перед выполнением след операции проверка
|
|
333
|
+
|
|
334
|
+
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export class BaseStoreManager {
|
|
2
|
+
// constructor(dbManager, dbName, storeName) {
|
|
3
|
+
constructor(dbManager, storeName) {
|
|
4
|
+
this.dbManager = dbManager;
|
|
5
|
+
// this.dbName = dbName;
|
|
6
|
+
this.storeName = storeName;
|
|
7
|
+
// this.dbManager.openDB(this.dbName, [this.storeName]);
|
|
8
|
+
// this.dbManager.ensureStoreExists(this.storeName);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
async addItem(id, data) {
|
|
12
|
+
return new Promise(async (resolve, reject) => {
|
|
13
|
+
|
|
14
|
+
this.dbManager.executeOperation(this.storeName, (store) => {
|
|
15
|
+
const request = store.add(data, id);
|
|
16
|
+
|
|
17
|
+
request.onsuccess = resolve;
|
|
18
|
+
request.onerror = reject;
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async hasItem(id) {
|
|
25
|
+
|
|
26
|
+
// debugger
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
let item = await this.getItem(id);
|
|
30
|
+
|
|
31
|
+
if (!item) return false;
|
|
32
|
+
|
|
33
|
+
return true;
|
|
34
|
+
} catch(e) {
|
|
35
|
+
//todo check error type and then rethrow maybe here
|
|
36
|
+
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return new Promise(async (resolve, reject) => {
|
|
41
|
+
|
|
42
|
+
this.dbManager.executeOperation(this.storeName, (store) => {
|
|
43
|
+
const request = store.get(id);
|
|
44
|
+
|
|
45
|
+
request.onsuccess = () => {
|
|
46
|
+
const data = request.result;
|
|
47
|
+
resolve(data);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
request.onerror = reject;
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async getItem(id) {
|
|
57
|
+
return new Promise(async (resolve, reject) => {
|
|
58
|
+
|
|
59
|
+
this.dbManager.executeOperation(this.storeName, (store) => {
|
|
60
|
+
const request = store.get(id);
|
|
61
|
+
|
|
62
|
+
request.onsuccess = () => {
|
|
63
|
+
const data = request.result;
|
|
64
|
+
resolve(data);
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
request.onerror = reject;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async updateItem(id, updatedItem) {
|
|
74
|
+
return new Promise(async (resolve, reject) => {
|
|
75
|
+
|
|
76
|
+
this.dbManager.executeOperation(this.storeName, (store) => {
|
|
77
|
+
const request = store.get(id);
|
|
78
|
+
|
|
79
|
+
request.onsuccess = () => {
|
|
80
|
+
const data = request.result;
|
|
81
|
+
Object.assign(data, updatedItem);
|
|
82
|
+
store.put(data, id);
|
|
83
|
+
|
|
84
|
+
//TODO wait put operation before resolve
|
|
85
|
+
resolve();
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
request.onerror = reject;
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async deleteItem(id) {
|
|
95
|
+
return new Promise(async (resolve, reject) => {
|
|
96
|
+
|
|
97
|
+
this.dbManager.executeOperation(this.storeName, (store) => {
|
|
98
|
+
const request = store.delete(id);
|
|
99
|
+
|
|
100
|
+
request.onsuccess = resolve;
|
|
101
|
+
request.onerror = reject;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
//TODO move to base class here
|
|
110
|
+
// this.requestCache = new Map; // id -> promise ///TODO seems irrelevant to class IndexedDBManager (could be renamed to Facade already)
|
|
111
|
+
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { appsConf } from "../appDataConf.js";
|
|
2
|
+
import { chunksConf } from "../chunkDataConf.js";
|
|
3
|
+
// import { dbName } from "../consts";
|
|
4
|
+
import { gudhubIndexedDBManager } from "../IndexedDBService.js";
|
|
5
|
+
import { BaseStoreManager } from "./BaseStoreManager.js";
|
|
6
|
+
|
|
7
|
+
export class AppStoreManager extends BaseStoreManager {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(gudhubIndexedDBManager, appsConf.store);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
//use item methods from BaseStoreManager !!!!!!!!!!
|
|
13
|
+
|
|
14
|
+
//TODO getApp overrides getApp from IndexedDBAppService
|
|
15
|
+
async getAppStoreManagerVersion(id) {
|
|
16
|
+
|
|
17
|
+
return this.getItem(id);
|
|
18
|
+
|
|
19
|
+
// return dbManager.enqueueOperation('apps', 'readonly', (store) => store.get(id));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async addApp(id, data) {
|
|
23
|
+
return this.addItem(id, data);
|
|
24
|
+
|
|
25
|
+
// return dbManager.enqueueOperation('apps', 'readwrite', (store) => store.add(app));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async hasApp(id) {
|
|
29
|
+
return this.hasItem(id);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async deleteApp(id) {
|
|
33
|
+
return this.deleteItem(id);
|
|
34
|
+
|
|
35
|
+
// return dbManager.enqueueOperation('apps', 'readwrite', (store) => store.delete(id));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Additional methods specific to AppStoreManager if necessary
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export class ChunksStoreManager extends BaseStoreManager {
|
|
42
|
+
constructor() {
|
|
43
|
+
super(gudhubIndexedDBManager, chunksConf.store);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
async getChunkStoreManagerVersion(id) {
|
|
48
|
+
|
|
49
|
+
return this.getItem(id);
|
|
50
|
+
|
|
51
|
+
// return dbManager.enqueueOperation('apps', 'readonly', (store) => store.get(id));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async addChunk(id, chunk) {
|
|
55
|
+
return this.addItem(id, chunk);
|
|
56
|
+
|
|
57
|
+
// return dbManager.enqueueOperation('apps', 'readwrite', (store) => store.add(app));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async deleteChunk(id) {
|
|
61
|
+
return this.deleteItem(id);
|
|
62
|
+
|
|
63
|
+
// return dbManager.enqueueOperation('apps', 'readwrite', (store) => store.delete(id));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
//use item methods from BaseStoreManager !!!!!!!
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
// Additional methods specific to ChunksStoreManager if necessary
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export class ChunkCacheStoreManager extends BaseStoreManager {
|
|
74
|
+
constructor(dbManager) {
|
|
75
|
+
super(dbManager, 'myDatabase', 'chunkCacheStore');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Additional methods specific to ChunkCacheStoreManager if necessary
|
|
79
|
+
}
|
|
@@ -4,18 +4,19 @@ import { chunksConf } from "./chunkDataConf.js";
|
|
|
4
4
|
import { dbName, dbVersion } from "./consts.js";
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
// //TODO move to indexeddbmanager
|
|
8
|
+
// if (
|
|
9
|
+
// IS_BROWSER
|
|
10
|
+
// ) {
|
|
11
|
+
// const request = indexedDB.open(dbName, dbVersion);
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
// request.onupgradeneeded = event => {
|
|
14
|
+
// const db = event.target.result;
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
}
|
|
16
|
+
// for (let store of [appsConf.store, chunksConf.store]) {
|
|
17
|
+
// if (!db.objectStoreNames.contains(store)) {
|
|
18
|
+
// db.createObjectStore(store);
|
|
19
|
+
// }
|
|
20
|
+
// }
|
|
21
|
+
// };
|
|
22
|
+
// }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//move appsdbcons chunksdbconf and chunkcacheconf to here
|
|
@@ -10,6 +10,9 @@ import { ChunkHttpService } from "./httpService/ChunkHttpService.js";
|
|
|
10
10
|
|
|
11
11
|
import "./IndexedDB/init.js";
|
|
12
12
|
|
|
13
|
+
|
|
14
|
+
//TODO confs should be used only for appropriate classes therefore it doesnt make sense to export them here
|
|
15
|
+
|
|
13
16
|
let AppDataService;
|
|
14
17
|
let ChunkDataService;
|
|
15
18
|
|