mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-01-19 22:23:33 +01:00
2fdc737355
* bugfix, lint and refactor all bin scripts * for squash: throw Error(message) rather than log(message); throw Error() * for squash: Exit non-0 on unhandled Promise rejection Many of the recent lint changes have converted normal functions to async functions, and an error thrown in an async function does not cause Node.js to exit by default. * for squash: fix `require()` paths * for squash: remove erroneous `Object.keys()` call * for squash: fix missing `continue` statements * for squash: Fix HTTP method for deleteSession * for squash: delete erroneous throw Throw is only for errors, not successful completion. * for squash: redo migrateDirtyDBtoRealDB.js to fix async bugs * for squash: fix erroneous use of `for..of` * for squash: Add line break between statements * for squash: put closing paren on same line as last arg * for squash: Move `log()` back up where it was to minimize the diff to develop * for squash: indentation fixes * for squash: typo fix * for squash: wrap long lines * for squash: use `util.callbackify` to silence promise/no-callback-in-promise warning * for squash: use double quotes to improve readability Co-authored-by: Richard Hansen <rhansen@rhansen.org>
74 lines
2.2 KiB
JavaScript
74 lines
2.2 KiB
JavaScript
'use strict';
|
|
|
|
/*
|
|
* This is a debug tool. It helps to extract all datas of a pad and move it from
|
|
* a productive environment and to a develop environment to reproduce bugs
|
|
* there. It outputs a dirtydb file
|
|
*/
|
|
|
|
// As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an
|
|
// unhandled rejection into an uncaught exception, which does cause Node.js to exit.
|
|
process.on('unhandledRejection', (err) => { throw err; });
|
|
|
|
if (process.argv.length !== 3) throw new Error('Use: node extractPadData.js $PADID');
|
|
|
|
// get the padID
|
|
const padId = process.argv[2];
|
|
|
|
const npm = require('ep_etherpad-lite/node_modules/npm');
|
|
|
|
npm.load({}, async (err) => {
|
|
if (err) throw err;
|
|
|
|
try {
|
|
// initialize database
|
|
require('ep_etherpad-lite/node/utils/Settings');
|
|
const db = require('ep_etherpad-lite/node/db/DB');
|
|
await db.init();
|
|
|
|
// load extra modules
|
|
const dirtyDB = require('ep_etherpad-lite/node_modules/dirty');
|
|
const padManager = require('ep_etherpad-lite/node/db/PadManager');
|
|
const util = require('util');
|
|
|
|
// initialize output database
|
|
const dirty = dirtyDB(`${padId}.db`);
|
|
|
|
// Promise wrapped get and set function
|
|
const wrapped = db.db.db.wrappedDB;
|
|
const get = util.promisify(wrapped.get.bind(wrapped));
|
|
const set = util.promisify(dirty.set.bind(dirty));
|
|
|
|
// array in which required key values will be accumulated
|
|
const neededDBValues = [`pad:${padId}`];
|
|
|
|
// get the actual pad object
|
|
const pad = await padManager.getPad(padId);
|
|
|
|
// add all authors
|
|
neededDBValues.push(...pad.getAllAuthors().map((author) => `globalAuthor:${author}`));
|
|
|
|
// add all revisions
|
|
for (let rev = 0; rev <= pad.head; ++rev) {
|
|
neededDBValues.push(`pad:${padId}:revs:${rev}`);
|
|
}
|
|
|
|
// add all chat values
|
|
for (let chat = 0; chat <= pad.chatHead; ++chat) {
|
|
neededDBValues.push(`pad:${padId}:chat:${chat}`);
|
|
}
|
|
|
|
for (const dbkey of neededDBValues) {
|
|
let dbvalue = await get(dbkey);
|
|
if (dbvalue && typeof dbvalue !== 'object') {
|
|
dbvalue = JSON.parse(dbvalue);
|
|
}
|
|
await set(dbkey, dbvalue);
|
|
}
|
|
|
|
console.log('finished');
|
|
} catch (err) {
|
|
console.error(err);
|
|
throw err;
|
|
}
|
|
});
|