@trap_stevo/filetide
Version:
Revolutionizing real-time file transfer with seamless, instant communication across any device. Deliver files instantly, regardless of platform, and experience unparalleled speed and control in managing transfers. Elevate your file-sharing capabilities wi
91 lines (90 loc) • 4.34 kB
JavaScript
const path = require("path");
const fs = require("fs");
const {
FileTransferTrackingManager
} = require("./FileTransferTrackingManager.js");
const {
FileTideDebugUtilityManager
} = require("./FileTideDebugUtilityManager.js");
const {
FileUtilityManager
} = require("./FileUtilityManager.js");
class FileTransferReceiverManager {
constructor() {}
async initializeTransfer(data, onError) {
const savePath = FileUtilityManager.getTidePath(path.join(data.path || data.filePath, data.fileName));
FileTideDebugUtilityManager.log("notice", true, `Initializing transfer ~ ${data.fileName} | ${savePath}...`);
if (FileTransferTrackingManager.containsTransfer(data.fileName)) {
FileTideDebugUtilityManager.log("notice", true, `Transfer ~ ${data.fileName} | ${savePath} already initialized.`);
return;
}
try {
const dir = path.dirname(savePath);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, {
recursive: true
});
}
const fileStream = fs.createWriteStream(savePath, {
flags: "w"
});
FileTransferTrackingManager.trackTransfer(data, fileStream);
FileTideDebugUtilityManager.log("notice", true, `Initialized transfer ~ ${data.fileName} | ${savePath}!`);
} catch (error) {
FileTideDebugUtilityManager.log("error", true, `Did not initialize transfer ~ ${data.fileName} | ${savePath}.\n\t\t${error}`);
if (onError) {
onError(`[${data.fileName}] Did not initialize transfer ~ ${error.message}`);
}
}
}
async handleTransferProgress(data, onError) {
let transferState = FileTransferTrackingManager.getTransfer(data.fileName);
if (!transferState) {
await this.initializeTransfer(data);
transferState = tFileTransferTrackingManager.getTransfer(data.fileName);
}
const chunkBuffer = Buffer.from(data.fileChunk);
try {
transferState.fileStream.write(chunkBuffer);
transferState.receivedChunks.add(data.chunkIndex);
} catch (error) {
FileTideDebugUtilityManager.log("error", true, `Did not write chunk ${data.chunkIndex} ~ ${data.fileName}.\n\t\t${error}`);
if (onError) {
onError(`[${data.fileName}] Did not write chunk ${data.chunkIndex} ~ ${error.message}`);
}
}
}
async completeTransfer(data, onComplete) {
let transferState = FileTransferTrackingManager.getTransfer(data.fileName);
FileTideDebugUtilityManager.log("notice", true, `Completing transfer ~ ${data.fileName}...`);
if (!transferState) {
FileTideDebugUtilityManager.log("notice", true, `Did not get transfer state ~ ${data.fileName}...re-initializing....`);
await this.initializeTransfer(data);
transferState = FileTransferTrackingManager.getTransfer(data.fileName);
}
try {
FileTideDebugUtilityManager.log("notice", true, `Verifying transfer state ~ ${data.fileName} completion (${transferState.receivedChunks.size}/${transferState.totalChunks})...`);
FileTideDebugUtilityManager.log("notice", true, `Transfer state ~ ${data.fileName} completed ~ (${transferState.receivedChunks.size === transferState.totalChunks}).`);
if (transferState.receivedChunks.size === transferState.totalChunks) {
transferState.fileStream.end();
console.log(`[${data.fileName}] Transfer complete. All chunks received and file written.`);
FileTransferTrackingManager.untrackTransfer(data.fileName);
FileTideDebugUtilityManager.log("notice", true, `Cleared transfer state ~ ${data.fileName}.`);
FileTransferTrackingManager.outputCurrentTransfers();
if (onComplete) onComplete(data, FileTransferTrackingManager.activeTransfers, true);
} else {
FileTideDebugUtilityManager.log("error", true, `Transfer incomplete. Received ${transferState.receivedChunks.size}/${transferState.totalChunks} chunks.`);
throw new Error(`[${data.fileName}] Transfer incomplete. Received ${transferState.receivedChunks.size}/${transferState.totalChunks} chunks.`);
}
} catch (error) {
FileTideDebugUtilityManager.log("error", true, `Transfer incomplete.\n\t\t${error}`);
if (onComplete) {
onComplete(data, FileTransferTrackingManager.activeTransfers, false, error);
}
}
}
}
module.exports = {
FileTransferReceiverManager
};
;