mirror of
https://github.com/laurent22/joplin.git
synced 2025-01-26 18:58:21 +02:00
Merge branch 'release-1.0' of github.com:laurent22/joplin into release-1.0
This commit is contained in:
commit
a014b9347e
@ -6,6 +6,7 @@ const JoplinError = require('lib/JoplinError');
|
|||||||
const ArrayUtils = require('lib/ArrayUtils');
|
const ArrayUtils = require('lib/ArrayUtils');
|
||||||
const { time } = require('lib/time-utils.js');
|
const { time } = require('lib/time-utils.js');
|
||||||
const { sprintf } = require('sprintf-js');
|
const { sprintf } = require('sprintf-js');
|
||||||
|
const Mutex = require('async-mutex').Mutex;
|
||||||
|
|
||||||
function requestCanBeRepeated(error) {
|
function requestCanBeRepeated(error) {
|
||||||
const errorCode = typeof error === 'object' && error.code ? error.code : null;
|
const errorCode = typeof error === 'object' && error.code ? error.code : null;
|
||||||
@ -57,6 +58,47 @@ class FileApi {
|
|||||||
this.tempDirName_ = null;
|
this.tempDirName_ = null;
|
||||||
this.driver_.fileApi_ = this;
|
this.driver_.fileApi_ = this;
|
||||||
this.requestRepeatCount_ = null; // For testing purpose only - normally this value should come from the driver
|
this.requestRepeatCount_ = null; // For testing purpose only - normally this value should come from the driver
|
||||||
|
this.remoteDateOffset_ = 0;
|
||||||
|
this.remoteDateNextCheckTime_ = 0;
|
||||||
|
this.remoteDateMutex_ = new Mutex();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Approximates the current time on the sync target. It caches the time offset to
|
||||||
|
// improve performance.
|
||||||
|
async remoteDate() {
|
||||||
|
const shouldSyncTime = () => {
|
||||||
|
return !this.remoteDateNextCheckTime_ || Date.now() > this.remoteDateNextCheckTime_;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (shouldSyncTime()) {
|
||||||
|
const release = await this.remoteDateMutex_.acquire();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Another call might have refreshed the time while we were waiting for the mutex,
|
||||||
|
// so check again if we need to refresh.
|
||||||
|
if (shouldSyncTime()) {
|
||||||
|
const tempFile = `${this.tempDirName()}/timeCheck${Math.random() * 10000}.txt`;
|
||||||
|
const startTime = Date.now();
|
||||||
|
await this.put(tempFile, 'timeCheck');
|
||||||
|
const stat = await this.stat(tempFile);
|
||||||
|
const endTime = Date.now();
|
||||||
|
const expectedTime = Math.round((endTime + startTime) / 2);
|
||||||
|
this.remoteDateOffset_ = stat.updated_time.getTime() - expectedTime;
|
||||||
|
// The sync target clock should rarely change but the device one might,
|
||||||
|
// so we need to refresh relatively frequently.
|
||||||
|
this.remoteDateNextCheckTime_ = Date.now() + 10 * 60 * 1000;
|
||||||
|
this.delete(tempFile); // No need to await for this call
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
this.logger().warn('Could not retrieve remote date - defaulting to device date:', error);
|
||||||
|
this.remoteDateOffset_ = 0;
|
||||||
|
this.remoteDateNextCheckTime_ = Date.now() + 60 * 1000;
|
||||||
|
} finally {
|
||||||
|
release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Date(Date.now() + this.remoteDateOffset_);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ideally all requests repeating should be done at the FileApi level to remove duplicate code in the drivers, but
|
// Ideally all requests repeating should be done at the FileApi level to remove duplicate code in the drivers, but
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { Dirnames } from './utils/types';
|
import { Dirnames } from './utils/types';
|
||||||
import ntpDate from 'lib/ntpDate';
|
|
||||||
|
|
||||||
const JoplinError = require('lib/JoplinError');
|
const JoplinError = require('lib/JoplinError');
|
||||||
const { time } = require('lib/time-utils');
|
const { time } = require('lib/time-utils');
|
||||||
@ -114,7 +113,7 @@ export default class LockHandler {
|
|||||||
// of that type instead.
|
// of that type instead.
|
||||||
async activeLock(lockType:LockType, clientType:string = null, clientId:string = null) {
|
async activeLock(lockType:LockType, clientType:string = null, clientId:string = null) {
|
||||||
const locks = await this.locks(lockType);
|
const locks = await this.locks(lockType);
|
||||||
const currentDate = await ntpDate();
|
const currentDate = await this.api_.remoteDate();
|
||||||
|
|
||||||
if (lockType === LockType.Exclusive) {
|
if (lockType === LockType.Exclusive) {
|
||||||
const activeLocks = locks
|
const activeLocks = locks
|
||||||
|
Loading…
x
Reference in New Issue
Block a user