@gudhub/core 1.2.4-beta.0 → 1.2.4-beta.10

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.
@@ -4,86 +4,227 @@ import { AppHttpService } from "../httpService/AppHttpService.js";
4
4
  import { objectAssignWithOverride } from "../utils.js";
5
5
  import { IndexedDBService } from "./IndexedDBService.js";
6
6
 
7
+ import { IndexedDBChunkService } from "./IndexedDBChunkService.js";
8
+ import { chunksConf } from "./chunkDataConf.js";
9
+
7
10
 
8
11
  //this should be global in project
9
12
  // class IndexedDBFacade extends CacheService {
10
13
 
11
14
  // }
12
15
 
13
- export class IndexedDBAppService extends AppDataService {
14
- constructor(req, conf) {
15
- super(req, conf);
16
+
17
+ //todo андрей сказал чанки два раза грузятся
18
+ //при первой загрузке когда нет бд ничего не отображается
19
+ //андрей предлагает грохать бд если проблемы со сторами
20
+
21
+ export class IndexedDBAppServiceForWorker extends AppDataService {
22
+ constructor(req, conf, gudhub) {
23
+ super(req, conf, gudhub);
16
24
 
17
- this.dataService = new AppHttpService(req);
25
+ this.dataService = new AppHttpService(req, conf, gudhub);
18
26
 
19
27
  let indexDBService = new IndexedDBService(conf);
20
28
 
29
+ this.gudhub = gudhub;
30
+
31
+
32
+ this.chunkDataService = new IndexedDBChunkService(req, chunksConf, gudhub);
33
+
34
+
35
+
36
+ //TODO also think how to use AppDataService without overriding chunkDataService here. seems it gets http chunk service for worker somehow
37
+ // maybe IS_WEB is wrong inside worker
38
+
39
+
40
+
41
+
42
+
43
+
44
+ //todo worker pool?
45
+
21
46
  objectAssignWithOverride(this, indexDBService);
22
47
  }
23
48
 
24
49
 
25
50
  static [Symbol.hasInstance](instance) {
26
- if (instance instanceof IndexedDBService) return true;
27
- if (instance.chunkDataService instanceof IndexedDBAppService) return true;
28
- return false;
51
+ try {
52
+ if (instance instanceof IndexedDBAppServiceForWorker) return true;
53
+ if (instance instanceof IndexedDBService) return true; //TODO requires multiple inheritance, thhink how to overcome it
54
+ return false;
55
+ } catch (error) {
56
+ return false;
57
+ }
29
58
  }
30
59
 
31
60
  //TODO use IndexedDBFacade here
32
61
  // indexDBAccess = new IndexedDBFacade;
33
62
 
34
63
 
35
- async getApp(id) {
36
- if (this.requestCache.has(id)) return this.requestCache.get(id);
64
+ isWithCache() {
65
+ return true;
66
+ }
37
67
 
38
- let dataServiceRequest = this.dataService.getApp(id);
68
+ // getApp(id) {
69
+ // let worker = new Worker('../../appRequestWorker.js');
39
70
 
40
- dataServiceRequest.then(data => this.putApp(id, data));
41
71
 
42
- try {
43
- let self = this;
72
+ // worker.postMessage({ type: 'init', gudhubSerialized: this.gudhub.serialized });
44
73
 
45
- let pr = new Promise(async (resolve, reject) => {
46
- try {
47
- const db = await self.openDatabase();
48
- const transaction = db.transaction(self.store, "readonly");
49
- const store = transaction.objectStore(self.store);
50
-
51
- const storeRequest = store.get(id);
74
+ // // Send the main data to be processed
75
+ // const mainData = { /* your data here */ };
76
+ // worker.postMessage({ type: 'processData', data: mainData });
77
+
78
+ // worker.onmessage = function(e) {
79
+ // console.log('Data processed by worker:', e.data);
80
+ // };
81
+
82
+ // worker.onerror = function(e) {
83
+ // console.error('Error in worker:', e);
84
+ // };
52
85
 
53
- storeRequest.onsuccess = (e) => {
54
-
55
- let cachedData = e.target.result;
56
-
57
- if (
58
- !cachedData
59
- ) {
60
- reject();
61
- }
86
+
87
+ // worker.onmessage = (msgEv) => {
62
88
 
63
- if (
64
- cachedData
65
- ) {
66
- resolve(cachedData);
67
- }
68
- };
89
+ // }
90
+
91
+
92
+
93
+ // }
94
+
95
+ async getApp(id) {
96
+ // if (this.requestCache.has(id)) return this.requestCache.get(id);
97
+
98
+ let self = this;
99
+
100
+ // let dataServiceRequest = this.dataService.getAppWithoutProcessing(id);
101
+ let data = await this.dataService.getAppWithoutProcessing(id);
102
+
103
+ let processedData = await self.processRequestedApp(id, data);//here
104
+
105
+
106
+ self.putApp(id, processedData);
107
+
108
+
109
+ return processedData;
110
+
111
+ let pr = new Promise(async (resolve, reject) => {
112
+ try {
113
+ const db = await self.openDatabase();
114
+ const transaction = db.transaction(self.store, "readonly");
115
+ const store = transaction.objectStore(self.store);
69
116
 
70
- storeRequest.onerror = reject
71
- } catch (error) {
72
- reject();
73
- }
74
- });
117
+ const storeRequest = store.get(id);
118
+
119
+ storeRequest.onsuccess = (e) => {
120
+
121
+ let cachedData = e.target.result;
122
+
123
+ if (
124
+ !cachedData
125
+ ) {
126
+ dataServiceRequest.then(async data => {
127
+ let processedData = await self.processRequestedApp(id, data);//here
128
+
129
+
130
+ // let comparison = this.gudhub.util.compareItems([], processedData.items_list);
131
+
132
+ // let cached
75
133
 
76
- self.requestCache.set(id, pr);
134
+ resolve(processedData);
77
135
 
78
- await pr;
136
+ self.putApp(id, processedData);
137
+
138
+ }, reject);
139
+ }
79
140
 
80
- return pr;
141
+ if (
142
+ cachedData
143
+ ) {
144
+ // resolve(cachedData);
81
145
 
82
- } catch(e) {
83
- this.requestCache.set(id, dataServiceRequest);
146
+ dataServiceRequest.then(async data => {
147
+ let processedData = await self.processRequestedApp(id, data);//here
84
148
 
85
- return dataServiceRequest;
86
- }
149
+ // let comparison = this.gudhub.util.compareItems(cachedData.items_list, processedData.items_list);
150
+
151
+ resolve(processedData);
152
+ self.putApp(id, processedData);
153
+ });
154
+ }
155
+ };
156
+
157
+ storeRequest.onerror = () => {
158
+ dataServiceRequest.then(async data => {
159
+ let processedData = await self.processRequestedApp(id, data);//here
160
+
161
+ // let comparison = this.gudhub.util.compareItems([], processedData.items_list);
162
+
163
+ // let cached
164
+
165
+ resolve(processedData);
166
+
167
+ self.putApp(id, processedData);
168
+
169
+ }, reject);
170
+ }
171
+ } catch (error) {
172
+ dataServiceRequest.then(async data => {
173
+ let processedData = await self.processRequestedApp(id, data);//here
174
+
175
+ // let comparison = this.gudhub.util.compareItems([], processedData.items_list);
176
+
177
+ // let cached
178
+
179
+ resolve(processedData);
180
+
181
+ self.putApp(id, processedData);
182
+
183
+ }, reject);
184
+ }
185
+ });
186
+
187
+ // self.requestCache.set(id, pr);
188
+
189
+ return pr;
190
+ }
191
+
192
+ async getCached(id) {
193
+
194
+ let self = this;
195
+
196
+ let pr = new Promise(async (resolve, reject) => {
197
+ try {
198
+ const db = await self.openDatabase();
199
+ const transaction = db.transaction(self.store, "readonly");
200
+ const store = transaction.objectStore(self.store);
201
+
202
+ const storeRequest = store.get(id);
203
+
204
+ storeRequest.onsuccess = (e) => {
205
+
206
+ let cachedData = e.target.result;
207
+
208
+ if (
209
+ !cachedData
210
+ ) {
211
+ reject();
212
+ }
213
+
214
+ if (
215
+ cachedData
216
+ ) {
217
+ resolve(cachedData);
218
+ }
219
+ };
220
+
221
+ storeRequest.onerror = reject;
222
+ } catch (error) {
223
+ reject();
224
+ }
225
+ });
226
+
227
+ return pr;
87
228
  }
88
229
 
89
230
  async putApp(id, data) {
@@ -111,4 +252,291 @@ export class IndexedDBAppService extends AppDataService {
111
252
  };
112
253
  });
113
254
  }
255
+ }
256
+
257
+
258
+ export class IndexedDBAppService extends AppDataService {
259
+ constructor(req, conf, gudhub) {
260
+ super(req, conf, gudhub);
261
+
262
+ this.dataService = new AppHttpService(req, conf, gudhub);
263
+
264
+ let indexDBService = new IndexedDBService(conf);
265
+
266
+ this.gudhub = gudhub;
267
+
268
+
269
+ this.resolveFnMap = new Map; // id -> resolve
270
+
271
+
272
+
273
+ // this.appRequestAndProcessWorker = new Worker('./appRequestWorker.js');
274
+ // this.appRequestAndProcessWorker = new Worker(new URL('./appRequestWorker.js', import.meta.url));
275
+ this.appRequestAndProcessWorker = new Worker('node_modules/@gudhub/core/umd/appRequestWorker.js');
276
+ // this.appRequestAndProcessWorker = new AppRequestWorker();
277
+
278
+ // new Worker(new URL('./worker.js', import.meta.url));
279
+
280
+
281
+ this.appRequestAndProcessWorker.postMessage({ type: 'init', gudhubSerialized: this.gudhub.serialized });
282
+
283
+
284
+ let self = this;
285
+ this.appRequestAndProcessWorker.onerror = function(e) {
286
+ // self.appRequestAndProcessWorker.terminate();
287
+
288
+
289
+ // console.error('Error in worker:', e);
290
+ };
291
+
292
+
293
+ // let self = this;
294
+
295
+ this.appRequestAndProcessWorker.onmessage = function(e) {
296
+
297
+
298
+
299
+
300
+
301
+ if (
302
+ e.data.type == 'requestApp'
303
+ ) {
304
+
305
+ if (
306
+ self.resolveFnMap.has(e.data.id)
307
+ ) {
308
+ let resolver = self.resolveFnMap.get(e.data.id);
309
+
310
+ resolver(e.data.data);
311
+ }
312
+
313
+
314
+ // self.requestCache.set(id, new Promise);
315
+
316
+ }
317
+
318
+
319
+
320
+ if (
321
+ e.data.type == 'processData'
322
+ ) {
323
+ // if (id == e.data.id) {
324
+ self.gudhub.itemProcessor.handleDiff(e.data.id, e.data.compareRes);
325
+ // }
326
+ }
327
+
328
+
329
+
330
+
331
+
332
+
333
+ // worker.terminate();
334
+
335
+ // this.postMessage({id: e.data.id, compareRes: comparison});
336
+
337
+
338
+ // console.log('Data processed by worker:', e.data);
339
+ };
340
+
341
+ // worker.onerror = function(e) {
342
+ // // worker.terminate();
343
+
344
+
345
+ // // console.error('Error in worker:', e);
346
+ // };
347
+
348
+
349
+
350
+ //todo worker pool?
351
+
352
+ objectAssignWithOverride(this, indexDBService);
353
+ }
354
+
355
+
356
+ static [Symbol.hasInstance](instance) {
357
+ try {
358
+ if (instance instanceof IndexedDBAppService) return true;
359
+ if (instance instanceof IndexedDBService) return true; //TODO requires multiple inheritance, thhink how to overcome it
360
+ return false;
361
+ } catch (error) {
362
+ return false;
363
+ }
364
+ }
365
+
366
+ //TODO use IndexedDBFacade here
367
+ // indexDBAccess = new IndexedDBFacade;
368
+
369
+
370
+ isWithCache() {
371
+ return true;
372
+ }
373
+
374
+ async getApp(id) {
375
+ if (this.requestCache.has(id)) return this.requestCache.get(id);
376
+
377
+
378
+ let self = this;
379
+
380
+
381
+ let hasId = await this.has(id);
382
+
383
+
384
+ if (
385
+ hasId
386
+ ) {
387
+ let getFromDBPrms = this.getCached(id);
388
+
389
+ this.requestCache.set(id, getFromDBPrms);
390
+
391
+ this.appRequestAndProcessWorker.postMessage({ type: 'processData', id: id });
392
+
393
+ return getFromDBPrms;
394
+ } else {
395
+ // this.requestCache.set(id, new Promise);
396
+
397
+ let prms = new Promise((resolve, reject) => {
398
+ self.resolveFnMap.set(id, resolve);
399
+ });
400
+
401
+
402
+ this.requestCache.set(id, prms);
403
+
404
+ //todo define types as constants
405
+ this.appRequestAndProcessWorker.postMessage({ type: 'requestApp', id: id });
406
+
407
+
408
+
409
+ return prms;
410
+
411
+ //todo somehow handle answer from worker
412
+
413
+ //maybe use mesage library to communicate with worker
414
+ }
415
+
416
+
417
+
418
+
419
+ // let worker = new Worker('./appRequestWorker.js');
420
+
421
+
422
+ // worker.postMessage({ type: 'init', gudhubSerialized: this.gudhub.serialized });
423
+
424
+ // Send the main data to be processed
425
+ // const mainData = { /* your data here */ };
426
+ // this.appRequestAndProcessWorker.postMessage({ type: 'processData', id: id });
427
+
428
+ // let self = this;
429
+
430
+ // worker.onmessage = function(e) {
431
+
432
+
433
+ // if (id == e.data.id) {
434
+ // self.gudhub.itemProcessor.handleDiff(e.data.id, e.data.compareRes);
435
+ // }
436
+
437
+
438
+
439
+ // // worker.terminate();
440
+
441
+ // // this.postMessage({id: e.data.id, compareRes: comparison});
442
+
443
+
444
+ // // console.log('Data processed by worker:', e.data);
445
+ // };
446
+
447
+ // worker.onerror = function(e) {
448
+ // // worker.terminate();
449
+
450
+
451
+ // // console.error('Error in worker:', e);
452
+ // };
453
+
454
+
455
+ // return getFromDBPrms;
456
+
457
+
458
+
459
+ }
460
+
461
+
462
+ //TODO page isnt loaded when indexeddb empty. Investigate getApp in IndexedDBAppService here
463
+
464
+ async getCached(id) {
465
+
466
+ let self = this;
467
+
468
+ let pr = new Promise(async (resolve, reject) => {
469
+ try {
470
+ const db = await self.openDatabase();
471
+ const transaction = db.transaction(self.store, "readonly");
472
+ const store = transaction.objectStore(self.store);
473
+
474
+ const storeRequest = store.get(id);
475
+
476
+ storeRequest.onsuccess = (e) => {
477
+
478
+ let cachedData = e.target.result;
479
+
480
+ if (
481
+ !cachedData
482
+ ) {
483
+ reject();
484
+ }
485
+
486
+ if (
487
+ cachedData
488
+ ) {
489
+ resolve(cachedData);
490
+ }
491
+ };
492
+
493
+ storeRequest.onerror = reject;
494
+ } catch (error) {
495
+ reject();
496
+ }
497
+ });
498
+
499
+ return pr;
500
+ }
501
+
502
+ async has(id) {
503
+ try {
504
+ let cached = await this.getCached(id);
505
+
506
+ if (!cached) return false;
507
+
508
+ return true;
509
+ } catch(e) {
510
+ //todo check error type and then rethrow maybe here
511
+
512
+ return false;
513
+ }
514
+ }
515
+
516
+ async putApp(id, data) {
517
+ try {
518
+ const db = await this.openDatabase();
519
+
520
+ const transaction = db.transaction(this.store, "readwrite");
521
+ const store = transaction.objectStore(this.store);
522
+
523
+ store.put(data, id);
524
+ } catch (error) {
525
+
526
+ }
527
+ }
528
+
529
+ //todo openDatabase only once and then preserve it for further usage
530
+ async openDatabase() {
531
+ return new Promise((resolve, reject) => {
532
+ const request = indexedDB.open(this.dbName, this.dbVersion);
533
+
534
+ request.onsuccess = event => {
535
+ resolve(event.target.result);
536
+ };
537
+ request.onerror = event => {
538
+ reject(event.target.error);
539
+ };
540
+ });
541
+ }
114
542
  }
@@ -17,14 +17,15 @@ import { IndexedDBService } from "./IndexedDBService.js";
17
17
 
18
18
 
19
19
  export class IndexedDBChunkService extends ChunkDataService {
20
- constructor(req, conf) {
20
+ constructor(req, conf, gudhub) {
21
21
  super(req, conf);
22
22
 
23
23
  this.dataService = new ChunkHttpService(req);
24
24
 
25
-
26
25
  let indexDBService = new IndexedDBService(conf);
27
26
 
27
+ this.gudhub = gudhub;
28
+
28
29
  objectAssignWithOverride(this, indexDBService);
29
30
  }
30
31
 
@@ -34,9 +35,13 @@ export class IndexedDBChunkService extends ChunkDataService {
34
35
 
35
36
 
36
37
  static [Symbol.hasInstance](instance) {
37
- if (instance instanceof IndexedDBService) return true;
38
- if (instance.chunkDataService instanceof IndexedDBChunkService) return true;
39
- return false;
38
+ try {
39
+ if (instance instanceof IndexedDBChunkService) return true;
40
+ if (instance instanceof IndexedDBService) return true; //TODO requires multiple inheritance, thhink how to overcome it
41
+ return false;
42
+ } catch (error) {
43
+ return false;
44
+ }
40
45
  }
41
46
 
42
47
 
@@ -56,6 +61,61 @@ export class IndexedDBChunkService extends ChunkDataService {
56
61
  }
57
62
 
58
63
 
64
+ // async getApp(id) {
65
+ // if (this.requestCache.has(id)) return this.requestCache.get(id);
66
+
67
+ // let self = this;
68
+
69
+ // let dataServiceRequest = this.dataService.getApp(id);
70
+
71
+ // let pr = new Promise(async (resolve, reject) => {
72
+ // try {
73
+ // const db = await self.openDatabase();
74
+ // const transaction = db.transaction(self.store, "readonly");
75
+ // const store = transaction.objectStore(self.store);
76
+
77
+ // const storeRequest = store.get(id);
78
+
79
+ // storeRequest.onsuccess = (e) => {
80
+
81
+ // let cachedData = e.target.result;
82
+
83
+ // if (
84
+ // !cachedData
85
+ // ) {
86
+ // dataServiceRequest.then(resolve, reject);
87
+ // dataServiceRequest.then(data => self.putApp(id, data));
88
+ // }
89
+
90
+ // if (
91
+ // cachedData
92
+ // ) {
93
+ // resolve(cachedData);
94
+
95
+ // dataServiceRequest.then(async (data) => {
96
+ // // self.gudhub.processAppUpd(data, cachedData);//
97
+ // await self.putApp(id, data);
98
+ // self.gudhub.triggerAppUpdate(id, prevVersion, newVersion);
99
+ // });
100
+ // }
101
+ // };
102
+
103
+ // storeRequest.onerror = () => {
104
+ // dataServiceRequest.then(resolve, reject);
105
+ // dataServiceRequest.then(data => self.putApp(id, data));
106
+ // }
107
+ // } catch (error) {
108
+ // dataServiceRequest.then(resolve, reject);
109
+ // dataServiceRequest.then(data => self.putApp(id, data));
110
+ // }
111
+ // });
112
+
113
+ // self.requestCache.set(id, pr);
114
+
115
+ // return pr;
116
+ // }
117
+
118
+
59
119
  async getChunk(app_id, id) {
60
120
  if (this.requestCache.has(id)) return this.requestCache.get(id);
61
121
 
@@ -108,6 +168,7 @@ export class IndexedDBChunkService extends ChunkDataService {
108
168
  let res = await reqPrms;
109
169
 
110
170
  this.putChunk(id, res);
171
+ // putPrms.then(() => self.gudhub.triggerAppUpdate(id));
111
172
 
112
173
  return reqPrms;
113
174
  }