65 lines
1.6 KiB
TypeScript
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`);
|
|
});
|
|
}
|