@gudhub/core 1.2.4-beta.4 → 1.2.4-beta.43

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.
Files changed (61) hide show
  1. package/.parcel-cache/61134f48017c9cc1-AssetGraph +0 -0
  2. package/.parcel-cache/72a0445d2e7372b4-BundleGraph +0 -0
  3. package/.parcel-cache/83e7562660f7cc15-BundleGraph +0 -0
  4. package/.parcel-cache/9a0d07555444f4da-AssetGraph +0 -0
  5. package/.parcel-cache/d3a1b9507cb44047-AssetGraph +0 -0
  6. package/.parcel-cache/d647b2950bce7da7-RequestGraph +0 -0
  7. package/.parcel-cache/data.mdb +0 -0
  8. package/.parcel-cache/dc1da35000e13623-RequestGraph +0 -0
  9. package/.parcel-cache/lock.mdb +0 -0
  10. package/.parcel-cache/snapshot-d647b2950bce7da7.txt +28892 -0
  11. package/.parcel-cache/snapshot-dc1da35000e13623.txt +28781 -0
  12. package/.parcelrc.appRequestWorker +4 -0
  13. package/GUDHUB/AppProcessor/AppProcessor.js +62 -24
  14. package/GUDHUB/ChunksManager/ChunksManager.js +61 -61
  15. package/GUDHUB/ChunksManager/ChunksManager.test.js +8 -4
  16. package/GUDHUB/DataService/AppDataService.js +232 -0
  17. package/GUDHUB/DataService/ChunkDataService.js +10 -0
  18. package/GUDHUB/DataService/IndexedDB/IndexedDBAppService.js +828 -63
  19. package/GUDHUB/DataService/IndexedDB/IndexedDBChunkService.js +303 -46
  20. package/GUDHUB/DataService/IndexedDB/IndexedDBService.js +342 -2
  21. package/GUDHUB/DataService/IndexedDB/StoreManager/BaseStoreManager.js +124 -0
  22. package/GUDHUB/DataService/IndexedDB/StoreManager/managers.js +113 -0
  23. package/GUDHUB/DataService/IndexedDB/appDataConf.js +6 -3
  24. package/GUDHUB/DataService/IndexedDB/appRequestWorker.js +225 -0
  25. package/GUDHUB/DataService/IndexedDB/chunkDataConf.js +3 -3
  26. package/GUDHUB/DataService/IndexedDB/consts.js +3 -1
  27. package/GUDHUB/DataService/IndexedDB/init.js +15 -14
  28. package/GUDHUB/DataService/IndexedDB/storeManagerConf/chunkCacheStoreManagerConf.js +11 -0
  29. package/GUDHUB/DataService/IndexedDB/storeManagerConf/init.js +1 -0
  30. package/GUDHUB/DataService/export.js +8 -5
  31. package/GUDHUB/DataService/httpService/AppHttpService.js +22 -4
  32. package/GUDHUB/DataService/httpService/ChunkHttpService.js +19 -2
  33. package/GUDHUB/DataService/utils.js +104 -1
  34. package/GUDHUB/FileManager/FileManager.js +7 -3
  35. package/GUDHUB/GHConstructor/createAngularModuleInstance.js +14 -5
  36. package/GUDHUB/GHConstructor/createClassInstance.js +3 -3
  37. package/GUDHUB/ItemProcessor/ItemProcessor.js +24 -0
  38. package/GUDHUB/Storage/ModulesList.js +18 -2
  39. package/GUDHUB/Utils/AppsTemplateService/AppsTemplateService.js +37 -1
  40. package/GUDHUB/Utils/Utils.js +29 -1
  41. package/GUDHUB/Utils/merge_chunks/merge_chunks.js +36 -28
  42. package/GUDHUB/Utils/merge_chunks/merge_chunks.worker.js +78 -0
  43. package/GUDHUB/Utils/merge_compare_items/merge_compare_items.js +40 -9
  44. package/GUDHUB/WebSocket/WebSocket.js +2 -1
  45. package/GUDHUB/consts.js +21 -1
  46. package/GUDHUB/gudhub.js +53 -22
  47. package/GUDHUB/gudhubAppRequestWorker.js +18 -0
  48. package/build.sh +91 -0
  49. package/dist/gudhub.es.copy.js +15888 -0
  50. package/dist/gudhub.es.js +15896 -0
  51. package/dist/gudhub.umd.js +195 -0
  52. package/index.js +3 -1
  53. package/indexUMD.js +0 -2
  54. package/indextest.html +35 -0
  55. package/package.json +37 -23
  56. package/vite.config.esm.js +67 -0
  57. package/vite.config.umd.js +66 -0
  58. package/umd/library.min.js +0 -2
  59. package/umd/library.min.js.LICENSE.txt +0 -13
  60. package/umd/library.min.js.map +0 -1
  61. package/webpack.config.js +0 -33
