fix(buffer): merge events in queue and get last screen view from buffer instead of cache

This commit is contained in:
Carl-Gerhard Lindesvärd
2025-02-18 23:08:38 +01:00
parent 3fd4382c76
commit 8e94ce5877
4 changed files with 50 additions and 71 deletions

View File

@@ -79,7 +79,7 @@ export async function createSessionEnd(
const [lastScreenView, eventsInDb] = await Promise.all([
eventBuffer.getLastScreenView({
projectId: payload.projectId,
profileId: payload.profileId || payload.deviceId,
sessionId: payload.sessionId,
}),
getCompleteSessionWithSessionStart({
projectId: payload.projectId,

View File

@@ -7,8 +7,11 @@ import { createSessionEnd, getSessionEnd } from '@/utils/session-handler';
import { isSameDomain, parsePath } from '@openpanel/common';
import { parseUserAgent } from '@openpanel/common/server';
import type { IServiceCreateEventPayload, IServiceEvent } from '@openpanel/db';
import { checkNotificationRulesForEvent, createEvent } from '@openpanel/db';
import { getLastScreenViewFromProfileId } from '@openpanel/db';
import {
checkNotificationRulesForEvent,
createEvent,
eventBuffer,
} from '@openpanel/db';
import type { EventsQueuePayloadIncomingEvent } from '@openpanel/queue';
import * as R from 'ramda';
@@ -106,7 +109,7 @@ export async function incomingEvent(job: Job<EventsQueuePayloadIncomingEvent>) {
// if timestamp is from the past we dont want to create a new session
if (uaInfo.isServer || isTimestampFromThePast) {
const event = profileId
? await getLastScreenViewFromProfileId({
? await eventBuffer.getLastScreenView({
profileId,
projectId,
})
@@ -124,13 +127,21 @@ export async function incomingEvent(job: Job<EventsQueuePayloadIncomingEvent>) {
profileId,
});
const lastScreenView = await eventBuffer.getLastScreenView({
projectId,
sessionId: sessionEnd.payload.sessionId,
});
const payload: IServiceCreateEventPayload = merge(baseEvent, {
deviceId: sessionEnd.payload.deviceId,
sessionId: sessionEnd.payload.sessionId,
referrer: sessionEnd.payload?.referrer,
referrerName: sessionEnd.payload?.referrerName,
referrerType: sessionEnd.payload?.referrerType,
}) as IServiceCreateEventPayload;
// if the path is not set, use the last screen view path
path: baseEvent.path || lastScreenView?.path || '',
origin: baseEvent.origin || lastScreenView?.origin || '',
} as Partial<IServiceCreateEventPayload>) as IServiceCreateEventPayload;
if (sessionEnd.notFound) {
await createSessionEnd({ payload });