Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ GOOGLE_API_KEY=key

CLERK_PUBLISHABLE_KEY=key
CLERK_SECRET_KEY=key
CLERK_JWT_KEY=key

MCP_SERVER_PATH=./src/mcp-server/index.js

Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
/node_modules
/dist
.vscode/mcp.json
/src/private
2 changes: 1 addition & 1 deletion src/app.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
import './express.js';
import './ws.js';
import './wsocket/ws.js';
11 changes: 11 additions & 0 deletions src/routes/api.ai.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,17 @@ router.post('/create', verify_auth, async (req: Request, res: Response) => {
const mcpService = getMCPService();
await mcpService.ensureConnected();

const existingSession = chats.find(chat => chat.userID === user.id);

if (existingSession)
{
res.json({
success: true,
session: existingSession,
mcpConnected: mcpService.isConnected()
});
}

const session: Chat = {
uuid: randomUUID(),
userID: user.id,
Expand Down
34 changes: 8 additions & 26 deletions src/ws.ts → src/wsocket/routes/collaboration.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,11 @@
import { Server } from "socket.io";
import { createServer } from 'http';
import { Server, Socket } from "socket.io";
import notes from "../../assets/ts/notes.js";
import { Note } from "../../assets/ts/types.js";
import * as Y from "yjs";
import * as awarenessProtocol from "y-protocols/awareness";
import fs from 'fs';
import path from 'path';
import __dirname from "./assets/ts/_dirname.js";
const config = JSON.parse(fs.readFileSync(path.join(__dirname, '../../config.json'), 'utf-8'))
import notes from "./assets/ts/notes.js";
import { Note } from "./assets/ts/types.js";
import Share from "./assets/ts/db/share/Share.js";
import Share from "../../assets/ts/db/share/Share.js";


const httpServer = createServer();

const save_note = async (note: Note): Promise<void> => {
await notes.updateNote({
Expand All @@ -26,12 +21,6 @@ const get_note = async (uuid: string): Promise<Note | undefined> => {
}


const io = new Server(httpServer, {
cors: { origin: config.corsOptions.origin },
path: "/socket.io/share",
transports: ["websocket", "polling"]
});

const docs = new Map<string, {
ydoc: Y.Doc,
awareness: awarenessProtocol.Awareness,
Expand All @@ -40,11 +29,10 @@ const docs = new Map<string, {
icon: string
}>();

io.on("connection", (socket) => {

console.log("Client connected :", socket.id);

// Stocker la room du socket pour l'utiliser dans les autres événements
export default (io: Server, socket: Socket) => {

let currentRoom: string | null = null;

socket.on("join-room", async ({ room, userId }: { room: string, userId: string }) => {
Expand Down Expand Up @@ -263,10 +251,4 @@ io.on("connection", (socket) => {
console.log("Client disconnected:", socket.id);
});

});

console.log("Socket.IO server running...");

httpServer.listen('3434', () => {
console.log(`Serveur WebSocket sur le port 3434`);
});
};
12 changes: 12 additions & 0 deletions src/wsocket/routes/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import collaboration from "./collaboration.js";
import user from "./user.js";
import notes from "./notes.js";
import tags from "./tags.js";


export default [
collaboration,
user,
notes,
tags
]
74 changes: 74 additions & 0 deletions src/wsocket/routes/notes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { Server, Socket } from "socket.io";
import type { Note } from "../../assets/ts/types.js";
import notes from "../../assets/ts/notes.js";


export default (io: Server, socket: Socket) => {

socket.on('note:create', async (note: Note) => {

const userId = socket.data.userId;

if (note.user_id !== userId)
{
socket.emit('error', 'Unauthorized');
return;
}

const res = await notes.createNote(note);

if (res.error)
{
socket.emit('error', res.error);
return;
}

socket.to(`user:${userId}`).emit('note:create', res.note);

})

socket.on('note:update', async (note: Note) => {

const userId = socket.data.userId;

if (note.user_id !== userId)
{
socket.emit('error', 'Unauthorized');
return;
}

const res = await notes.updateNote(note);

if (res.error)
{
socket.emit('error', res.error);
return;
}

socket.to(`user:${userId}`).emit('note:update', note);

})

socket.on('note:delete', async (note: Note) => {

const userId = socket.data.userId;

if (note.user_id !== userId)
{
socket.emit('error', 'Unauthorized');
return;
}

const res = await notes.deleteNoteByUUID(note.user_id, note.uuid!);

if (res.error)
{
socket.emit('error', res.error);
return;
}

socket.to(`user:${userId}`).emit('note:delete', note);

})

};
74 changes: 74 additions & 0 deletions src/wsocket/routes/tags.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { Server, Socket } from "socket.io";
import type { Tag } from "../../assets/ts/types.js";
import tags from "../../assets/ts/tags.js";


export default (io: Server, socket: Socket) => {

socket.on('tag:create', async (tag: Tag) => {

const userId = socket.data.userId;

if (tag.user_id !== userId)
{
socket.emit('error', 'Unauthorized');
return;
}

const res = await tags.createTag(tag);

if (res.error)
{
socket.emit('error', res.error);
return;
}

socket.to(`user:${userId}`).emit('tag:create', res.tag);

})

socket.on('tag:update', async (tag: Tag) => {

const userId = socket.data.userId;

if (tag.user_id !== userId)
{
socket.emit('error', 'Unauthorized');
return;
}

const res = await tags.updateTag(tag);

if (res.error)
{
socket.emit('error', res.error);
return;
}

socket.to(`user:${userId}`).emit('tag:update', res.tag);

})

socket.on('tag:delete', async (tag: Tag) => {

const userId = socket.data.userId;

if (tag.user_id !== userId)
{
socket.emit('error', 'Unauthorized');
return;
}

const res = await tags.deleteTagByUUID(tag.user_id!, tag.uuid!);

if (res.error)
{
socket.emit('error', res.error);
return;
}

socket.to(`user:${userId}`).emit('tag:delete', tag);

})

};
26 changes: 26 additions & 0 deletions src/wsocket/routes/user.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Server, Socket } from "socket.io";


export default (io: Server, socket: Socket) => {

socket.on('user-connect', () => {

const userId = socket.data.userId;

socket.join(`user:${userId}`);

console.log(`[WS] User ${userId} joined silvernote socket.`);

})

socket.on('disconnect', () => {

const userId = socket.data.userId;

socket.leave(`user:${userId}`);

console.log(`[WS] User ${userId} left silvernote socket.`);

})

};
62 changes: 62 additions & 0 deletions src/wsocket/ws.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { Server } from "socket.io";
import { createServer } from 'http';
import fs from 'fs';
import path from 'path';
import __dirname from "../assets/ts/_dirname.js";
const config = JSON.parse(fs.readFileSync(path.join(__dirname, '../../config.json'), 'utf-8'))
import routes from "./routes/index.js";
import { verifyToken } from "@clerk/express";

const httpServer = createServer();


const io = new Server(httpServer, {
cors: { origin: config.corsOptions.origin },
path: "/socket",
transports: ["websocket", "polling"]
});


io.use(async (socket, next) => {

const token = socket.handshake.auth.token; // on client in socket init

if (!token)
{
return next(new Error("Unauthorized: No token provided"));
}

try {

const sessionClaims = await verifyToken(token, {
jwtKey: process.env.CLERK_JWT_KEY as string
});

socket.data.userId = sessionClaims.sub;

next();

}
catch (error)
{
console.error("Erreur d'auth Socket.io :", error);
next(new Error("Unauthorized: Invalid token"));
}

});

io.on("connection", (socket) => {

routes.forEach((registerRoutes) => {
registerRoutes(io, socket);
});

});



console.log("Socket.IO server running...");

httpServer.listen('3434', () => {
console.log(`Serveur WebSocket sur le port 3434`);
});