@@ -2,33 +2,221 @@ import { AppDataService } from "../AppDataService.js";
2
2
  import { ChunkDataService } from "../ChunkDataService.js"; // removed "ChunkCacheDataService" from imported because it was causing an error "{ ChunkCacheDataService } not found in exported names" in "gudhub-node-server"
3
3
  import { AppHttpService } from "../httpService/AppHttpService.js";
4
4
  import { objectAssignWithOverride } from "../utils.js";
5
- import { IndexedDBService } from "./IndexedDBService.js";
5
+ import { IndexedDBManager, IndexedDBService } from "./IndexedDBService.js";
6
6
 
7
+ import { IndexedDBChunkService } from "./IndexedDBChunkService.js";
8
+ import { chunksConf } from "./chunkDataConf.js";
9
+ import { AppStoreManager } from "./StoreManager/managers.js";
10
+ import { dbName, dbVersion } from "./consts.js";
11
+ import { appsConf } from "./appDataConf.js";
12
+ import { chunksMergeConf } from "./storeManagerConf/chunkCacheStoreManagerConf.js";
13
+
14
+
15
+ import AppRequestWorkerScript from '../../../dist/PARCEL_APP_REQUEST_WORKER_FILENAME.js?worker&inline';
7
16
 
8
17
  //this should be global in project
9
18
  // class IndexedDBFacade extends CacheService {
10
19
 
11
20
  // }
12
21
 
