tamabahan
This commit is contained in:
@@ -10,6 +10,14 @@ import CredentialRoute from "./server/routes/credential_route";
|
|||||||
import DarmasabaRoute from "./server/routes/darmasaba_route";
|
import DarmasabaRoute from "./server/routes/darmasaba_route";
|
||||||
import { convertOpenApiToMcp } from "./server/lib/mcp-converter";
|
import { convertOpenApiToMcp } from "./server/lib/mcp-converter";
|
||||||
|
|
||||||
|
function encode(str: string) {
|
||||||
|
return new TextEncoder().encode(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sleep(ms: number) {
|
||||||
|
return new Promise((r) => setTimeout(r, ms));
|
||||||
|
}
|
||||||
|
|
||||||
const Docs = new Elysia()
|
const Docs = new Elysia()
|
||||||
.use(Swagger({
|
.use(Swagger({
|
||||||
path: "/docs",
|
path: "/docs",
|
||||||
@@ -47,23 +55,32 @@ const app = new Elysia()
|
|||||||
tags: ["MCP"],
|
tags: ["MCP"],
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.get("/mcp", ({ set }) => {
|
.get("/mcp", () => {
|
||||||
set.headers["Content-Type"] = "text/event-stream"
|
// Buat stream SSE
|
||||||
set.headers["Cache-Control"] = "no-cache"
|
const stream = new ReadableStream({
|
||||||
set.headers["Connection"] = "keep-alive"
|
async start(controller) {
|
||||||
|
// Kirim event pertama
|
||||||
|
controller.enqueue(encode("event: ready\ndata: " + JSON.stringify({ ok: true }) + "\n\n"));
|
||||||
|
|
||||||
return (send: (chunk: string) => void) => {
|
// Kirim event tiap 5 detik
|
||||||
// kirim event awal
|
while (true) {
|
||||||
send(`event: ready\ndata: ${JSON.stringify({ ok: true })}\n\n`)
|
controller.enqueue(encode("event: status\ndata: " + JSON.stringify({ timestamp: Date.now() }) + "\n\n"));
|
||||||
|
await sleep(5000);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cancel() {
|
||||||
|
console.log("SSE client disconnected");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// kirim update tiap 5 detik
|
// Kembalikan Response manual
|
||||||
const interval = setInterval(() => {
|
return new Response(stream, {
|
||||||
send(`event: status\ndata: ${JSON.stringify({ timestamp: Date.now() })}\n\n`)
|
headers: {
|
||||||
}, 5000)
|
"Content-Type": "text/event-stream",
|
||||||
|
"Cache-Control": "no-cache",
|
||||||
// stop interval saat client disconnect
|
Connection: "keep-alive"
|
||||||
return () => clearInterval(interval)
|
}
|
||||||
}
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
.get("*", html)
|
.get("*", html)
|
||||||
|
|||||||
Reference in New Issue
Block a user