diff --git a/src/index.ts b/src/index.ts index c42303d..313c6f0 100755 --- a/src/index.ts +++ b/src/index.ts @@ -30,9 +30,10 @@ const port = app.use(express.static("public")); -app.use(bodyParser.raw()); +app.use(bodyParser.raw({ limit: "10mb" })); -app.use("/scene/:id", restHandler("scene")); +app.use("/scene/*", restHandler("scene")); +app.use("/file/*", restHandler("file")); app.get("/", (req, res) => { res.send("Excalidraw collaboration server is up :)"); diff --git a/src/restHandler.ts b/src/restHandler.ts index 8ce4115..749d7ea 100644 --- a/src/restHandler.ts +++ b/src/restHandler.ts @@ -1,77 +1,75 @@ import type { RequestHandler } from "express"; -interface Scene { +interface Resource { hash: string; data: ArrayBuffer; } -export function restHandler(_resourceName: string): RequestHandler { - const scenes: Record = {}; +export function restHandler(_resName: string): RequestHandler { + const resources: Record = {}; const _put: RequestHandler = (req, res, next) => { - const sceneId = req.params.id; - const newSceneData = req.body as ArrayBuffer; - const newSceneHash = req.header("ETag"); - const oldSceneHash = req.header("If-Match"); - console.log(oldSceneHash, newSceneHash, newSceneData); + const resId = req.params[0]; + const newData = req.body as ArrayBuffer; + const newHash = req.header("ETag"); + const oldHash = req.header("If-Match"); - if (!newSceneHash || !newSceneData) { + if (!newHash || !newData) { res.status(400).send("Data or hash not provided."); return; } - if (scenes[sceneId] && scenes[sceneId].hash != oldSceneHash) { + if (resources[resId] && resources[resId].hash != oldHash) { res.status(409).send("Hash mismatch. Update denied."); return; } - scenes[sceneId] = { - hash: newSceneHash, - data: newSceneData, + resources[resId] = { + hash: newHash, + data: newData, }; - res.status(200).send(`Scene with ID ${sceneId} has been upserted.`); + res.status(200).send(`Resource with ID ${resId} has been upserted.`); next(); }; const _get: RequestHandler = (req, res, next) => { - const sceneId = req.params.id; - const oldSceneHash = req.header("If-None-Match"); + const resId = req.params[0]; + const oldHash = req.header("If-None-Match"); - if (!scenes[sceneId]) { + if (!resources[resId]) { res.status(404).send("Not found."); return; } - if (scenes[sceneId] && scenes[sceneId].hash == oldSceneHash) { + if (resources[resId] && resources[resId].hash == oldHash) { res.status(304).send("Not modified."); return; } // TODO: Respect If-None-Match header - const scene = scenes[sceneId]; - res.header("ETag", scene.hash).header("Content-Type", "application/octet-stream"); - res.status(200).send(scene.data); + const resource = resources[resId]; + res.header("ETag", resource.hash).header("Content-Type", "application/octet-stream"); + res.status(200).send(resource.data); next(); }; const _options: RequestHandler = (req, res, next) => { - const sceneId = req.params.id; - delete scenes[sceneId]; + const resId = req.params[0]; + delete resources[resId]; res.status(200).end(); next(); }; const _delete: RequestHandler = (req, res, next) => { - const sceneId = req.params.id; - delete scenes[sceneId]; + const resId = req.params[0]; + delete resources[resId]; res.status(200).end(); next(); }; return (req, res, next) => { - const id = req.params.id; res.header("Access-Control-Allow-Origin", process.env.CORS_ORIGIN || "*"); res.header("Access-Control-Allow-Methods", "GET, PUT, DELETE, OPTIONS"); res.header("Access-Control-Allow-Headers", "Content-Type, ETag, If-Match, If-None-Match");