Implement most of status system (still kinda bootycheeks at checking if
you're connected), fionally fix prettierrc
This commit is contained in:
parent
126acf52f3
commit
e64910d895
29 changed files with 2001 additions and 879 deletions
48
src/routes/api/updates/+server.ts
Normal file
48
src/routes/api/updates/+server.ts
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
interface SubscribedTo {
|
||||
subscribed: string[];
|
||||
userId: string;
|
||||
controller: ReadableStreamDefaultController;
|
||||
}
|
||||
|
||||
export const _clients = new Map<string, SubscribedTo>();
|
||||
export function _sendToSubscribers(userId: string, payload: unknown) {
|
||||
for (const client of _clients) {
|
||||
if (client[1].subscribed.includes(userId)) {
|
||||
try {
|
||||
client[1].controller.enqueue(`data: ${JSON.stringify(payload)}\n\n`);
|
||||
} catch {
|
||||
_clients.delete(client[0]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
export async function GET({ locals, request }) {
|
||||
if (!locals.user) {
|
||||
return new Response('No authentication', { status: 401 });
|
||||
}
|
||||
|
||||
const subscribed = locals.user.friends.map((z) => z.id);
|
||||
const reqId = crypto.randomUUID();
|
||||
|
||||
const stream = new ReadableStream({
|
||||
start(controller) {
|
||||
_clients.set(reqId, { subscribed, userId: locals.user!.id, controller });
|
||||
console.log(`SSE Client opened. ${_clients.size}`);
|
||||
|
||||
controller.enqueue(`data: ${JSON.stringify({ type: 'connected' })}\n\n`);
|
||||
|
||||
request.signal.addEventListener('abort', () => {
|
||||
_clients.delete(reqId);
|
||||
console.log(`SSE Client aborted. ${_clients.size}`);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return new Response(stream, {
|
||||
headers: {
|
||||
'Content-Type': 'text/event-stream',
|
||||
'Cache-Control': 'no-cache',
|
||||
Connection: 'keep-alive'
|
||||
}
|
||||
});
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue