storage/src/server.ts

57 lines
1.5 KiB
TypeScript

import { KeyValueStorage } from "./basic.ts";
import { Application, oakCors, readAll } from "../deps.server.ts";
import { HEADER_REPLYIER, HEADER_REQUESTER } from "./remote.ts";
type Server = {
close: () => Promise<void>;
};
/**
* Start a server compliant with RestRemoteStorage
*/
export function startRestServer(
port: number,
storage: KeyValueStorage,
): Server {
const app = new Application();
const controller = new AbortController();
app.use(oakCors());
app.use(async (context) => {
if (context.request.headers.get(HEADER_REQUESTER)) {
context.response.headers.set(HEADER_REPLYIER, "ok");
const method = context.request.method;
const path = context.request.url.pathname;
if (method == "GET") {
const result = await storage.get(path);
if (result === null) {
context.response.status = 404;
} else {
context.response.body = result;
}
} else if (method == "PUT") {
const body = context.request.body({ type: "reader" });
const data = await readAll(body.value);
const value = new TextDecoder().decode(data);
await storage.set(path, value);
} else if (method == "DELETE") {
await storage.set(path, null);
} else {
context.response.status = 405;
}
} else {
context.response.status = 400;
}
});
const listen = app.listen({ port, signal: controller.signal });
return {
close: async () => {
controller.abort();
await listen;
},
};
}