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
+5 -1
View File
@@ -161,7 +161,7 @@ export default class ConnectionModel {
tryToSendMessage = (chatMessage: ChatMessage): boolean => { tryToSendMessage = (chatMessage: ChatMessage): boolean => {
const stringifiedBody: string = stringify(chatMessage); const stringifiedBody: string = stringify(chatMessage);
const isSent: boolean = this.udn.sendMessage( const isSent: boolean = this.sendPlainMessage(
chatMessage.channel, chatMessage.channel,
stringifiedBody stringifiedBody
); );
@@ -169,6 +169,10 @@ export default class ConnectionModel {
return isSent; return isSent;
}; };
sendPlainMessage = (channel: string, body: string): boolean => {
return this.udn.sendMessage(channel, body);
};
// storage // storage
getPreviousAddressPath = (): string[] => { getPreviousAddressPath = (): string[] => {
return StorageModel.getPath( return StorageModel.getPath(
+77 -2
View File
@@ -1,14 +1,21 @@
// this file is responsible for sending and handling files. // 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 ConnectionModel from "./connectionModel";
import { Message } from "udn-frontend";
import StorageModel from "./storageModel"; import StorageModel from "./storageModel";
import { generateRandomToken } from "../Utility/utility"; import { checkMatchesObjectStructure } from "../Utility/typeSafety";
export default class FileTransferModel { export default class FileTransferModel {
storageModel: StorageModel; storageModel: StorageModel;
connectionModel: ConnectionModel; connectionModel: ConnectionModel;
// methods // data
transferData: TransferData | undefined;
// general
generateTransferData = (): TransferData => { generateTransferData = (): TransferData => {
return { return {
channel: generateRandomToken(2), 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 // init
constructor(storageModel: StorageModel, connectionModel: ConnectionModel) { constructor(storageModel: StorageModel, connectionModel: ConnectionModel) {
this.storageModel = storageModel; this.storageModel = storageModel;
this.connectionModel = connectionModel; this.connectionModel = connectionModel;
this.connectionModel.messageHandlerManager.addHandler(this.handleMessage);
} }
} }
@@ -27,3 +92,13 @@ export interface TransferData {
channel: string; channel: string;
key: string; key: string;
} }
export interface FileData {
path: string[];
body: string;
}
export const FileDataReference: FileData = {
path: [""],
body: "",
};