feat: add localId

This commit is contained in:
Steve Korshakov 2025-07-17 20:18:35 -07:00
parent 0b3017ef1b
commit bed3f87cba
3 changed files with 45 additions and 18 deletions

View File

@ -0,0 +1,11 @@
/*
Warnings:
- A unique constraint covering the columns `[sessionId,localId]` on the table `SessionMessage` will be added. If there are existing duplicate values, this will fail.
*/
-- AlterTable
ALTER TABLE "SessionMessage" ADD COLUMN "localId" TEXT;
-- CreateIndex
CREATE UNIQUE INDEX "SessionMessage_sessionId_localId_key" ON "SessionMessage"("sessionId", "localId");

View File

@ -55,11 +55,13 @@ model SessionMessage {
id String @id @default(cuid()) id String @id @default(cuid())
sessionId String sessionId String
session Session @relation(fields: [sessionId], references: [id]) session Session @relation(fields: [sessionId], references: [id])
localId String?
seq Int seq Int
/// [SessionMessageContent] /// [SessionMessageContent]
content Json content Json
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@unique([sessionId, localId])
} }
model Update { model Update {

View File

@ -94,7 +94,7 @@ export async function startApi() {
}); });
// Send session update to all relevant connections // Send session update to all relevant connections
let emitUpdateToInterestedClients = ({event, userId, sessionId, payload, skipSenderConnection}: { let emitUpdateToInterestedClients = ({ event, userId, sessionId, payload, skipSenderConnection }: {
event: string, event: string,
userId: string, userId: string,
sessionId: string, sessionId: string,
@ -595,7 +595,7 @@ export async function startApi() {
}); });
socket.on('message', async (data: any) => { socket.on('message', async (data: any) => {
const { sid, message } = data; const { sid, message, localId } = data;
log({ module: 'websocket' }, `Received message from socket ${socket.id}: ${sid} ${message.length} bytes`); log({ module: 'websocket' }, `Received message from socket ${socket.id}: ${sid} ${message.length} bytes`);
@ -606,6 +606,7 @@ export async function startApi() {
if (!session) { if (!session) {
return; return;
} }
let useLocalId = typeof localId === 'string' ? localId : null;
// Create encrypted message // Create encrypted message
const msgContent: PrismaJson.SessionMessageContent = { const msgContent: PrismaJson.SessionMessageContent = {
@ -641,12 +642,20 @@ export async function startApi() {
const msgSeq = session.seq + 1; const msgSeq = session.seq + 1;
const updSeq = user.seq + 1; const updSeq = user.seq + 1;
if (useLocalId) {
const existing = await tx.sessionMessage.findFirst({
where: { sessionId: sid, localId: useLocalId }
});
return { msg: existing, update: null };
}
// Create message // Create message
const msg = await tx.sessionMessage.create({ const msg = await tx.sessionMessage.create({
data: { data: {
sessionId: sid, sessionId: sid,
seq: msgSeq, seq: msgSeq,
content: msgContent content: msgContent,
localId: useLocalId
} }
}); });
@ -690,9 +699,13 @@ export async function startApi() {
throw error; throw error;
}); });
if (!result) return; // If no update, we're done
if (!result) {
return;
}
// Emit update to relevant clients // Emit update to relevant clients
if (result.update) {
emitUpdateToInterestedClients({ emitUpdateToInterestedClients({
event: 'update', event: 'update',
userId, userId,
@ -705,6 +718,7 @@ export async function startApi() {
}, },
skipSenderConnection: connection skipSenderConnection: connection
}); });
}
}); });
socket.on('update-metadata', async (data: any, callback: (response: any) => void) => { socket.on('update-metadata', async (data: any, callback: (response: any) => void) => {