diff --git a/apps/worker/src/jobs/events.create-session-end.ts b/apps/worker/src/jobs/events.create-session-end.ts index 9ac19922..d7b08f79 100644 --- a/apps/worker/src/jobs/events.create-session-end.ts +++ b/apps/worker/src/jobs/events.create-session-end.ts @@ -1,4 +1,5 @@ import type { Job } from 'bullmq'; +import { last } from 'ramda'; import { getTime } from '@openpanel/common'; import { @@ -58,12 +59,26 @@ export async function createSessionEnd( return acc + event.duration; }, 0); - const sessionStart = events.find((event) => event.name === 'session_start'); + let sessionStart = events.find((event) => event.name === 'session_start'); const lastEvent = events[0]; const screenViews = events.filter((event) => event.name === 'screen_view'); if (!sessionStart) { - throw new Error('Failed to find a session_start'); + const firstScreenView = last(screenViews); + + if (!firstScreenView) { + throw new Error('Could not found session_start or any screen_view'); + } + + job.log('Creating session_start since it was not found'); + + sessionStart = { + ...firstScreenView, + name: 'session_start', + createdAt: new Date(getTime(firstScreenView.createdAt) - 100), + }; + + await createEvent(sessionStart); } if (!lastEvent) { diff --git a/apps/worker/src/jobs/events.incoming-event.ts b/apps/worker/src/jobs/events.incoming-event.ts index 898d25e6..5d19f1cc 100644 --- a/apps/worker/src/jobs/events.incoming-event.ts +++ b/apps/worker/src/jobs/events.incoming-event.ts @@ -181,8 +181,7 @@ export async function incomingEvent(job: Job) { await createEvent({ ...payload, name: 'session_start', - // @ts-expect-error - createdAt: toISOString(getTime(payload.createdAt) - 100), + createdAt: new Date(getTime(payload.createdAt) - 100), }); }