From f278eb8bf11b1c220a770740f33e0893f7f1a68e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 23 Dec 2025 17:15:02 +0530 Subject: [PATCH] feat(routes): add reconnect route --- src/app/api/reconnect/[id]/route.ts | 93 +++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 src/app/api/reconnect/[id]/route.ts diff --git a/src/app/api/reconnect/[id]/route.ts b/src/app/api/reconnect/[id]/route.ts new file mode 100644 index 0000000..08be11b --- /dev/null +++ b/src/app/api/reconnect/[id]/route.ts @@ -0,0 +1,93 @@ +import SessionManager from '@/lib/session'; + +export const POST = async ( + req: Request, + { params }: { params: Promise<{ id: string }> }, +) => { + try { + const { id } = await params; + + const session = SessionManager.getSession(id); + + if (!session) { + return Response.json({ message: 'Session not found' }, { status: 404 }); + } + + const responseStream = new TransformStream(); + const writer = responseStream.writable.getWriter(); + const encoder = new TextEncoder(); + + const disconnect = session.subscribe((event, data) => { + if (event === 'data') { + if (data.type === 'block') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'block', + block: data.block, + }) + '\n', + ), + ); + } else if (data.type === 'updateBlock') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'updateBlock', + blockId: data.blockId, + patch: data.patch, + }) + '\n', + ), + ); + } else if (data.type === 'researchComplete') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'researchComplete', + }) + '\n', + ), + ); + } + } else if (event === 'end') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'messageEnd', + }) + '\n', + ), + ); + writer.close(); + disconnect(); + } else if (event === 'error') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'error', + data: data.data, + }) + '\n', + ), + ); + writer.close(); + disconnect(); + } + }); + + req.signal.addEventListener('abort', () => { + disconnect(); + writer.close(); + }); + + return new Response(responseStream.readable, { + headers: { + 'Content-Type': 'text/event-stream', + Connection: 'keep-alive', + 'Cache-Control': 'no-cache, no-transform', + }, + }); + } catch (err) { + console.error('Error in reconnecting to session stream: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +};