matrix-react-sdk
Version:
SDK for matrix.org using React
107 lines (104 loc) • 17.4 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _logger = require("matrix-js-sdk/src/logger");
var _Exporter = _interopRequireDefault(require("./Exporter"));
var _DateUtils = require("../../DateUtils");
var _languageHandler = require("../../languageHandler");
var _EventTileFactory = require("../../events/EventTileFactory");
/*
Copyright 2024 New Vector Ltd.
Copyright 2021, 2022 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
class JSONExporter extends _Exporter.default {
constructor(room, exportType, exportOptions, setProgressText) {
super(room, exportType, exportOptions, setProgressText);
(0, _defineProperty2.default)(this, "totalSize", 0);
(0, _defineProperty2.default)(this, "messages", []);
}
get destinationFileName() {
return this.makeFileNameNoExtension() + ".json";
}
createJSONString() {
const exportDate = (0, _DateUtils.formatFullDateNoDayNoTime)(new Date());
const creator = this.room.currentState.getStateEvents(_matrix.EventType.RoomCreate, "")?.getSender();
const creatorName = creator && this.room?.getMember(creator)?.rawDisplayName || creator;
const topic = this.room.currentState.getStateEvents(_matrix.EventType.RoomTopic, "")?.getContent()?.topic || "";
const exporter = this.room.client.getUserId();
const exporterName = this.room?.getMember(exporter)?.rawDisplayName || exporter;
const jsonObject = {
room_name: this.room.name,
room_creator: creatorName,
topic,
export_date: exportDate,
exported_by: exporterName,
messages: this.messages
};
return JSON.stringify(jsonObject, null, 2);
}
async getJSONString(mxEv) {
if (this.exportOptions.attachmentsIncluded && this.isAttachment(mxEv)) {
try {
const blob = await this.getMediaBlob(mxEv);
if (this.totalSize + blob.size < this.exportOptions.maxSize) {
this.totalSize += blob.size;
const filePath = this.getFilePath(mxEv);
if (this.totalSize == this.exportOptions.maxSize) {
this.exportOptions.attachmentsIncluded = false;
}
this.addFile(filePath, blob);
}
} catch (err) {
_logger.logger.log("Error fetching file: " + err);
}
}
return mxEv.getEffectiveEvent();
}
async createOutput(events) {
for (let i = 0; i < events.length; i++) {
const event = events[i];
this.updateProgress((0, _languageHandler._t)("export_chat|processing_event_n", {
number: i + 1,
total: events.length
}), false, true);
if (this.cancelled) return this.cleanUp();
if (!(0, _EventTileFactory.haveRendererForEvent)(event, this.room.client, false)) continue;
this.messages.push(await this.getJSONString(event));
}
return this.createJSONString();
}
async export() {
_logger.logger.info("Starting export process...");
_logger.logger.info("Fetching events...");
const fetchStart = performance.now();
const res = await this.getRequiredEvents();
const fetchEnd = performance.now();
_logger.logger.log(`Fetched ${res.length} events in ${(fetchEnd - fetchStart) / 1000}s`);
_logger.logger.info("Creating output...");
const text = await this.createOutput(res);
if (this.files.length) {
this.addFile("export.json", new Blob([text]));
await this.downloadZIP();
} else {
const fileName = this.destinationFileName;
this.downloadPlainText(fileName, text);
}
const exportEnd = performance.now();
if (this.cancelled) {
_logger.logger.info("Export cancelled successfully");
} else {
_logger.logger.info("Export successful!");
_logger.logger.log(`Exported ${res.length} events in ${(exportEnd - fetchStart) / 1000} seconds`);
}
this.cleanUp();
}
}
exports.default = JSONExporter;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfRXhwb3J0ZXIiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX0RhdGVVdGlscyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfRXZlbnRUaWxlRmFjdG9yeSIsIkpTT05FeHBvcnRlciIsIkV4cG9ydGVyIiwiY29uc3RydWN0b3IiLCJyb29tIiwiZXhwb3J0VHlwZSIsImV4cG9ydE9wdGlvbnMiLCJzZXRQcm9ncmVzc1RleHQiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImRlc3RpbmF0aW9uRmlsZU5hbWUiLCJtYWtlRmlsZU5hbWVOb0V4dGVuc2lvbiIsImNyZWF0ZUpTT05TdHJpbmciLCJleHBvcnREYXRlIiwiZm9ybWF0RnVsbERhdGVOb0RheU5vVGltZSIsIkRhdGUiLCJjcmVhdG9yIiwiY3VycmVudFN0YXRlIiwiZ2V0U3RhdGVFdmVudHMiLCJFdmVudFR5cGUiLCJSb29tQ3JlYXRlIiwiZ2V0U2VuZGVyIiwiY3JlYXRvck5hbWUiLCJnZXRNZW1iZXIiLCJyYXdEaXNwbGF5TmFtZSIsInRvcGljIiwiUm9vbVRvcGljIiwiZ2V0Q29udGVudCIsImV4cG9ydGVyIiwiY2xpZW50IiwiZ2V0VXNlcklkIiwiZXhwb3J0ZXJOYW1lIiwianNvbk9iamVjdCIsInJvb21fbmFtZSIsIm5hbWUiLCJyb29tX2NyZWF0b3IiLCJleHBvcnRfZGF0ZSIsImV4cG9ydGVkX2J5IiwibWVzc2FnZXMiLCJKU09OIiwic3RyaW5naWZ5IiwiZ2V0SlNPTlN0cmluZyIsIm14RXYiLCJhdHRhY2htZW50c0luY2x1ZGVkIiwiaXNBdHRhY2htZW50IiwiYmxvYiIsImdldE1lZGlhQmxvYiIsInRvdGFsU2l6ZSIsInNpemUiLCJtYXhTaXplIiwiZmlsZVBhdGgiLCJnZXRGaWxlUGF0aCIsImFkZEZpbGUiLCJlcnIiLCJsb2dnZXIiLCJsb2ciLCJnZXRFZmZlY3RpdmVFdmVudCIsImNyZWF0ZU91dHB1dCIsImV2ZW50cyIsImkiLCJsZW5ndGgiLCJldmVudCIsInVwZGF0ZVByb2dyZXNzIiwiX3QiLCJudW1iZXIiLCJ0b3RhbCIsImNhbmNlbGxlZCIsImNsZWFuVXAiLCJoYXZlUmVuZGVyZXJGb3JFdmVudCIsInB1c2giLCJleHBvcnQiLCJpbmZvIiwiZmV0Y2hTdGFydCIsInBlcmZvcm1hbmNlIiwibm93IiwicmVzIiwiZ2V0UmVxdWlyZWRFdmVudHMiLCJmZXRjaEVuZCIsInRleHQiLCJmaWxlcyIsIkJsb2IiLCJkb3dubG9hZFpJUCIsImZpbGVOYW1lIiwiZG93bmxvYWRQbGFpblRleHQiLCJleHBvcnRFbmQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2V4cG9ydFV0aWxzL0pTT05FeHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEsIDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgUm9vbSwgSUV2ZW50LCBNYXRyaXhFdmVudCwgRXZlbnRUeXBlIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgRXhwb3J0ZXIgZnJvbSBcIi4vRXhwb3J0ZXJcIjtcbmltcG9ydCB7IGZvcm1hdEZ1bGxEYXRlTm9EYXlOb1RpbWUgfSBmcm9tIFwiLi4vLi4vRGF0ZVV0aWxzXCI7XG5pbXBvcnQgeyBFeHBvcnRUeXBlLCBJRXhwb3J0T3B0aW9ucyB9IGZyb20gXCIuL2V4cG9ydFV0aWxzXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IGhhdmVSZW5kZXJlckZvckV2ZW50IH0gZnJvbSBcIi4uLy4uL2V2ZW50cy9FdmVudFRpbGVGYWN0b3J5XCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEpTT05FeHBvcnRlciBleHRlbmRzIEV4cG9ydGVyIHtcbiAgICBwcm90ZWN0ZWQgdG90YWxTaXplID0gMDtcbiAgICBwcm90ZWN0ZWQgbWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSA9IFtdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICByb29tOiBSb29tLFxuICAgICAgICBleHBvcnRUeXBlOiBFeHBvcnRUeXBlLFxuICAgICAgICBleHBvcnRPcHRpb25zOiBJRXhwb3J0T3B0aW9ucyxcbiAgICAgICAgc2V0UHJvZ3Jlc3NUZXh0OiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxzdHJpbmc+PixcbiAgICApIHtcbiAgICAgICAgc3VwZXIocm9vbSwgZXhwb3J0VHlwZSwgZXhwb3J0T3B0aW9ucywgc2V0UHJvZ3Jlc3NUZXh0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRlc3RpbmF0aW9uRmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFrZUZpbGVOYW1lTm9FeHRlbnNpb24oKSArIFwiLmpzb25cIjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlSlNPTlN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBleHBvcnREYXRlID0gZm9ybWF0RnVsbERhdGVOb0RheU5vVGltZShuZXcgRGF0ZSgpKTtcbiAgICAgICAgY29uc3QgY3JlYXRvciA9IHRoaXMucm9vbS5jdXJyZW50U3RhdGUuZ2V0U3RhdGVFdmVudHMoRXZlbnRUeXBlLlJvb21DcmVhdGUsIFwiXCIpPy5nZXRTZW5kZXIoKTtcbiAgICAgICAgY29uc3QgY3JlYXRvck5hbWUgPSAoY3JlYXRvciAmJiB0aGlzLnJvb20/LmdldE1lbWJlcihjcmVhdG9yKT8ucmF3RGlzcGxheU5hbWUpIHx8IGNyZWF0b3I7XG4gICAgICAgIGNvbnN0IHRvcGljID0gdGhpcy5yb29tLmN1cnJlbnRTdGF0ZS5nZXRTdGF0ZUV2ZW50cyhFdmVudFR5cGUuUm9vbVRvcGljLCBcIlwiKT8uZ2V0Q29udGVudCgpPy50b3BpYyB8fCBcIlwiO1xuICAgICAgICBjb25zdCBleHBvcnRlciA9IHRoaXMucm9vbS5jbGllbnQuZ2V0VXNlcklkKCkhO1xuICAgICAgICBjb25zdCBleHBvcnRlck5hbWUgPSB0aGlzLnJvb20/LmdldE1lbWJlcihleHBvcnRlcik/LnJhd0Rpc3BsYXlOYW1lIHx8IGV4cG9ydGVyO1xuICAgICAgICBjb25zdCBqc29uT2JqZWN0ID0ge1xuICAgICAgICAgICAgcm9vbV9uYW1lOiB0aGlzLnJvb20ubmFtZSxcbiAgICAgICAgICAgIHJvb21fY3JlYXRvcjogY3JlYXRvck5hbWUsXG4gICAgICAgICAgICB0b3BpYyxcbiAgICAgICAgICAgIGV4cG9ydF9kYXRlOiBleHBvcnREYXRlLFxuICAgICAgICAgICAgZXhwb3J0ZWRfYnk6IGV4cG9ydGVyTmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2VzOiB0aGlzLm1lc3NhZ2VzLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoanNvbk9iamVjdCwgbnVsbCwgMik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldEpTT05TdHJpbmcobXhFdjogTWF0cml4RXZlbnQpOiBQcm9taXNlPElFdmVudD4ge1xuICAgICAgICBpZiAodGhpcy5leHBvcnRPcHRpb25zLmF0dGFjaG1lbnRzSW5jbHVkZWQgJiYgdGhpcy5pc0F0dGFjaG1lbnQobXhFdikpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHRoaXMuZ2V0TWVkaWFCbG9iKG14RXYpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvdGFsU2l6ZSArIGJsb2Iuc2l6ZSA8IHRoaXMuZXhwb3J0T3B0aW9ucy5tYXhTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxTaXplICs9IGJsb2Iuc2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVBhdGggPSB0aGlzLmdldEZpbGVQYXRoKG14RXYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50b3RhbFNpemUgPT0gdGhpcy5leHBvcnRPcHRpb25zLm1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0T3B0aW9ucy5hdHRhY2htZW50c0luY2x1ZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRGaWxlKGZpbGVQYXRoLCBibG9iKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFwiRXJyb3IgZmV0Y2hpbmcgZmlsZTogXCIgKyBlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBteEV2LmdldEVmZmVjdGl2ZUV2ZW50KCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZU91dHB1dChldmVudHM6IE1hdHJpeEV2ZW50W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaV07XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzKFxuICAgICAgICAgICAgICAgIF90KFwiZXhwb3J0X2NoYXR8cHJvY2Vzc2luZ19ldmVudF9uXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyOiBpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IGV2ZW50cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpcy5jYW5jZWxsZWQpIHJldHVybiB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgICAgIGlmICghaGF2ZVJlbmRlcmVyRm9yRXZlbnQoZXZlbnQsIHRoaXMucm9vbS5jbGllbnQsIGZhbHNlKSkgY29udGludWU7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzLnB1c2goYXdhaXQgdGhpcy5nZXRKU09OU3RyaW5nKGV2ZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlSlNPTlN0cmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleHBvcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiU3RhcnRpbmcgZXhwb3J0IHByb2Nlc3MuLi5cIik7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiRmV0Y2hpbmcgZXZlbnRzLi4uXCIpO1xuXG4gICAgICAgIGNvbnN0IGZldGNoU3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5nZXRSZXF1aXJlZEV2ZW50cygpO1xuICAgICAgICBjb25zdCBmZXRjaEVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgIGxvZ2dlci5sb2coYEZldGNoZWQgJHtyZXMubGVuZ3RofSBldmVudHMgaW4gJHsoZmV0Y2hFbmQgLSBmZXRjaFN0YXJ0KSAvIDEwMDB9c2ApO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKFwiQ3JlYXRpbmcgb3V0cHV0Li4uXCIpO1xuICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVPdXRwdXQocmVzKTtcblxuICAgICAgICBpZiAodGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmlsZShcImV4cG9ydC5qc29uXCIsIG5ldyBCbG9iKFt0ZXh0XSkpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5kb3dubG9hZFpJUCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmRlc3RpbmF0aW9uRmlsZU5hbWU7XG4gICAgICAgICAgICB0aGlzLmRvd25sb2FkUGxhaW5UZXh0KGZpbGVOYW1lLCB0ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV4cG9ydEVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXCJFeHBvcnQgY2FuY2VsbGVkIHN1Y2Nlc3NmdWxseVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFwiRXhwb3J0IHN1Y2Nlc3NmdWwhXCIpO1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhgRXhwb3J0ZWQgJHtyZXMubGVuZ3RofSBldmVudHMgaW4gJHsoZXhwb3J0RW5kIC0gZmV0Y2hTdGFydCkgLyAxMDAwfSBzZWNvbmRzYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsU0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksVUFBQSxHQUFBSixPQUFBO0FBRUEsSUFBQUssZ0JBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGlCQUFBLEdBQUFOLE9BQUE7QUFmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFXZSxNQUFNTyxZQUFZLFNBQVNDLGlCQUFRLENBQUM7RUFJeENDLFdBQVdBLENBQ2RDLElBQVUsRUFDVkMsVUFBc0IsRUFDdEJDLGFBQTZC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