iobroker.backitup
Version:
ioBroker.backitup allows you to backup and restore your ioBroker installation and other systems, such as databases, Zigbee, scripts and many more.
128 lines (115 loc) • 4.84 kB
JavaScript
class DropBox {
sessionUpload(dbx, fileName, dir, log) {
return new Promise(async (resolve, reject) => {
const fs = require('node:fs');
const path = require('node:path');
try {
const chunkLength = 1000000;
const fileSize = fs.statSync(fileName).size;
if (fileSize) {
const onlyFileName = fileName.split('/').pop();
const dbxPth = path.join(dir, onlyFileName).replace(/\\/g, '/');
const getNextChunkStream = (start, end) => fs.createReadStream(fileName, { start, end });
const append = async (sessionId, start, end) => {
if (start === fileSize) {
log.debug(`${Math.round((end / fileSize) * 100)}% uploaded from ${onlyFileName}...`);
resolve('done');
return await this.sessionFinish(sessionId, dbx, log, dbxPth, fileSize);
}
if (end > fileSize) {
end = fileSize - 1;
log.debug(`${Math.round((start / fileSize) * 100)}% uploaded from ${onlyFileName}...`);
return await this.sessionAppend(sessionId, dbx, getNextChunkStream, log, start, fileSize - 1)
.then(async () => {
log.debug(`${Math.round((end / fileSize) * 100)}% uploaded from ${onlyFileName}...`);
resolve('done');
return await this.sessionFinish(sessionId, dbx, log, dbxPth, fileSize);
});
}
log.debug(`${Math.round((start / fileSize) * 100)}% uploaded from ${onlyFileName}...`);
await this.sessionAppend(sessionId, dbx, getNextChunkStream, log, start, end)
.then(async () => {
append(sessionId, end + 1, end + chunkLength);
});
}
const sessionId = await this.sessionStart(dbx, log);
if (sessionId) {
append(sessionId, 0, chunkLength - 1);
}
} else {
reject('Error Session Upload');
}
} catch (err) {
reject(`Error Session Upload: ${JSON.stringify(err)}`);
}
});
}
sessionStart(dbx, log) {
return new Promise(async (resolve, reject) => {
dbx({
resource: 'files/upload_session/start',
parameters: {
close: false
},
}, async (err, result) => {
if (err) {
log.error(`sessionStart error: ${JSON.stringify(err)}`);
reject(err);
}
if (result && result.session_id) {
resolve(result.session_id);
} else {
reject();
}
});
});
}
sessionAppend(sessionId, dbx, getNextChunkStream, log, start, end) {
return new Promise(async (resolve, reject) => {
dbx({
resource: 'files/upload_session/append_v2',
parameters: {
cursor: {
session_id: sessionId,
offset: start
},
close: false,
},
readStream: getNextChunkStream(start, end)
}, async (err) => {
if (err) {
log.error(); (`sessionAppend error: ${JSON.stringify(err)}`);
reject(err);
}
resolve();
});
});
}
sessionFinish(sessionId, dbx, log, dbxPth, fileSize) {
return new Promise(async (resolve, reject) => {
dbx({
resource: 'files/upload_session/finish',
parameters: {
cursor: {
session_id: sessionId,
offset: fileSize
},
commit: {
path: dbxPth,
mode: 'add',
autorename: true,
mute: false
}
}
}, (err) => {
if (err) {
log.error(`sessionFinish error: ${JSON.stringify(err)}`);
reject(err);
}
});
resolve();
});
}
}
module.exports = DropBox;
;