storage/src/server.ts

65 lines
1.6 KiB
TypeScript

import bodyParser from "body-parser";
import cors from "cors";
import express from "express";
import { getLocalStorage } from ".";
import { KeyValueStorage } from "./basic";
import { HEADER_REPLYIER, HEADER_REQUESTER } from "./remote";
type Server = {
close: () => Promise<void>
}
/**
* Start a server compliant with RestRemoteStorage
*/
export function startRestServer(port: number, storage: KeyValueStorage): Promise<Server> {
const app = express();
app.use(
cors({ exposedHeaders: [HEADER_REPLYIER] }),
bodyParser.text(),
(req, res, next) => {
if (req.header(HEADER_REQUESTER)) {
res.set(HEADER_REPLYIER, "ok");
next();
} else {
res.status(400).send();
}
},
);
app.get("*", (req, res, next) => {
storage.get(req.path).then(result => {
if (result === null) {
res.status(404).send();
} else {
res.send(result);
}
}).catch(next);
});
app.put("*", (req, res, next) => {
storage.set(req.path, req.body).then(() => {
res.send();
}).catch(next);
});
app.delete("*", (req, res, next) => {
storage.set(req.path, null).then(() => {
res.send();
}).catch(next);
});
return new Promise((resolve) => {
const server = app.listen(port, () => {
resolve({
close: () => new Promise((resolve, reject) => {
server.close((err) => err ? reject(err) : resolve());
})
})
});
});
}
if (typeof require !== "undefined" && require.main === module) {
startRestServer(5001, getLocalStorage("tk-storage-server")).then(() => {
console.log(`Server running, use http://localhost:5001 to connect`);
});
}