prepare sending and receiving files

This commit is contained in:
marlon-erler
2024-07-27 18:03:12 +02:00
parent 8a56c0aab2
commit b7d0479a23
2 changed files with 82 additions and 3 deletions
+77 -2
View File
@@ -1,14 +1,21 @@
// this file is responsible for sending and handling files.
import { decryptString, encryptString } from "../Utility/crypto";
import { generateRandomToken, parse, stringify } from "../Utility/utility";
import ConnectionModel from "./connectionModel";
import { Message } from "udn-frontend";
import StorageModel from "./storageModel";
import { generateRandomToken } from "../Utility/utility";
import { checkMatchesObjectStructure } from "../Utility/typeSafety";
export default class FileTransferModel {
storageModel: StorageModel;
connectionModel: ConnectionModel;
// methods
// data
transferData: TransferData | undefined;
// general
generateTransferData = (): TransferData => {
return {
channel: generateRandomToken(2),
@@ -16,10 +23,68 @@ export default class FileTransferModel {
};
};
prepareToReceive = (transferData: TransferData) => {
this.connectionModel.addChannel(transferData.channel);
this.transferData = transferData;
};
// handlers
handleMessage = (data: Message): void => {
if (this.transferData == undefined) return;
if (data.messageChannel != this.transferData.channel) return;
};
handleFile = async (encryptedFileData: string): Promise<void> => {
if (this.transferData == undefined) return;
const decrypted: string = await decryptString(
encryptedFileData,
this.transferData.key
);
const parsed: any = parse(decrypted);
const isFileData: boolean = checkMatchesObjectStructure(parsed, FileDataReference);
if (isFileData == false) return;
const fileData: FileData = parsed;
this.storageModel.write(fileData.path, fileData.body);
};
// sending
sendFiles = (...directoryPaths: string[][]): void => {
for (const directoryPath of directoryPaths) {
this.storageModel.recurse(directoryPath, (filePath: string[]) => {
this.sendFile(filePath);
});
}
};
sendFile = async (filePath: string[]): Promise<void> => {
if (this.transferData == undefined) return;
const fileContent: string | null = this.storageModel.read(filePath);
if (fileContent == null) return;
const fileData: FileData = {
path: filePath,
body: fileContent,
};
const stringifiedFileData: string = stringify(fileData);
const encryptedFileData: string = await encryptString(
fileContent,
stringifiedFileData
);
this.connectionModel.sendPlainMessage(
this.transferData.channel,
encryptedFileData
);
};
// init
constructor(storageModel: StorageModel, connectionModel: ConnectionModel) {
this.storageModel = storageModel;
this.connectionModel = connectionModel;
this.connectionModel.messageHandlerManager.addHandler(this.handleMessage);
}
}
@@ -27,3 +92,13 @@ export interface TransferData {
channel: string;
key: string;
}
export interface FileData {
path: string[];
body: string;
}
export const FileDataReference: FileData = {
path: [""],
body: "",
};