2018-07-24 14:12:36 +08:00
const syncService = require ( './sync' ) ;
const log = require ( './log' ) ;
2018-07-25 02:35:03 +08:00
const sqlInit = require ( './sql_init' ) ;
2018-07-25 15:46:57 +08:00
const repository = require ( './repository' ) ;
2018-09-11 02:05:10 +08:00
const optionService = require ( './options' ) ;
2018-09-11 15:35:29 +08:00
const syncOptions = require ( './sync_options' ) ;
2018-12-18 05:12:26 +08:00
const request = require ( './request' ) ;
2019-06-06 04:50:03 +08:00
const appInfo = require ( './app_info' ) ;
2020-06-13 16:23:36 +08:00
const utils = require ( './utils' ) ;
2018-09-11 02:05:10 +08:00
2018-09-11 16:01:40 +08:00
async function hasSyncServerSchemaAndSeed ( ) {
2018-09-11 02:05:10 +08:00
const response = await requestToSyncServer ( 'GET' , '/api/setup/status' ) ;
2019-06-12 02:42:06 +08:00
if ( response . syncVersion !== appInfo . syncVersion ) {
throw new Error ( ` Could not setup sync since local sync protocol version is ${ appInfo . syncVersion } while remote is ${ response . syncVersion } . To fix this issue, use same Trilium version on all instances. ` ) ;
}
2018-09-11 16:01:40 +08:00
return response . schemaExists ;
2018-09-11 02:05:10 +08:00
}
2018-07-24 14:12:36 +08:00
function triggerSync ( ) {
2018-07-25 02:35:03 +08:00
log . info ( "Triggering sync." ) ;
// it's ok to not wait for it here
2020-06-20 18:31:38 +08:00
syncService . sync ( ) . then ( res => {
2018-07-25 02:35:03 +08:00
if ( res . success ) {
2020-06-21 03:42:41 +08:00
sqlInit . setDbAsInitialized ( ) ;
2018-07-25 02:35:03 +08:00
}
2018-07-24 14:12:36 +08:00
} ) ;
}
2018-09-11 16:01:40 +08:00
async function sendSeedToSyncServer ( ) {
2018-09-11 02:05:10 +08:00
log . info ( "Initiating sync to server" ) ;
await requestToSyncServer ( 'POST' , '/api/setup/sync-seed' , {
2020-06-20 18:31:38 +08:00
options : getSyncSeedOptions ( ) ,
2019-06-06 04:50:03 +08:00
syncVersion : appInfo . syncVersion
2018-09-11 02:05:10 +08:00
} ) ;
// this is completely new sync, need to reset counters. If this would not be new sync,
// the previous request would have failed.
2020-06-20 18:31:38 +08:00
optionService . setOption ( 'lastSyncedPush' , 0 ) ;
optionService . setOption ( 'lastSyncedPull' , 0 ) ;
2018-09-11 02:05:10 +08:00
}
async function requestToSyncServer ( method , path , body = null ) {
2020-06-20 18:31:38 +08:00
const timeout = syncOptions . getSyncTimeout ( ) ;
2020-06-13 16:23:36 +08:00
2020-06-20 18:31:38 +08:00
return await utils . timeLimit ( request . exec ( {
2018-12-18 05:12:26 +08:00
method ,
2020-06-20 18:31:38 +08:00
url : syncOptions . getSyncServerHost ( ) + path ,
2018-12-18 05:12:26 +08:00
body ,
2020-06-20 18:31:38 +08:00
proxy : syncOptions . getSyncProxy ( ) ,
2020-06-13 16:23:36 +08:00
timeout : timeout
} ) , timeout ) ;
2018-09-11 02:05:10 +08:00
}
2018-07-25 14:30:41 +08:00
async function setupSyncFromSyncServer ( syncServerHost , syncProxy , username , password ) {
2020-06-20 18:31:38 +08:00
if ( sqlInit . isDbInitialized ( ) ) {
2018-07-24 14:12:36 +08:00
return {
result : 'failure' ,
error : 'DB is already initialized.'
} ;
}
try {
log . info ( "Getting document options from sync server." ) ;
// response is expected to contain documentId and documentSecret options
2019-06-12 02:42:06 +08:00
const resp = await request . exec ( {
2018-12-18 05:12:26 +08:00
method : 'get' ,
url : syncServerHost + '/api/setup/sync-seed' ,
2018-07-24 14:12:36 +08:00
auth : {
'user' : username ,
'pass' : password
} ,
2019-12-29 17:19:00 +08:00
proxy : syncProxy ,
timeout : 30000 // seed request should not take long
2018-07-24 14:12:36 +08:00
} ) ;
2019-06-12 02:42:06 +08:00
if ( resp . syncVersion !== appInfo . syncVersion ) {
const message = ` Could not setup sync since local sync protocol version is ${ appInfo . syncVersion } while remote is ${ resp . syncVersion } . To fix this issue, use same Trilium version on all instances. ` ;
log . error ( message ) ;
return {
result : 'failure' ,
error : message
}
}
2020-06-20 18:31:38 +08:00
sqlInit . createDatabaseForSync ( resp . options , syncServerHost , syncProxy ) ;
2018-07-24 14:12:36 +08:00
triggerSync ( ) ;
return { result : 'success' } ;
}
catch ( e ) {
log . error ( "Sync failed: " + e . message ) ;
return {
result : 'failure' ,
error : e . message
} ;
}
}
2020-06-20 18:31:38 +08:00
function getSyncSeedOptions ( ) {
2018-07-25 15:46:57 +08:00
return [
2020-06-20 18:31:38 +08:00
repository . getOption ( 'documentId' ) ,
repository . getOption ( 'documentSecret' )
2018-07-25 15:46:57 +08:00
] ;
}
2018-07-24 14:12:36 +08:00
module . exports = {
2018-09-11 16:01:40 +08:00
hasSyncServerSchemaAndSeed ,
2018-09-11 02:05:10 +08:00
triggerSync ,
2018-09-11 16:01:40 +08:00
sendSeedToSyncServer ,
2018-07-24 14:12:36 +08:00
setupSyncFromSyncServer ,
2018-09-11 02:05:10 +08:00
getSyncSeedOptions
2020-06-13 16:23:36 +08:00
} ;