From e0e93c436bd12b50ceb7f06ec67d63d425d95030 Mon Sep 17 00:00:00 2001 From: Laurent Cozic Date: Mon, 13 Dec 2021 10:32:22 +0100 Subject: [PATCH] All: Fixed "Invalid lock client type" error when migrating sync target --- packages/app-cli/app/command-sync.ts | 3 ++- packages/lib/Synchronizer.ts | 16 +++++----------- .../lib/services/synchronizer/LockHandler.ts | 8 ++++++++ .../synchronizer/gui/useSyncTargetUpgrade.ts | 3 ++- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/packages/app-cli/app/command-sync.ts b/packages/app-cli/app/command-sync.ts index b146f9e8e..894f39599 100644 --- a/packages/app-cli/app/command-sync.ts +++ b/packages/app-cli/app/command-sync.ts @@ -5,6 +5,7 @@ import MigrationHandler from '@joplin/lib/services/synchronizer/MigrationHandler import ResourceFetcher from '@joplin/lib/services/ResourceFetcher'; import Synchronizer from '@joplin/lib/Synchronizer'; import { masterKeysWithoutPassword } from '@joplin/lib/services/e2ee/utils'; +import { appTypeToLockType } from '@joplin/lib/services/synchronizer/LockHandler'; const { BaseCommand } = require('./base-command.js'); const { app } = require('./app.js'); const { OneDriveApiNodeUtils } = require('@joplin/lib/onedrive-api-node-utils.js'); @@ -188,7 +189,7 @@ class Command extends BaseCommand { sync.api(), reg.db(), sync.lockHandler(), - Setting.value('appType'), + appTypeToLockType(Setting.value('appType')), Setting.value('clientId') ); diff --git a/packages/lib/Synchronizer.ts b/packages/lib/Synchronizer.ts index a70184c2c..12ee9170a 100644 --- a/packages/lib/Synchronizer.ts +++ b/packages/lib/Synchronizer.ts @@ -1,5 +1,5 @@ import Logger from './Logger'; -import LockHandler, { hasActiveLock, LockClientType, LockType } from './services/synchronizer/LockHandler'; +import LockHandler, { appTypeToLockType, hasActiveLock, LockClientType, LockType } from './services/synchronizer/LockHandler'; import Setting, { AppType } from './models/Setting'; import shim from './shim'; import MigrationHandler from './services/synchronizer/MigrationHandler'; @@ -53,7 +53,7 @@ export default class Synchronizer { private db_: JoplinDatabase; private api_: FileApi; - private appType_: string; + private appType_: AppType; private logger_: Logger = new Logger(); private state_: string = 'idle'; private cancelling_: boolean = false; @@ -77,7 +77,7 @@ export default class Synchronizer { public dispatch: Function; - public constructor(db: JoplinDatabase, api: FileApi, appType: string) { + public constructor(db: JoplinDatabase, api: FileApi, appType: AppType) { this.db_ = db; this.api_ = api; this.appType_ = appType; @@ -123,13 +123,7 @@ export default class Synchronizer { private lockClientType(): LockClientType { if (this.lockClientType_) return this.lockClientType_; - - if (this.appType_ === AppType.Desktop) this.lockClientType_ = LockClientType.Desktop; - if (this.appType_ === AppType.Mobile) this.lockClientType_ = LockClientType.Mobile; - if (this.appType_ === AppType.Cli) this.lockClientType_ = LockClientType.Cli; - - if (!this.lockClientType_) throw new Error(`Invalid client type: ${this.appType_}`); - + this.lockClientType_ = appTypeToLockType(this.appType_); return this.lockClientType_; } @@ -141,7 +135,7 @@ export default class Synchronizer { maxResourceSize() { if (this.maxResourceSize_ !== null) return this.maxResourceSize_; - return this.appType_ === 'mobile' ? 100 * 1000 * 1000 : Infinity; + return this.appType_ === AppType.Mobile ? 100 * 1000 * 1000 : Infinity; } public setShareService(v: ShareService) { diff --git a/packages/lib/services/synchronizer/LockHandler.ts b/packages/lib/services/synchronizer/LockHandler.ts index d0b720465..018dbd3dd 100644 --- a/packages/lib/services/synchronizer/LockHandler.ts +++ b/packages/lib/services/synchronizer/LockHandler.ts @@ -3,6 +3,7 @@ import shim from '../../shim'; import JoplinError from '../../JoplinError'; import time from '../../time'; import { FileApi } from '../../file-api'; +import { AppType } from '../../models/Setting'; const { fileExtension, filename } = require('../../path-utils'); export enum LockType { @@ -46,6 +47,13 @@ export function lockNameToObject(name: string, updatedTime: number = null): Lock return lock; } +export function appTypeToLockType(appType: AppType): LockClientType { + if (appType === AppType.Desktop) return LockClientType.Desktop; + if (appType === AppType.Mobile) return LockClientType.Mobile; + if (appType === AppType.Cli) return LockClientType.Cli; + throw new Error(`Invalid app type: ${appType}`); +} + export function hasActiveLock(locks: Lock[], currentDate: Date, lockTtl: number, lockType: LockType, clientType: LockClientType = null, clientId: string = null) { const lock = activeLock(locks, currentDate, lockTtl, lockType, clientType, clientId); return !!lock; diff --git a/packages/lib/services/synchronizer/gui/useSyncTargetUpgrade.ts b/packages/lib/services/synchronizer/gui/useSyncTargetUpgrade.ts index fad943630..581a57ffb 100644 --- a/packages/lib/services/synchronizer/gui/useSyncTargetUpgrade.ts +++ b/packages/lib/services/synchronizer/gui/useSyncTargetUpgrade.ts @@ -2,6 +2,7 @@ import shim from '../../../shim'; import MigrationHandler from '../MigrationHandler'; import Setting from '../../../models/Setting'; import { reg } from '../../../registry'; +import { appTypeToLockType } from '../LockHandler'; const { useEffect, useState } = shim.react(); export interface SyncTargetUpgradeResult { @@ -28,7 +29,7 @@ export default function useSyncTargetUpgrade(): SyncTargetUpgradeResult { synchronizer.api(), reg.db(), synchronizer.lockHandler(), - Setting.value('appType'), + appTypeToLockType(Setting.value('appType')), Setting.value('clientId') );