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; }; /** * 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; }, }; }