13
- export class IndexedDBAppService extends AppDataService {
14
- constructor(req, conf) {
15
- super(req, conf);
22
+
23
+
24
+ class IndexedDBManager1 {
25
+ constructor(dbName, storeName) {
26
+ this.dbName = dbName;
27
+ this.storeName = storeName;
28
+ this.db = null;
29
+ this.queue = [];
30
+ this.isProcessing = false;
31
+ }
32
+
33
+ async openDB() {
34
+ if (this.db) return this.db;
35
+
36
+ return new Promise((resolve, reject) => {
37
+ const request = indexedDB.open(this.dbName, 1);
38
+
39
+ request.onupgradeneeded = (event) => {
40
+ const db = event.target.result;
41
+ if (!db.objectStoreNames.contains(this.storeName)) {
42
+ db.createObjectStore(this.storeName, { keyPath: 'id', autoIncrement: true });
43
+ }
44
+ };
45
+
46
+ request.onsuccess = (event) => {
47
+ this.db = event.target.result;
48
+ resolve(this.db);
49
+ };
50
+
51
+ request.onerror = (event) => {
52
+ reject(event.target.error);
53
+ };
54
+ });
55
+ }
56
+
57
+ async executeOperation(operation) {
58
+ await this.openDB();
59
+ return new Promise((resolve, reject) => {
60
+ const transaction = this.db.transaction(this.storeName, 'readwrite');
61
+ const store = transaction.objectStore(this.storeName);
62
+
63
+ transaction.oncomplete = () => resolve();
64
+ transaction.onerror = (event) => reject(event.target.error);
65
+
66
+ operation(store);
67
+ });
68
+ }
69
+
70
+ async enqueueOperation(operation) {
71
+ this.queue.push(operation);
72
+
73
+ if (!this.isProcessing) {
74
+ this.isProcessing = true;
75
+ while (this.queue.length > 0) {
76
+ const currentOperation = this.queue.shift();
77
+ try {
78
+ await this.executeOperation(currentOperation);
79
+ } catch (error) {
80
+ console.error('Operation failed:', error);
81
+ }
82
+ }
83
+ this.isProcessing = false;
84
+ }
85
+ }
86
+ }
87
+
88
+
89
+
90
+
91
+
92
+ class IndexedDBManager2 {
93
+ constructor(dbName, storeName) {
94
+ this.dbName = dbName;
95
+ this.storeName = storeName;
96
+ this.db = null;
97
+ this.queue = [];
98
+ this.isProcessing = false;
99
+ }
100
+
101
+ async openDB() {
102
+ if (this.db) return this.db;
103
+
104
+ return new Promise((resolve, reject) => {
105
+ const request = indexedDB.open(this.dbName, 1);
106
+
107
+ request.onupgradeneeded = (event) => {
108
+ const db = event.target.result;
109
+ if (!db.objectStoreNames.contains(this.storeName)) {
110
+ db.createObjectStore(this.storeName, { keyPath: 'id', autoIncrement: true });
111
+ }
112
+ };
113
+
114
+ request.onsuccess = (event) => {
115
+ this.db = event.target.result;
116
+ resolve(this.db);
117
+ };
118
+
119
+ request.onerror = (event) => {
120
+ reject(event.target.error);
121
+ };
122
+ });
123
+ }
124
+
125
+ async executeOperation(operation) {
126
+ await this.openDB();
127
+ return new Promise((resolve, reject) => {
128
+ const transaction = this.db.transaction(this.storeName, 'readwrite');
129
+ const store = transaction.objectStore(this.storeName);
130
+
131
+ transaction.oncomplete = () => resolve();
132
+ transaction.onerror = (event) => reject(event.target.error);
133
+
134
+ operation(store);
135
+ });
136
+ }
137
+
138
+ async enqueueOperation(operation) {
139
+ this.queue.push(operation);
140
+
141
+ if (!this.isProcessing) {
142
+ this.isProcessing = true;
143
+ while (this.queue.length > 0) {
144
+ const currentOperation = this.queue.shift();
145
+ try {
146
+ await this.executeOperation(currentOperation);
147
+ } catch (error) {
148
+ console.error('Operation failed:', error);
149
+ }
150
+ }
151
+ this.isProcessing = false;
152
+ }
153
+ }
154
+ }
155
+
156
+
157
+
158
+ //todo андрей сказал чанки два раза грузятся
159
+ //при первой загрузке когда нет бд ничего не отображается
160
+ //андрей предлагает грохать бд если проблемы со сторами
161
+
162
+
163
+ // может поменять имя на StoreAppService???? потому что я уже сделал абстракцию
164
+
165
+ export class IndexedDBAppServiceForWorker extends AppDataService {
166
+ constructor(req, conf, gudhub) {
167
+ super(req, conf, gudhub);
16
168
 
17
- this.dataService = new AppHttpService(req);
169
+ this.dataService = new AppHttpService(req, conf, gudhub);
18
170
 
19
- let indexDBService = new IndexedDBService(conf);
171
+ // let indexDBService = new IndexedDBService(conf);
172
+ // let indexDBAppStoreManager = new AppStoreManager;
20
173
 
21
- objectAssignWithOverride(this, indexDBService);
174
+ this.requestCache = new Map; // id -> promise ///TODO seems irrelevant to class IndexedDBManager (could be renamed to Facade already)
175
+
176
+
177
+ this.gudhub = gudhub;
178
+
179
+
180
+ this.chunkDataService = new IndexedDBChunkService(req, chunksMergeConf, gudhub);
181
+
182
+ // let res = await this.chunkDataService.getMergedChunkForIDList(id, sentData.chunks);
183
+
184
+
185
+
186
+
187
+ //TODO objectAssignWithOverride here too?
188
+ // this.dbManager = new IndexedDBManager('myDatabase', 'appsStore');
189
+
190
+
191
+
192
+ //TODO also think how to use AppDataService without overriding chunkDataService here. seems it gets http chunk service for worker somehow
193
+ // maybe IS_WEB is wrong inside worker
194
+
195
+
196
+
197
+ // this.db = null;
198
+ // this.queue = [];
199
+ // this.isProcessing = false;
200
+
201
+
202
+
203
+ //todo worker pool?
204
+
205
+ this.storeManager = new AppStoreManager;
206
+
207
+
208
+ // objectAssignWithOverride(this, indexDBService);
209
+ // objectAssignWithOverride(this, new AppStoreManager);
22
210
  }
23
211
 
24
212
 
25
213
  static [Symbol.hasInstance](instance) {
26
214
  try {
27
- if (instance instanceof IndexedDBAppService) return true;
215
+ if (instance instanceof IndexedDBAppServiceForWorker) return true;
28
216
  if (instance instanceof IndexedDBService) return true; //TODO requires multiple inheritance, thhink how to overcome it
29
217
  return false;
30
218
  } catch (error) {
31
- return false;
219
+ return false;
32
220
  }
33
221
  }
34
222
 
@@ -36,83 +224,660 @@ export class IndexedDBAppService extends AppDataService {
36
224
  // indexDBAccess = new IndexedDBFacade;
37
225
 
38
226
 
227
+ isWithCache() {
228
+ return false;
229
+ }
230
+
231
+ // getApp(id) {
232
+ // let worker = new Worker('../../appRequestWorker.js');
233
+
234
+
235
+ // worker.postMessage({ type: 'init', gudhubSerialized: this.gudhub.serialized });
236
+
237
+ // // Send the main data to be processed
238
+ // const mainData = { /* your data here */ };
239
+ // worker.postMessage({ type: 'processData', data: mainData });
240
+
241
+ // worker.onmessage = function(e) {
242
+ // console.log('Data processed by worker:', e.data);
243
+ // };
244
+
245
+ // worker.onerror = function(e) {
246
+ // console.error('Error in worker:', e);
247
+ // };
248
+
249
+
250
+ // worker.onmessage = (msgEv) => {
251
+
252
+ // }
253
+
254
+
255
+
256
+ // }
257
+
258
+
259
+ //TODO для чанков с индексддб будет точно такой код поєтому может вынести его в какое-то место? например в отдельный класс
260
+
261
+
262
+ // async executeOperation(operation) {
263
+ // await this.openDB();
264
+ // return new Promise((resolve, reject) => {
265
+ // const transaction = this.db.transaction(this.storeName, 'readwrite');
266
+ // const store = transaction.objectStore(this.storeName);
267
+
268
+ // transaction.oncomplete = () => resolve();
269
+ // transaction.onerror = (event) => reject(event.target.error);
270
+
271
+ // operation(store);
272
+ // });
273
+ // }
274
+
275
+ // async enqueueOperation(operation) {
276
+ // this.queue.push(operation);
277
+
278
+ // if (!this.isProcessing) {
279
+ // this.isProcessing = true;
280
+ // while (this.queue.length > 0) {
281
+ // const currentOperation = this.queue.shift();
282
+ // try {
283
+ // await this.executeOperation(currentOperation);
284
+ // } catch (error) {
285
+ // console.error('Operation failed:', error);
286
+ // }
287
+ // }
288
+ // this.isProcessing = false;
289
+ // }
290
+ // }
291
+
292
+ // async addData(data) {
293
+ // await this.enqueueOperation((store) => {
294
+ // store.add(data);
295
+ // });
296
+ // }
297
+
298
+ // async updateData(id, updatedData) {
299
+ // await this.enqueueOperation((store) => {
300
+ // const request = store.get(id);
301
+ // request.onsuccess = () => {
302
+ // const data = request.result;
303
+ // Object.assign(data, updatedData);
304
+ // store.put(data);
305
+ // };
306
+ // });
307
+ // }
308
+
309
+ // async deleteData(id) {
310
+ // await this.enqueueOperation((store) => {
311
+ // store.delete(id);
312
+ // });
313
+ // }
314
+
315
+
316
+ async getAppWithoutProcessing(id) {
317
+ let data = await this.dataService.getAppWithoutProcessing(id);
318
+
319
+ await this.putApp(id, data);
320
+
321
+ return data;
322
+ }
323
+
324
+ // this returns data for specific chunks + app request data
325
+ // async getAppWithSpecificChunksList(id, list) {
326
+ // let data = await this.dataService.getAppWithoutProcessing(id);
327
+
328
+ // await self.putApp(id, data);
329
+
330
+
331
+ // let processedData = await self.processRequestedApp(id, data);//here нужно пересмотреть
332
+
333
+ // return processedData;
334
+ // }
335
+
39
336
  async getApp(id) {
40
- if (this.requestCache.has(id)) return this.requestCache.get(id);
337
+ // if (this.requestCache.has(id)) return this.requestCache.get(id);
41
338
 
42
- let dataServiceRequest = this.dataService.getApp(id);
43
339
 
44
- dataServiceRequest.then(data => this.putApp(id, data));
340
+ // return at first time cached app request?????? no seems for worker its ok
45
341
 
46
- try {
47
- let self = this;
342
+ let self = this;
343
+
344
+ // let dataServiceRequest = this.dataService.getAppWithoutProcessing(id);
345
+ let data = await this.dataService.getAppWithoutProcessing(id);
346
+
347
+ // await self.putApp(id, data);
348
+
349
+ let processedData = await self.processRequestedApp(id, data);//here нужно пересмотреть
350
+
351
+ return processedData;
352
+
353
+ let pr = new Promise(async (resolve, reject) => {
354
+ try {
355
+ await self.openDatabase();
48
356
 
49
- let pr = new Promise(async (resolve, reject) => {
50
- try {
51
- const db = await self.openDatabase();
52
- const transaction = db.transaction(self.store, "readonly");
53
- const store = transaction.objectStore(self.store);
54
357
 
55
- const storeRequest = store.get(id);
358
+ const transaction = self.db.transaction(self.store, "readonly");
359
+ const store = transaction.objectStore(self.store);
360
+
361
+ const storeRequest = store.get(id);
56
362
 
57
- storeRequest.onsuccess = (e) => {
363
+ storeRequest.onsuccess = (e) => {
364
+
365
+ let cachedData = e.target.result;
58
366
 
59
- let cachedData = e.target.result;
60
-
61
- if (
62
- !cachedData
63
- ) {
64
- reject();
65
- }
66
-
67
- if (
68
- cachedData
69
- ) {
70
- resolve(cachedData);
71
- }
72
- };
73
-
74
- storeRequest.onerror = reject
75
- } catch (error) {
76
- reject();
77
- }
78
- });
367
+ if (
368
+ !cachedData
369
+ ) {
370
+ dataServiceRequest.then(async data => {
371
+ let processedData = await self.processRequestedApp(id, data);//here
79
372
 
80
- self.requestCache.set(id, pr);
81
373
 
82
- await pr;
374
+ // let comparison = this.gudhub.util.compareItems([], processedData.items_list);
375
+
376
+ // let cached
377
+
378
+ resolve(processedData);
379
+
380
+ self.putApp(id, processedData);
381
+
382
+ }, reject);
383
+ }
83
384
 
84
- return pr;
385
+ if (
386
+ cachedData
387
+ ) {
388
+ // resolve(cachedData);
85
389
 
86
- } catch(e) {
87
- this.requestCache.set(id, dataServiceRequest);
390
+ dataServiceRequest.then(async data => {
391
+ let processedData = await self.processRequestedApp(id, data);//here
88
392
 
89
- return dataServiceRequest;
90
- }
393
+ // let comparison = this.gudhub.util.compareItems(cachedData.items_list, processedData.items_list);
394
+
395
+ resolve(processedData);
396
+ self.putApp(id, processedData);
397
+ });
398
+ }
399
+ };
400
+
401
+ storeRequest.onerror = () => {
402
+ dataServiceRequest.then(async data => {
403
+ let processedData = await self.processRequestedApp(id, data);//here
404
+
405
+ // let comparison = this.gudhub.util.compareItems([], processedData.items_list);
406
+
407
+ // let cached
408
+
409
+ resolve(processedData);
410
+
411
+ self.putApp(id, processedData);
412
+
413
+ }, reject);
414
+ }
415
+ } catch (error) {
416
+ dataServiceRequest.then(async data => {
417
+ let processedData = await self.processRequestedApp(id, data);//here
418
+
419
+ // let comparison = this.gudhub.util.compareItems([], processedData.items_list);
420
+
421
+ // let cached
422
+
423
+ resolve(processedData);
424
+
425
+ self.putApp(id, processedData);
426
+
427
+ }, reject);
428
+ }
429
+ });
430
+
431
+ // self.requestCache.set(id, pr);
432
+
433
+ return pr;
434
+ }
435
+
436
+ async getCached(id) {
437
+
438
+ return this.storeManager.getApp(id); //TODO investigate method name
439
+
440
+
441
+ let self = this;
442
+
443
+ let pr = new Promise(async (resolve, reject) => {
444
+ try {
445
+ await self.openDatabase();
446
+
447
+ const transaction = self.db.transaction(self.store, "readonly");
448
+ const store = transaction.objectStore(self.store);
449
+
450
+ const storeRequest = store.get(id);
451
+
452
+ storeRequest.onsuccess = (e) => {
453
+
454
+ let cachedData = e.target.result;
455
+
456
+ if (
457
+ !cachedData
458
+ ) {
459
+ reject();
460
+ }
461
+
462
+ if (
463
+ cachedData
464
+ ) {
465
+ resolve(cachedData);
466
+ }
467
+ };
468
+
469
+ storeRequest.onerror = reject;
470
+ } catch (error) {
471
+ reject();
472
+ }
473
+ });
474
+
475
+ return pr;
91
476
  }
92
477
 
93
478
  async putApp(id, data) {
94
- try {
95
- const db = await this.openDatabase();
479
+ return this.storeManager.putApp(id, data);
96
480
 
97
- const transaction = db.transaction(this.store, "readwrite");
98
- const store = transaction.objectStore(this.store);
481
+ // try {
482
+ // await this.openDatabase();
483
+
484
+ // const transaction = this.db.transaction(this.store, "readwrite");
485
+ // const store = transaction.objectStore(this.store);
486
+
487
+ // store.put(data, id);
488
+ // } catch (error) {
489
+
490
+ // }
491
+ }
492
+
493
+ // duplicated code 2 times in 2 classes openDatabase
494
+
495
+ // async openDatabase() {
496
+ // if (this.db) return this.db;
497
+
498
+ // return new Promise((resolve, reject) => {
499
+ // const request = indexedDB.open(this.dbName, this.dbVersion);
500
+
501
+ // request.onsuccess = event => {
502
+ // this.db = event.target.result;
503
+ // resolve(this.db);
504
+ // };
505
+ // request.onerror = event => {
506
+ // reject(event.target.error);
507
+ // };
508
+ // });
509
+ // }
510
+ }
511
+
512
+
513
+ export class IndexedDBAppService extends AppDataService {
514
+ constructor(req, conf, gudhub) {
515
+ super(req, conf, gudhub);
516
+
517
+ this.dataService = new AppHttpService(req, conf, gudhub);// TODO isnt used in class. Why?
518
+
519
+ // let indexDBService = new IndexedDBService(conf);
520
+
521
+ this.requestCache = new Map; // id -> promise ///TODO seems irrelevant to class IndexedDBManager (could be renamed to Facade already)
99
522
 
100
- store.put(data, id);
101
- } catch (error) {
102
523
 
524
+ this.gudhub = gudhub;
525
+
526
+
527
+ this.resolveFnMap = new Map; // id -> resolve
528
+
529
+
530
+
531
+ //TODO replace by worker-loader when it will work in webpack 5, take a look to webpack config
532
+ // let csvWorkerFileAsString = require('./csv.worker.js');
533
+ // let worker = new Blob([AppRequestWorkerScript], {type: 'application/javascript'});
534
+
535
+ // angular.module('csvService', [
536
+ // 'itemDataProcessor'
537
+ // ])
538
+
539
+ // .service('csvService', ['itemsDataProcessing', 'PipeService', function(itemsDataProcessing, PipeService) {
540
+
541
+ // var self = this,
542
+ // this.appRequestAndProcessWorker = new Worker(URL.createObjectURL(worker));//TODO URL.createObjectURL - revoke isn't called
543
+
544
+
545
+
546
+ // this.appRequestAndProcessWorker = new Worker('./appRequestWorker.js');
547
+ // this.appRequestAndProcessWorker = new Worker(new URL('./appRequestWorker.js', import.meta.url));
548
+ // this.appRequestAndProcessWorker = new Worker('node_modules/@gudhub/core/umd/appRequestWorker.js');
549
+ // this.appRequestAndProcessWorker = new Worker('dist/appRequestWorker.built.js', import.meta.url);
550
+
551
+
552
+ // const workerBlob = new Blob([atob(AppRequestWorkerScript.split(',')[1])], { type: 'application/javascript' });
553
+ // const workerUrl = URL.createObjectURL(workerBlob);
554
+ // this.appRequestAndProcessWorker = new Worker(workerUrl);
555
+
556
+ this.appRequestAndProcessWorker = new AppRequestWorkerScript;
557
+ // this.appRequestAndProcessWorker = new Worker(
558
+ // // parcel bundler specific syntax. Check https://parceljs.org/features/bundle-inlining/
559
+ // {type: 'module'}
560
+ // );
561
+ // this.appRequestAndProcessWorker = new Worker('override_npm/gudhub/umd/appRequestWorker.js');
562
+ // this.appRequestAndProcessWorker = new AppRequestWorker();
563
+
564
+ // new Worker(new URL('./worker.js', import.meta.url));
565
+
566
+
567
+ this.appRequestAndProcessWorker.postMessage({ type: 'init', gudhubSerialized: this.gudhub.serialized });
568
+
569
+
570
+ let self = this;
571
+ this.appRequestAndProcessWorker.onerror = function(e) {
572
+ // self.appRequestAndProcessWorker.terminate();
573
+
574
+
575
+ // console.error('Error in worker:', e);
576
+ };
577
+
578
+
579
+ // let self = this;
580
+
581
+ this.appRequestAndProcessWorker.onmessage = function(e) {
582
+
583
+
584
+
585
+
586
+
587
+ if (
588
+ e.data.type == 'requestApp'
589
+ ) {
590
+
591
+ if (
592
+ self.resolveFnMap.has(e.data.id)
593
+ ) {
594
+ let resolver = self.resolveFnMap.get(e.data.id);
595
+
596
+ resolver(e.data.data);
597
+ }
598
+
599
+
600
+ // self.requestCache.set(id, new Promise);
601
+
602
+ }
603
+
604
+
605
+ // todo check this for new code
606
+ // todo outdated code, to remove
607
+ if (
608
+ e.data.type == 'processData'
609
+ ) {
610
+ // if (id == e.data.id) {
611
+ self.gudhub.itemProcessor.handleDiff(e.data.id, e.data.compareRes);
612
+
613
+
614
+ if (
615
+ e.data.viewListChanged ||
616
+ e.data.fieldListChanged
617
+ ) {
618
+ self.gudhub.appProcessor.updateAppFieldsAndViews(e.data.newVersion);
619
+ }
620
+
621
+
622
+
623
+
624
+ //here
625
+
626
+ // }
103
627
  }
628
+
629
+
630
+
631
+
632
+
633
+
634
+ // worker.terminate();
635
+
636
+ // this.postMessage({id: e.data.id, compareRes: comparison});
637
+
638
+
639
+ // console.log('Data processed by worker:', e.data);
640
+ };
641
+
642
+ // worker.onerror = function(e) {
643
+ // // worker.terminate();
644
+
645
+
646
+ // // console.error('Error in worker:', e);
647
+ // };
648
+
649
+
650
+
651
+ //todo worker pool?
652
+
653
+
654
+ this.storeManager = new AppStoreManager;
655
+
656
+ // objectAssignWithOverride(this, indexDBService);
657
+ // objectAssignWithOverride(this, new AppStoreManager());
658
+ }
659
+
660
+
661
+ static [Symbol.hasInstance](instance) {
662
+ try {
663
+ if (instance instanceof IndexedDBAppService) return true;
664
+ if (instance instanceof IndexedDBService) return true; //TODO requires multiple inheritance, thhink how to overcome it
665
+ return false;
666
+ } catch (error) {
667
+ return false;
104
668
  }
669
+ }
105
670
 
106
- async openDatabase() {
107
- return new Promise((resolve, reject) => {
108
- const request = indexedDB.open(this.dbName, this.dbVersion);
671
+ //TODO use IndexedDBFacade here
672
+ // indexDBAccess = new IndexedDBFacade;
109
673
 
110
- request.onsuccess = event => {
111
- resolve(event.target.result);
112
- };
113
- request.onerror = event => {
114
- reject(event.target.error);
115
- };
674
+
675
+ isWithCache() {
676
+ return false; //doesnt use indexeddb
677
+ }
678
+
679
+ async getApp(id) {//TODO -> get?
680
+ if (this.requestCache.has(id)) return this.requestCache.get(id); // по этому коду есть вопрос - вызовы getApp кешируются выше и тогда выходит возвращается старая версия?
681
+
682
+
683
+ let self = this;
684
+
685
+
686
+ let hasId = await this.has(id);
687
+
688
+
689
+ if (
690
+ false
691
+ ) {
692
+
693
+ // let promiseObject = Promise.
694
+
695
+ let cached = await this.getCached(id); // todo here should be merged with cached mergedChunk
696
+
697
+ // repetitive operation again, seems should be in getCached
698
+ let cachedMergedChunk = await this.chunkDataService.getCachedMergedChunk(id, cached.chunks);
699
+
700
+
701
+ // let mergedData = this.gudhub
702
+
703
+
704
+ cached.items_list = await this.gudhub.util.mergeChunks([
705
+ cachedMergedChunk,
706
+ cached,
707
+ ]);
708
+
709
+
710
+ let getFromDBPrms = Promise.resolve(cached);
711
+
712
+ // let getFromDBPrms = await this.getCached(id); // todo here should be merged with cached mergedChunk
713
+ this.requestCache.set(id, getFromDBPrms);
714
+
715
+ this.appRequestAndProcessWorker.postMessage({ type: 'processData', id: id });
716
+
717
+ return getFromDBPrms;
718
+ } else {
719
+ // this.requestCache.set(id, new Promise);
720
+
721
+ let prms = new Promise((resolve, reject) => {
722
+ self.resolveFnMap.set(id, resolve);
116
723
  });
724
+
725
+
726
+ this.requestCache.set(id, prms);
727
+
728
+ //todo define types as constants
729
+ this.appRequestAndProcessWorker.postMessage({ type: 'requestApp', id: id });
730
+
731
+
732
+
733
+ return prms;
734
+
735
+ //todo somehow handle answer from worker
736
+
737
+ //maybe use mesage library to communicate with worker
738
+ }
739
+
740
+
741
+
742
+
743
+ // let worker = new Worker('./appRequestWorker.js');
744
+
745
+
746
+ // worker.postMessage({ type: 'init', gudhubSerialized: this.gudhub.serialized });
747
+
748
+ // Send the main data to be processed
749
+ // const mainData = { /* your data here */ };
750
+ // this.appRequestAndProcessWorker.postMessage({ type: 'processData', id: id });
751
+
752
+ // let self = this;
753
+
754
+ // worker.onmessage = function(e) {
755
+
756
+
757
+ // if (id == e.data.id) {
758
+ // self.gudhub.itemProcessor.handleDiff(e.data.id, e.data.compareRes);
759
+ // }
760
+
761
+
762
+
763
+ // // worker.terminate();
764
+
765
+ // // this.postMessage({id: e.data.id, compareRes: comparison});
766
+
767
+
768
+ // // console.log('Data processed by worker:', e.data);
769
+ // };
770
+
771
+ // worker.onerror = function(e) {
772
+ // // worker.terminate();
773
+
774
+
775
+ // // console.error('Error in worker:', e);
776
+ // };
777
+
778
+
779
+ // return getFromDBPrms;
780
+
781
+
782
+
783
+ }
784
+
785
+
786
+ //TODO page isnt loaded when indexeddb empty. Investigate getApp in IndexedDBAppService here
787
+
788
+ async getCached(id) {//TODO -> getFromStore?
789
+
790
+
791
+ return this.storeManager.getApp(id); //TODO investigate method name
792
+
793
+ let self = this;
794
+
795
+ let pr = new Promise(async (resolve, reject) => {
796
+ try {
797
+ await self.openDatabase();
798
+
799
+ const transaction = self.db.transaction(self.store, "readonly");
800
+ const store = transaction.objectStore(self.store);
801
+
802
+ const storeRequest = store.get(id);
803
+
804
+ storeRequest.onsuccess = (e) => {
805
+
806
+ let cachedData = e.target.result;
807
+
808
+ if (
809
+ !cachedData
810
+ ) {
811
+ reject();
812
+ }
813
+
814
+ if (
815
+ cachedData
816
+ ) {
817
+ resolve(cachedData);
818
+ }
819
+ };
820
+
821
+ storeRequest.onerror = reject;
822
+ } catch (error) {
823
+ reject();
824
+ }
825
+ });
826
+
827
+ return pr;
828
+ }
829
+
830
+ async has(id) {
831
+
832
+ try {
833
+
834
+ return this.storeManager.hasApp(id);
835
+ } catch (error) {
836
+ debugger
117
837
  }
838
+
839
+ // try {
840
+ // let cached = await this.getCached(id);
841
+
842
+ // if (!cached) return false;
843
+
844
+ // return true;
845
+ // } catch(e) {
846
+ // //todo check error type and then rethrow maybe here
847
+
848
+ // return false;
849
+ // }
850
+ }
851
+
852
+ async putApp(id, data) { //TODO -> put?
853
+ return this.storeManager.putApp(id, data);
854
+
855
+ // try {
856
+ // const db = await this.openDatabase();
857
+
858
+ // const transaction = db.transaction(this.store, "readwrite");
859
+ // const store = transaction.objectStore(this.store);
860
+
861
+ // store.put(data, id);
862
+ // } catch (error) {
863
+
864
+ // }
865
+ }
866
+
867
+ //todo openDatabase only once and then preserve it for further usage
868
+ // async openDatabase() {
869
+ // if (this.db) return this.db;
870
+
871
+ // return new Promise((resolve, reject) => {
872
+ // const request = indexedDB.open(this.dbName, this.dbVersion);
873
+
874
+ // request.onsuccess = event => {
875
+ // this.db = event.target.result;
876
+ // resolve(this.db);
877
+ // };
878
+ // request.onerror = event => {
879
+ // reject(event.target.error);
880
+ // };
881
+ // });
882
+ // }
118
883
  }