diff --git a/src/common/command/snapshot/segment/page-segment-add-ref.command.ts b/src/common/command/snapshot/segment/page-segment-add-ref.command.ts new file mode 100644 index 0000000..048af57 --- /dev/null +++ b/src/common/command/snapshot/segment/page-segment-add-ref.command.ts @@ -0,0 +1,41 @@ +/* + * This file is part of the pinmenote-extension distribution (https://github.com/pinmenote/pinmenote-extension). + * Copyright (c) 2023 Michal Szczepanski. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +import { BrowserStorage } from '@pinmenote/browser-api'; +import { ICommand } from '../../../model/shared/common.dto'; +import { ObjectStoreKeys } from '../../../keys/object.store.keys'; +import { SegmentData } from '@pinmenote/page-compute'; +import { fnConsoleLog } from '../../../fn/fn-console'; + +export class PageSegmentAddRefCommand implements ICommand> { + constructor(private hash: string) {} + + async execute(): Promise { + const key = `${ObjectStoreKeys.CONTENT_HASH}:${this.hash}`; + const has = await BrowserStorage.get(key); + if (!has) return false; + await this.incrementCount(); + return true; + } + + async incrementCount(): Promise { + const key = `${ObjectStoreKeys.CONTENT_HASH_COUNT}:${this.hash}`; + let count = (await BrowserStorage.get(key)) || 0; + count++; + fnConsoleLog('PageSegmentAddRefCommand->incrementCount', count); + await BrowserStorage.set(key, count); + } +} diff --git a/src/common/command/snapshot/segment/page-segment-add.command.ts b/src/common/command/snapshot/segment/page-segment-add.command.ts index 46f4d25..9ebe1c5 100644 --- a/src/common/command/snapshot/segment/page-segment-add.command.ts +++ b/src/common/command/snapshot/segment/page-segment-add.command.ts @@ -21,12 +21,12 @@ import { SegmentData } from '@pinmenote/page-compute'; import { fnConsoleLog } from '../../../fn/fn-console'; export class PageSegmentAddCommand implements ICommand> { - constructor(private content: SegmentData) {} + constructor(private content: SegmentData, private ref = true) {} async execute(): Promise { const key = `${ObjectStoreKeys.CONTENT_HASH}:${this.content.hash}`; await BrowserStorage.set>(key, this.content); - await this.incrementCount(); + if (this.ref) await this.incrementCount(); } async incrementCount(): Promise { diff --git a/src/common/keys/object.store.keys.ts b/src/common/keys/object.store.keys.ts index 51cd999..8b997ff 100644 --- a/src/common/keys/object.store.keys.ts +++ b/src/common/keys/object.store.keys.ts @@ -32,6 +32,7 @@ export class ObjectStoreKeys { static readonly UPDATED_DT = 'o:dt:u'; static readonly TX_ID = 'tx:id'; + static readonly SERVER_ID = 'sv:id'; // INDEX static readonly SEARCH_INDEX = 's:i'; @@ -48,6 +49,7 @@ export class ObjectStoreKeys { // SYNC static readonly SYNC_INTERVAL = 'sync:interval'; static readonly SYNC_PROGRESS = 'sync:progress'; + static readonly SYNC_IN = 'sync:obj:in'; static readonly SYNC_TX = 'sync:tx'; // SETTINGS diff --git a/src/common/store/link-href.store.ts b/src/common/store/link-href.store.ts index 0459c81..2cce439 100644 --- a/src/common/store/link-href.store.ts +++ b/src/common/store/link-href.store.ts @@ -26,7 +26,6 @@ export class LinkHrefStore { static async add(url: ObjUrlDto, id: number): Promise { // Update hrefs - fnConsoleLog('LinkHrefStore->addHrefOriginId', url.href); const hrefIds = await this.hrefIds(url.href); hrefIds.push(id); await BrowserStorage.set(`${this.OBJ_HREF}:${url.href}`, hrefIds); @@ -48,7 +47,6 @@ export class LinkHrefStore { } static async hrefIds(url: string): Promise { - fnConsoleLog('LinkHrefStore->hrefIds', url); const key = `${this.OBJ_HREF}:${url}`; const value = await BrowserStorage.get(key); return value || []; diff --git a/src/common/store/link-origin.store.ts b/src/common/store/link-origin.store.ts index fa69be3..02d886f 100644 --- a/src/common/store/link-origin.store.ts +++ b/src/common/store/link-origin.store.ts @@ -46,14 +46,13 @@ export class LinkOriginStore { } static async originIds(keyPrefix: string, url: string): Promise { - fnConsoleLog('LinkOriginStore->originIds', url); + // fnConsoleLog('LinkOriginStore->originIds', url); const key = `${keyPrefix}:${url}`; const value = await BrowserStorage.get(key); return value || []; } static async originList(): Promise { - fnConsoleLog('LinkOriginStore->list'); const value = await BrowserStorage.get(this.ORIGIN_LIST); return value || []; } diff --git a/src/service-worker/command/api/store/api-store.model.ts b/src/service-worker/command/api/store/api-store.model.ts index 075675c..a41c3f9 100644 --- a/src/service-worker/command/api/store/api-store.model.ts +++ b/src/service-worker/command/api/store/api-store.model.ts @@ -15,10 +15,6 @@ * along with this program. If not, see . */ import { ObjTypeDto } from '../../../../common/model/obj/obj.dto'; -import { ObjPinDto } from '../../../../common/model/obj/obj-pin.dto'; -import { ObjCommentDto } from '../../../../common/model/obj/obj-comment.dto'; -import { ObjDrawDto } from '../../../../common/model/obj/obj-draw.dto'; -import { ObjVideoDataDto } from '../../../../common/model/obj/page-snapshot.dto'; export interface BeginTxResponse { tx: string; diff --git a/src/service-worker/command/api/store/obj/api-obj-get-by-hash.command.ts b/src/service-worker/command/api/store/obj/api-obj-get-by-hash.command.ts index 540a2ae..e1d8e8f 100644 --- a/src/service-worker/command/api/store/obj/api-obj-get-by-hash.command.ts +++ b/src/service-worker/command/api/store/obj/api-obj-get-by-hash.command.ts @@ -16,7 +16,6 @@ */ import { ApiCallBase } from '../../api-call.base'; -import { ObjTypeDto } from '../../../../../common/model/obj/obj.dto'; import { ICommand, ServerErrorDto } from '../../../../../common/model/shared/common.dto'; import { ApiErrorCode } from '../../../../../common/model/shared/api.error-code'; import { FetchService } from '@pinmenote/fetch-service'; diff --git a/src/service-worker/command/api/store/obj/api-obj-get-changes.command.ts b/src/service-worker/command/api/store/obj/api-obj-get-changes.command.ts index 90131f5..eccd306 100644 --- a/src/service-worker/command/api/store/obj/api-obj-get-changes.command.ts +++ b/src/service-worker/command/api/store/obj/api-obj-get-changes.command.ts @@ -21,7 +21,7 @@ import { fnConsoleLog } from '../../../../../common/fn/fn-console'; import { ObjChangesResponse } from '../api-store.model'; export class ApiObjGetChangesCommand extends ApiCallBase implements ICommand> { - constructor() { + constructor(private serverId?: number) { super(); } async execute(): Promise { @@ -29,7 +29,7 @@ export class ApiObjGetChangesCommand extends ApiCallBase implements ICommand( - `${this.storeUrl}/api/v1/obj/changes`, + `${this.storeUrl}/api/v1/obj/changes?serverId=${this.serverId || 0}`, { headers: this.getAuthHeaders() }, this.refreshParams() ); diff --git a/src/service-worker/command/api/store/segment/api-segment-get-children.command.ts b/src/service-worker/command/api/store/segment/api-segment-get-children.command.ts index 8d88059..93e8663 100644 --- a/src/service-worker/command/api/store/segment/api-segment-get-children.command.ts +++ b/src/service-worker/command/api/store/segment/api-segment-get-children.command.ts @@ -36,10 +36,10 @@ export class ApiSegmentGetChildrenCommand { headers: this.getAuthHeaders() }, this.refreshParams() ); - fnConsoleLog('ApiSegmentGetChildrenCommand->response', resp); return resp.data; } catch (e) { fnConsoleLog('ApiSegmentGetChildrenCommand->Error', e); } + throw new Error('ApiSegmentGetChildrenCommand->execute'); } } diff --git a/src/service-worker/command/api/store/segment/api-segment-get.command.ts b/src/service-worker/command/api/store/segment/api-segment-get.command.ts index cb0ca4a..2a05909 100644 --- a/src/service-worker/command/api/store/segment/api-segment-get.command.ts +++ b/src/service-worker/command/api/store/segment/api-segment-get.command.ts @@ -17,7 +17,6 @@ import { ApiCallBase } from '../../api-call.base'; import { FetchService } from '@pinmenote/fetch-service'; import { ICommand } from '../../../../../common/model/shared/common.dto'; -import { ObjSingleChange, SegmentHashListResponse } from '../api-store.model'; import { fnConsoleLog } from '../../../../../common/fn/fn-console'; export class ApiSegmentGetCommand extends ApiCallBase implements ICommand> { @@ -37,5 +36,6 @@ export class ApiSegmentGetCommand extends ApiCallBase implements ICommandError', e); } + throw new Error('ApiSegmentGetCommand->execute'); } } diff --git a/src/service-worker/command/sync/incoming/sync-obj-incoming-hash.command.ts b/src/service-worker/command/sync/incoming/sync-obj-incoming-hash.command.ts index fa7d5a1..fe1e549 100644 --- a/src/service-worker/command/sync/incoming/sync-obj-incoming-hash.command.ts +++ b/src/service-worker/command/sync/incoming/sync-obj-incoming-hash.command.ts @@ -31,6 +31,10 @@ import { ObjectStoreKeys } from '../../../../common/keys/object.store.keys'; import { LinkHrefStore } from '../../../../common/store/link-href.store'; import { ObjAddIdCommand } from '../../../../common/command/obj/id/obj-add-id.command'; import { PageSegmentAddCommand } from '../../../../common/command/snapshot/segment/page-segment-add.command'; +import { ObjNextIdCommand } from '../../../../common/command/obj/id/obj-next-id.command'; +import { PageSegmentAddRefCommand } from '../../../../common/command/snapshot/segment/page-segment-add-ref.command'; +import { fnSleep } from '../../../../common/fn/fn-sleep'; +import { fnConsoleLog } from '../../../../common/fn/fn-console'; interface HashDataElement { hash: SegmentSingleHash; @@ -40,11 +44,26 @@ interface HashDataElement { type HashData = { [key: string]: HashDataElement }; type HashType = { [key: string]: string[] }; -export class SyncObjIncomingHashCommand implements ICommand> { +export class SyncObjIncomingHashCommand implements ICommand> { constructor(private change: ObjSingleChange) {} - async execute(): Promise { + // TODO store progress in ObjectStoreKeys.SYNC_IN + async execute(): Promise { + try { + const result = await this.syncHashList(); + if (!result) { + fnConsoleLog('PROBLEM syncHashList !!!!!!!!!!!!!!!!!!!', result); + return false; + } + return await this.toDto(result.hashMap, result.hashType); + } catch (e) { + fnConsoleLog('PROBLEM 222222222222 SyncObjIncomingHashCommand->syncHashList', e); + return false; + } + } + + private syncHashList = async (): Promise<{ hashType: HashType; hashMap: HashData } | undefined> => { const hashList = await new ApiSegmentGetChildrenCommand(this.change.hash).execute(); - if (!hashList) return; + if (!hashList) return undefined; hashList.children.sort((a, b) => { if (a.type > b.type) return 1; if (a.type < b.type) return -1; @@ -59,6 +78,8 @@ export class SyncObjIncomingHashCommand implements ICommand> { if (child.type.toString() === SyncHashType.Img) { const src = await UrlFactory.toDataUri(data); const content: SegmentImg = { src }; + const has = new PageSegmentAddRefCommand(child.hash); + if (has) continue; await new PageSegmentAddCommand({ type: SegmentType.IMG, hash: child.hash, content }).execute(); continue; } @@ -67,12 +88,16 @@ export class SyncObjIncomingHashCommand implements ICommand> { const content = new TextDecoder().decode(bytes); if (child.type.toString() === SyncHashType.Css) { + const has = new PageSegmentAddRefCommand(child.hash); + if (has) continue; await new PageSegmentAddCommand({ type: SegmentType.CSS, hash: child.hash, content: JSON.parse(content) }).execute(); } else if (child.type.toString() === SyncHashType.IFrame) { + const has = new PageSegmentAddRefCommand(child.hash); + if (has) continue; await new PageSegmentAddCommand({ type: SegmentType.IFRAME, hash: child.hash, @@ -84,65 +109,81 @@ export class SyncObjIncomingHashCommand implements ICommand> { hashMap[child.hash] = { hash: child, data: JSON.parse(content) }; } } - console.log('hashList', hashList, 'hashMap', hashMap, 'hashType', hashType); - await this.toDto(hashMap, hashType); - } + return { hashMap, hashType }; + }; private toDto = async (hashData: HashData, type: HashType) => { switch (this.change.type) { case ObjTypeDto.PageSnapshot: case ObjTypeDto.PageElementSnapshot: { - const key = `${ObjectStoreKeys.OBJECT_ID}:${this.change.serverId}`; - const stored = await BrowserStorage.get(key); - if (stored) return; - const snapshot: PageSnapshotDto = { - data: hashData[type[SyncHashType.PageSnapshotDataDto][0]].data, - info: hashData[type[SyncHashType.PageSnapshotInfoDto][0]].data, - hash: this.change.hash, - segment: type[SyncHashType.PageSnapshotFirstHash][0] - }; - const data: ObjPageDto = { - snapshot: snapshot, - comments: { data: [] } - }; - const id = this.change.serverId; - const dt = Date.now(); - // Add createdAt, updatedAt, VERSION ----> TO SERVER - const obj: ObjDto = { - id, - data, - server: { id: this.change.serverId }, - version: OBJ_DTO_VERSION, - createdAt: dt, - updatedAt: dt, - type: this.change.type, - local: { - visible: true, - drawVisible: false - } - }; - await SwTaskStore.addTask(SwTaskType.WORDS_ADD_INDEX, { - words: snapshot.info.words, - objectId: id - }); - await BrowserStorage.set(key, obj); - await LinkHrefStore.add(snapshot.info.url, id); - if (type[SyncHashType.PageSnapshotFirstHash]) { - for (const hash of type[SyncHashType.PageSnapshotFirstHash]) { - console.log('ADDDD !!!!!!!!!!!!!!!!', hash); - await new PageSegmentAddCommand({ - type: SegmentType.SNAPSHOT, - content: hashData[hash].data, - hash: hash - }).execute(); - } - } - await new ObjAddIdCommand({ id, dt }, ObjectStoreKeys.OBJECT_LIST).execute(); - console.log('AAAAAAAAAAAAAAAAAAAAAA'); - break; + return await this.saveSnapshotDto(hashData, type); } default: throw new Error(`Unsupported type ${this.change.type}`); } + await fnSleep(100); + return true; + }; + + private saveSnapshotDto = async (hashData: HashData, type: HashType): Promise => { + const stored = await BrowserStorage.get(`${ObjectStoreKeys.SERVER_ID}:${this.change.serverId}`); + if (stored) return true; + + const segmentArray = type[SyncHashType.PageSnapshotFirstHash]; + let segment = undefined; + if (segmentArray && segmentArray.length === 1) { + segment = segmentArray[0]; + } + + const snapshot: PageSnapshotDto = { + data: hashData[type[SyncHashType.PageSnapshotDataDto][0]].data, + info: hashData[type[SyncHashType.PageSnapshotInfoDto][0]].data, + hash: this.change.hash, + segment + }; + // TODO - sync incoming comments !!!!!!!!!!! + const data: ObjPageDto = { + snapshot: snapshot, + comments: { data: [] } + }; + const id = await new ObjNextIdCommand().execute(); + const dt = Date.now(); + // Add createdAt, updatedAt, VERSION ----> TO SERVER + const obj: ObjDto = { + id, + data, + server: { id: this.change.serverId }, + version: OBJ_DTO_VERSION, + createdAt: dt, + updatedAt: dt, + type: this.change.type, + local: { + visible: true, + drawVisible: false + } + }; + await SwTaskStore.addTask(SwTaskType.WORDS_ADD_INDEX, { + words: snapshot.info.words, + objectId: id + }); + + if (segment) { + for (const hash of type[SyncHashType.PageSnapshotFirstHash]) { + const has = new PageSegmentAddRefCommand(hash); + if (has) continue; + await new PageSegmentAddCommand({ + type: SegmentType.SNAPSHOT, + content: hashData[hash].data, + hash + }).execute(); + } + } + + await BrowserStorage.set(`${ObjectStoreKeys.OBJECT_ID}:${id}`, obj); + await BrowserStorage.set(`${ObjectStoreKeys.SERVER_ID}:${this.change.serverId}`, id); + await LinkHrefStore.add(snapshot.info.url, id); + await new ObjAddIdCommand({ id, dt }, ObjectStoreKeys.OBJECT_LIST).execute(); + + return true; }; } diff --git a/src/service-worker/command/sync/outgoing/sync-object.command.ts b/src/service-worker/command/sync/outgoing/sync-object.command.ts index 2cd94d0..1a3213b 100644 --- a/src/service-worker/command/sync/outgoing/sync-object.command.ts +++ b/src/service-worker/command/sync/outgoing/sync-object.command.ts @@ -14,6 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +import { BrowserStorage } from '@pinmenote/browser-api'; import { ICommand, ServerErrorDto } from '../../../../common/model/shared/common.dto'; import { ObjDto } from '../../../../common/model/obj/obj.dto'; import { fnConsoleLog } from '../../../../common/fn/fn-console'; @@ -21,6 +22,7 @@ import { ApiObjAddCommand, ObjAddResponse } from '../../api/store/obj/api-obj-ad import { BeginTxResponse, ObjSingleChange } from '../../api/store/api-store.model'; import { ApiErrorCode } from '../../../../common/model/shared/api.error-code'; import { ApiObjGetByHashCommand } from '../../api/store/obj/api-obj-get-by-hash.command'; +import { ObjectStoreKeys } from '../../../../common/keys/object.store.keys'; export class SyncObjectCommand implements ICommand> { constructor(private obj: ObjDto, private hash: string, private tx: BeginTxResponse) {} @@ -46,10 +48,9 @@ export class SyncObjectCommand implements ICommand> { fnConsoleLog('SyncObjectCommand->setByHash'); throw new Error('PROBLEM !!!!!!!!!!!!!!!'); } - // eslint-disable-next-line @typescript-eslint/require-await private async saveServerId(serverId: number): Promise { this.obj.server = { id: serverId }; - fnConsoleLog('SyncObjectCommand->saveServerId', serverId, 'objId', this.obj.id); - //BrowserStorage.set(`${ObjectStoreKeys.OBJECT_ID}:${this.obj.id}`, this.obj); + await BrowserStorage.set(`${ObjectStoreKeys.OBJECT_ID}:${this.obj.id}`, this.obj); + await BrowserStorage.set(`${ObjectStoreKeys.SERVER_ID}:${serverId}`, this.obj.id); } } diff --git a/src/service-worker/command/sync/outgoing/sync-pin.command.ts b/src/service-worker/command/sync/outgoing/sync-pin.command.ts index 83b08eb..a115a61 100644 --- a/src/service-worker/command/sync/outgoing/sync-pin.command.ts +++ b/src/service-worker/command/sync/outgoing/sync-pin.command.ts @@ -19,7 +19,6 @@ import { ObjDto } from '../../../../common/model/obj/obj.dto'; import { ObjPinDataDto, ObjPinDescription, ObjPinDto } from '../../../../common/model/obj/obj-pin.dto'; import { SyncObjectCommand } from './sync-object.command'; import { SyncObjectStatus } from '../sync.model'; -import { fnConsoleLog } from '../../../../common/fn/fn-console'; import { BeginTxResponse, SyncHashType } from '../../api/store/api-store.model'; import { ApiSegmentAddCommand } from '../../api/store/segment/api-segment-add.command'; import { PinGetCommentCommand } from '../../../../common/command/pin/comment/pin-get-comment.command'; diff --git a/src/service-worker/command/sync/progress/sync-reset-progress.command.ts b/src/service-worker/command/sync/progress/sync-reset-progress.command.ts index aa66d77..c763b64 100644 --- a/src/service-worker/command/sync/progress/sync-reset-progress.command.ts +++ b/src/service-worker/command/sync/progress/sync-reset-progress.command.ts @@ -39,7 +39,7 @@ export class SyncResetProgressCommand implements ICommand> { async resetObjects(): Promise { let listId = await BrowserStorage.get(ObjectStoreKeys.OBJECT_LIST_ID); - console.log('SyncResetProgressCommand->start !!!!', listId); + fnConsoleLog('SyncResetProgressCommand->start !!!!', listId); const a = Date.now(); const toSortSet: Set = new Set(); @@ -50,6 +50,7 @@ export class SyncResetProgressCommand implements ICommand> { const obj = await BrowserStorage.get(`${ObjectStoreKeys.OBJECT_ID}:${id}`); if (obj.server) { + await BrowserStorage.remove(`${ObjectStoreKeys.SERVER_ID}:${obj.server.id}`); delete obj['server']; await BrowserStorage.set(`${ObjectStoreKeys.OBJECT_ID}:${id}`, obj); } diff --git a/src/service-worker/command/sync/sync-index.command.ts b/src/service-worker/command/sync/sync-index.command.ts index 91befa6..9103b63 100644 --- a/src/service-worker/command/sync/sync-index.command.ts +++ b/src/service-worker/command/sync/sync-index.command.ts @@ -17,7 +17,6 @@ import { ObjDto, ObjRemovedDto, ObjTypeDto } from '../../../common/model/obj/obj.dto'; import { ObjNoteDto, ObjPageNoteDto } from '../../../common/model/obj/obj-note.dto'; import { ICommand } from '../../../common/model/shared/common.dto'; -import { ObjDateIndex } from '../../../common/command/obj/index/obj-update-index-add.command'; import { ObjGetCommand } from '../../../common/command/obj/obj-get.command'; import { ObjPageDto } from '../../../common/model/obj/obj-page.dto'; import { ObjPdfDto } from '../../../common/model/obj/obj-pdf.dto'; @@ -30,13 +29,8 @@ import { SyncObjectStatus, SyncProgress } from './sync.model'; import { SyncRemovedCommand } from './outgoing/sync-removed.command'; import { SyncSnapshotCommand } from './outgoing/sync-snapshot.command'; import { fnConsoleLog } from '../../../common/fn/fn-console'; -import { fnSleep } from '../../../common/fn/fn-sleep'; import { BeginTxResponse } from '../api/store/api-store.model'; -export interface SyncIndex extends ObjDateIndex { - status: SyncObjectStatus; -} - export class SyncIndexCommand implements ICommand> { constructor(private progress: SyncProgress, private tx: BeginTxResponse, private id: number) {} @@ -46,43 +40,33 @@ export class SyncIndexCommand implements ICommand> { fnConsoleLog('SyncObjectCommand->syncObject EMPTY', this.id); return SyncObjectStatus.OBJECT_NOT_EXISTS; } - let status = SyncObjectStatus.OK; // Skip for now for those with index - if (obj.server?.id) return status; + if (obj.server?.id) return SyncObjectStatus.OK; switch (obj.type) { case ObjTypeDto.PageSnapshot: case ObjTypeDto.PageElementSnapshot: { - status = await new SyncSnapshotCommand(obj as ObjDto, this.tx).execute(); - break; + return await new SyncSnapshotCommand(obj as ObjDto, this.tx).execute(); } case ObjTypeDto.PageElementPin: { - status = await new SyncPinCommand(obj as ObjDto, this.tx).execute(); - break; + return await new SyncPinCommand(obj as ObjDto, this.tx).execute(); } case ObjTypeDto.Pdf: { - status = await new SyncPdfCommand(obj as ObjDto, this.tx).execute(); - break; + return await new SyncPdfCommand(obj as ObjDto, this.tx).execute(); } case ObjTypeDto.Note: { - status = await new SyncNoteCommand(obj as ObjDto, this.tx).execute(); - break; + return await new SyncNoteCommand(obj as ObjDto, this.tx).execute(); } case ObjTypeDto.PageNote: { - status = await new SyncPageNoteCommand(obj as ObjDto, this.tx).execute(); - break; + return await new SyncPageNoteCommand(obj as ObjDto, this.tx).execute(); } case ObjTypeDto.Removed: { - await new SyncRemovedCommand(obj as ObjDto, this.tx).execute(); - break; + return await new SyncRemovedCommand(obj as ObjDto, this.tx).execute(); } default: { fnConsoleLog('SyncObjectCommand->PROBLEM', obj, 'index', this.id); - break; + return SyncObjectStatus.SERVER_ERROR; } } - if (status < 0) return status; - await fnSleep(100); - return status; } } diff --git a/src/service-worker/command/sync/sync-server.command.ts b/src/service-worker/command/sync/sync-server.command.ts index 7fa5d74..8a6c3e7 100644 --- a/src/service-worker/command/sync/sync-server.command.ts +++ b/src/service-worker/command/sync/sync-server.command.ts @@ -22,12 +22,9 @@ import { SyncProgress } from './sync.model'; import { SyncTxHelper } from './sync-tx.helper'; import { fnConsoleLog } from '../../../common/fn/fn-console'; import { fnDateKeyFormat } from '../../../common/fn/fn-date-format'; -import { TokenStorageGetCommand } from '../../../common/command/server/token/token-storage-get.command'; -import jwtDecode from 'jwt-decode'; -import { TokenDataDto } from '../../../common/model/shared/token.dto'; import { ApiObjGetChangesCommand } from '../api/store/obj/api-obj-get-changes.command'; import { SyncObjIncomingHashCommand } from './incoming/sync-obj-incoming-hash.command'; -import { SyncResetProgressCommand } from './progress/sync-reset-progress.command'; +import { SyncSetProgressCommand } from './progress/sync-set-progress.command'; export class SyncServerCommand implements ICommand> { private static isInSync = false; @@ -38,8 +35,8 @@ export class SyncServerCommand implements ICommand> { try { // await new SyncResetProgressCommand().execute(); - const token = await new TokenStorageGetCommand().execute(); - if (token) console.log(jwtDecode(token.access_token)); + /*const token = await new TokenStorageGetCommand().execute(); + if (token) console.log(jwtDecode(token.access_token));*/ SyncServerCommand.isInSync = true; @@ -56,16 +53,21 @@ export class SyncServerCommand implements ICommand> { private async syncIncoming(progress: SyncProgress): Promise { fnConsoleLog('SyncServerCommand->syncIncoming'); - const changesResp = await new ApiObjGetChangesCommand().execute(); + const changesResp = await new ApiObjGetChangesCommand(progress.serverId).execute(); if (!changesResp) return; - for (const change of changesResp.data) { - await new SyncObjIncomingHashCommand(change).execute(); - break; + for (let i = 0; i < changesResp.data.length; i++) { + const change = changesResp.data[i]; + if (progress.serverId > change.serverId) continue; + const result = await new SyncObjIncomingHashCommand(change).execute(); + fnConsoleLog('syncIncoming', result, 'serverId', change.serverId, 'localId', change.localId); + if (result) { + progress.serverId = change.serverId; + await new SyncSetProgressCommand(progress).execute(); + } else { + fnConsoleLog('SyncServerCommand->syncIncoming->ERROR !!!!!!!!!!!!!!!!!!!!1'); + return; + } } - const token = await new TokenStorageGetCommand().execute(); - if (!token) return; - const tokenData = jwtDecode(token.access_token); - console.log('tokenData', tokenData); } private async syncOutgoing(progress: SyncProgress): Promise { diff --git a/src/service-worker/task/task.executor.ts b/src/service-worker/task/task.executor.ts index e024896..4412207 100644 --- a/src/service-worker/task/task.executor.ts +++ b/src/service-worker/task/task.executor.ts @@ -19,12 +19,13 @@ import { IndexWordsAddCommand } from '../command/task/index-words-add.command'; import { IndexWordsRemoveCommand } from '../command/task/index-words-remove.command'; import { SwTaskStore } from '../../common/store/sw-task.store'; import { fnConsoleLog } from '../../common/fn/fn-console'; +import { fnSleep } from '../../common/fn/fn-sleep'; export class TaskExecutor { private static runningTask?: string; static async dequeue() { - fnConsoleLog('TaskExecutor.dequeue'); const queue = await SwTaskStore.getQueue(); + fnConsoleLog('TaskExecutor.dequeue', queue.length); await this.execute(queue); } @@ -52,6 +53,11 @@ export class TaskExecutor { queue.shift(); await SwTaskStore.saveQueue(queue); this.runningTask = undefined; + // Try empty queue + if (queue.length > 0) { + await fnSleep(1000); + await this.dequeue(); + } } private static updateTask = async (task: SwTaskData): Promise => {