diff --git a/packages/file_server/src/controllers/stream/index.js b/packages/file_server/src/controllers/stream/index.js new file mode 100644 index 00000000..6994bfa9 --- /dev/null +++ b/packages/file_server/src/controllers/stream/index.js @@ -0,0 +1,20 @@ +import path from "path" +import createRoutesFromDirectory from "@utils/createRoutesFromDirectory" +import getMiddlewares from "@utils/getMiddlewares" + +export default async (router) => { + const routesPath = path.resolve(__dirname, "routes") + + const middlewares = await getMiddlewares(["withOptionalAuth"]) + + for (const middleware of middlewares) { + router.use(middleware) + } + + router = createRoutesFromDirectory("routes", routesPath, router) + + return { + path: "/stream", + router, + } +} \ No newline at end of file diff --git a/packages/file_server/src/controllers/stream/routes/get/*.js b/packages/file_server/src/controllers/stream/routes/get/*.js new file mode 100644 index 00000000..0fda1e2a --- /dev/null +++ b/packages/file_server/src/controllers/stream/routes/get/*.js @@ -0,0 +1,24 @@ +import { NotFoundError, InternalServerError } from "@shared-classes/Errors" +import mimetypes from "mime-types" + +export default async (req, res) => { + const streamPath = req.params[0] + + global.storage.getObject(process.env.S3_BUCKET, streamPath, (err, dataStream) => { + if (err) { + console.error(err) + return new InternalServerError(req, res, "Error while getting file from storage") + } + + const extname = mimetypes.lookup(streamPath) + + // send chunked response + res.status(200) + + // set headers + res.setHeader("Content-Type", extname) + res.setHeader("Accept-Ranges", "bytes") + + return dataStream.pipe(res) + }) +} \ No newline at end of file