${room.name}
import streamSaver from "streamsaver"; import JSZip from "jszip"; import { decryptFile } from "../DecryptFile"; import { mediaFromContent, mediaFromMxc } from "../../customisations/Media"; import { textForEvent } from "../../TextForEvent"; import Room from 'matrix-js-sdk/src/models/room'; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; const wrapHTML = (content: string, room: Room) => (`
`;
const blob = await getImageData(event);
zip.file(`images/${event.getId()}.png`, blob);
}
break;
default:
break;
}
return `
`;
};
const createHTML = async (events: MatrixEvent[], room: Room) => {
let content = "";
let prevEvent = null;
for (const event of events) {
content += dateSeparator(event, prevEvent);
if (event.getType() === "m.room.message") {
const replyTo = getBaseEventId(event);
const shouldBeJoined = prevEvent && prevEvent.getContent().msgtype === "m.text"
&& event.sender.userId === prevEvent.sender.userId && !dateSeparator(event, prevEvent) && !replyTo;
const body = await createMessageBody(event, shouldBeJoined, !!replyTo, replyTo);
content += body;
} else {
const eventText = textForEvent(event);
content += eventText ? `
` : "";
}
prevEvent = event;
}
return wrapHTML(content, room);
};
const avatars = new Map();
let zip;
const exportAsHTML = async (res: MatrixEvent[], room: Room) => {
zip = new JSZip();
const html = await createHTML(res, room);
zip.file("index.html", html);
zip.file("css/style.css", css);
avatars.clear();
const filename = `matrix-export-${new Date().toISOString()}.zip`;
//Generate the zip file asynchronously
const blob = await zip.generateAsync({ type: "blob" });
//Create a writable stream to the directory
const fileStream = streamSaver.createWriteStream(filename, blob.size);
const writer = fileStream.getWriter();
// Here we chunk the blob into pieces of 10 MB, the size might be dynamically generated.
// This can be used to keep track of the progress
const sliceSize = 10 * 1e6;
for (let fPointer = 0; fPointer < blob.size; fPointer += sliceSize) {
// console.log(fPointer);
const blobPiece = blob.slice(fPointer, fPointer + sliceSize);
const reader = new FileReader();
const waiter = new Promise