Files
myDrive/backend/services/ChunkService/utils/awaitStreamVideo.ts
T

76 lines
2.4 KiB
TypeScript

import {Response, Request} from "express"
const StreamSkip = require("stream-skip");
const awaitStreamVideo = (start: number, end:number, differenceStart: number,
decipher: any, res: Response, req: Request, streamsToErrorCatch: any[], readStream: any) => {
return new Promise((resolve, reject) => {
req.on("close", () => {
// readStream.close();
decipher.destroy();
resolve();
})
req.on("end", () => {
streamsToErrorCatch.forEach((stream) => {
stream.destroy();
})
resolve();
})
streamsToErrorCatch.forEach((currentStream) => {
currentStream.on("error", (e: Error) => {
reject({
message: "Await Video Stream Input Error",
code: 500,
error: e
})
})
})
readStream.on("close", () => {
decipher.destroy();
})
if (+start === 0 && +end === 1) {
// This is for Safri/iOS, for whatever reason they ask for the
// First byte, but if I actually try to return the first byte
// It will not work ???, but if I return the first 4 bytes it seems
// To work fine.
decipher.on("data", (data: Buffer | string) => {
const dataCoverted = data.toString("hex");
let neededData = dataCoverted.substring(0, 8);
const dataBack = Buffer.from(neededData, "hex");
res.write(dataBack);
})
} else {
// This is where the differnce start comes into play, as I said before
// There will be an offset caused by the 16 block size of AES256.
// So if there was an offset we need to skip over those bytes
// To make sure it returns the exact position the browser is requesting.
// Most browsers will still work fine without this, such as Chrome and Firefox.
// But one browser needs to be pampered and fed the exact right bytes in
// Order to function correctly, can you guess what browser? If you
// Guessed Safari you would be correct.
const streamSkip = new StreamSkip({skip: differenceStart});
decipher.pipe(streamSkip).pipe(res);
}
})
}
export default awaitStreamVideo;