feat(backups/XO metadata): transfer binary config in base64
This commit is contained in:
@@ -21,7 +21,12 @@ export class RestoreMetadataBackup {
|
||||
})
|
||||
} else {
|
||||
const metadata = JSON.parse(await handler.readFile(join(backupId, 'metadata.json')))
|
||||
return String(await handler.readFile(resolve(backupId, metadata.data ?? 'data.json')))
|
||||
const dataFileName = resolve(backupId, metadata.data ?? 'data.json')
|
||||
const data = await handler.readFile(dataFileName)
|
||||
|
||||
// if data is JSON, sent it as a plain string, otherwise, consider the data as binary and encode it
|
||||
const isJson = dataFileName.endsWith('.json')
|
||||
return isJson ? data.toString() : { encoding: 'base64', data: data.toString('base64') }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,13 @@ export class XoMetadataBackup {
|
||||
const dir = `${scheduleDir}/${formatFilenameDate(timestamp)}`
|
||||
|
||||
const data = job.xoMetadata
|
||||
const dataBaseName = './data.json'
|
||||
let dataBaseName = './data'
|
||||
|
||||
// JSON data is sent as plain string, binary data is sent as an object with `data` and `encoding properties
|
||||
const isJson = typeof data === 'string'
|
||||
if (isJson) {
|
||||
dataBaseName += '.json'
|
||||
}
|
||||
|
||||
const metadata = JSON.stringify(
|
||||
{
|
||||
@@ -54,7 +60,7 @@ export class XoMetadataBackup {
|
||||
async () => {
|
||||
const handler = adapter.handler
|
||||
const dirMode = this._config.dirMode
|
||||
await handler.outputFile(dataFileName, data, { dirMode })
|
||||
await handler.outputFile(dataFileName, isJson ? data : Buffer.from(data.data, data.encoding), { dirMode })
|
||||
await handler.outputFile(metaDataFileName, metadata, {
|
||||
dirMode,
|
||||
})
|
||||
|
||||
@@ -51,7 +51,11 @@ export default class metadataBackup {
|
||||
}
|
||||
|
||||
const app = this._app
|
||||
job.xoMetadata = job.xoMetadata ? await app.exportConfig() : undefined
|
||||
|
||||
if (job.xoMetadata) {
|
||||
const config = await app.exportConfig()
|
||||
job.xoMetadata = typeof config === 'string' ? config : { encoding: 'base64', data: config.toString('base64') }
|
||||
}
|
||||
|
||||
const remoteIds = unboxIdsFromPattern(job.remotes)
|
||||
const proxyId = job.proxy
|
||||
@@ -325,7 +329,8 @@ export default class metadataBackup {
|
||||
const onLog = async log => {
|
||||
if (type === 'xoConfig' && localTaskIds[log.taskId] === rootTaskId && log.status === 'success') {
|
||||
try {
|
||||
await app.importConfig(log.result)
|
||||
const { result } = log
|
||||
await app.importConfig(typeof result === 'string' ? result : Buffer.from(result.data, result.encoding))
|
||||
|
||||
// don't log the XO config
|
||||
log.result = undefined
|
||||
|
||||
Reference in New Issue
Block a user