From bf0dc36ea61cdb469a408781a2352f6ae19ad51b Mon Sep 17 00:00:00 2001 From: subnub Date: Wed, 25 Dec 2024 00:56:44 -0500 Subject: [PATCH] video stream optimizations --- .../chunk-service/utils/getFileData.ts | 56 +++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) diff --git a/backend/services/chunk-service/utils/getFileData.ts b/backend/services/chunk-service/utils/getFileData.ts index 993b808..06f7ceb 100644 --- a/backend/services/chunk-service/utils/getFileData.ts +++ b/backend/services/chunk-service/utils/getFileData.ts @@ -7,13 +7,49 @@ import crypto from "crypto"; import { createGenericParams } from "./storageHelper"; import { getStorageActions } from "../actions/helper-actions"; import FileDB from "../../../db/mongoDB/fileDB"; -// @ts-ignore -import streamSkip from "stream-skip"; +import { FileInterface } from "../../../models/file-model"; const fileDB = new FileDB(); const storageActions = getStorageActions(); +const activeStreams = new Map< + string, + { + readStream: NodeJS.ReadableStream; + decipherStream: NodeJS.ReadableStream; + file: FileInterface; + } +>(); + +const getFileAndRemoveActiveStream = async ( + fileID: string, + userID: string, + isVideoStream: boolean +) => { + const cachedFileData = activeStreams.get(fileID); + if (!cachedFileData || !isVideoStream) { + const file = await fileDB.getFileInfo(fileID, userID); + if (!file) { + throw new NotFoundError("File not found"); + } + return file; + } else { + const { file, readStream, decipherStream } = cachedFileData; + try { + activeStreams.delete(fileID); + // @ts-ignore + readStream.destroy(); + // @ts-ignore + decipherStream.destroy(); + console.log("Destroyed streams"); + } catch (e) { + console.log("Error destroying streams", e); + } + return file; + } +}; + const proccessData = ( res: Response, fileID: string, @@ -32,7 +68,11 @@ const proccessData = ( const processFile = async () => { try { - const currentFile = await fileDB.getFileInfo(fileID, user._id.toString()); + const currentFile = await getFileAndRemoveActiveStream( + fileID, + user._id.toString(), + !!range + ); if (!currentFile) throw new NotFoundError("Download File Not Found"); @@ -47,7 +87,7 @@ const proccessData = ( Key: currentFile.metadata.s3ID, }); - let readStream; + let readStream: NodeJS.ReadableStream; if (range) { readStream = storageActions.createReadStreamWithRange( @@ -75,6 +115,14 @@ const proccessData = ( eventEmitter.emit("error", e); }); + if (!!range) { + activeStreams.set(fileID, { + readStream, + decipherStream: decipher, + file: currentFile, + }); + } + res.on("error", (e: Error) => { eventEmitter.emit("error", e); });