Files
SubMiner/src/core/services/immersion-tracker/session.ts
2026-03-02 02:45:51 -08:00

47 lines
1.3 KiB
TypeScript

import crypto from 'node:crypto';
import type { DatabaseSync } from 'node:sqlite';
import { createInitialSessionState } from './reducer';
import { SESSION_STATUS_ACTIVE, SESSION_STATUS_ENDED } from './types';
import type { SessionState } from './types';
export function startSessionRecord(
db: DatabaseSync,
videoId: number,
startedAtMs = Date.now(),
): { sessionId: number; state: SessionState } {
const sessionUuid = crypto.randomUUID();
const nowMs = Date.now();
const result = db
.prepare(
`
INSERT INTO imm_sessions (
session_uuid, video_id, started_at_ms, status,
CREATED_DATE, LAST_UPDATE_DATE
) VALUES (?, ?, ?, ?, ?, ?)
`,
)
.run(sessionUuid, videoId, startedAtMs, SESSION_STATUS_ACTIVE, startedAtMs, nowMs);
const sessionId = Number(result.lastInsertRowid);
return {
sessionId,
state: createInitialSessionState(sessionId, videoId, startedAtMs),
};
}
export function finalizeSessionRecord(
db: DatabaseSync,
sessionState: SessionState,
endedAtMs = Date.now(),
): void {
db.prepare(
`
UPDATE imm_sessions
SET
ended_at_ms = ?,
status = ?,
LAST_UPDATE_DATE = ?
WHERE session_id = ?
`,
).run(endedAtMs, SESSION_STATUS_ENDED, Date.now(), sessionState.sessionId);
}