Merge pull request #3469 from KrakenWagen/create_session_slow

improv: Improved performance of send
This commit is contained in:
Mike Cao 2025-06-18 14:29:03 -07:00 committed by GitHub
commit acc323dbc9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 49 additions and 42 deletions

View file

@ -4,7 +4,7 @@ import { startOfHour, startOfMonth } from 'date-fns';
import clickhouse from '@/lib/clickhouse';
import { parseRequest } from '@/lib/request';
import { badRequest, json, forbidden, serverError } from '@/lib/response';
import { fetchSession, fetchWebsite } from '@/lib/load';
import { fetchWebsite } from '@/lib/load';
import { getClientInfo, hasBlockedIp } from '@/lib/detect';
import { createToken, parseToken } from '@/lib/jwt';
import { secret, uuid, hash } from '@/lib/crypto';
@ -103,32 +103,24 @@ export async function POST(request: Request) {
const sessionId = id ? uuid(websiteId, id) : uuid(websiteId, ip, userAgent, sessionSalt);
// Find session
// Create a session if not found
if (!clickhouse.enabled && !cache?.sessionId) {
const session = await fetchSession(websiteId, sessionId);
// Create a session if not found
if (!session) {
try {
await createSession({
id: sessionId,
websiteId,
browser,
os,
device,
screen,
language,
country,
region,
city,
distinctId: id,
});
} catch (e: any) {
if (!e.message.toLowerCase().includes('unique constraint')) {
return serverError(e);
}
}
}
await createSession(
{
id: sessionId,
websiteId,
browser,
os,
device,
screen,
language,
country,
region,
city,
distinctId: id,
},
{ skipDuplicates: true },
);
}
// Visit info

View file

@ -1,7 +1,10 @@
import { Prisma } from '@prisma/client';
import prisma from '@/lib/prisma';
export async function createSession(data: Prisma.SessionCreateInput) {
export async function createSession(
data: Prisma.SessionCreateInput,
options = { skipDuplicates: false },
) {
const {
id,
websiteId,
@ -16,19 +19,31 @@ export async function createSession(data: Prisma.SessionCreateInput) {
distinctId,
} = data;
return prisma.client.session.create({
data: {
id,
websiteId,
browser,
os,
device,
screen,
language,
country,
region,
city,
distinctId,
},
});
try {
return await prisma.client.session.create({
data: {
id,
websiteId,
browser,
os,
device,
screen,
language,
country,
region,
city,
distinctId,
},
});
} catch (e: any) {
// With skipDuplicates flag: ignore unique constraint error and return null
if (
options.skipDuplicates &&
e instanceof Prisma.PrismaClientKnownRequestError &&
e.code === 'P2002'
) {
return null;
}
throw e;
}
}