Add rrweb-based session recording feature.

Implements full session recording with rrweb for DOM capture and rrweb-player
for playback. Includes: Prisma schema for SessionRecording model, chunked
gzip-compressed storage, recorder script built via Rollup, collection API
endpoint, recordings list/playback UI pages, website recording settings,
and cascade delete support.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Mike Cao 2026-02-06 15:49:59 -08:00
parent b9eb5f9800
commit 72b5c658e2
36 changed files with 1131 additions and 21 deletions

View file

@ -0,0 +1,25 @@
-- AlterTable
ALTER TABLE "website" ADD COLUMN "recording_enabled" BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE "website" ADD COLUMN "recording_config" JSONB;
-- CreateTable
CREATE TABLE "session_recording" (
"recording_id" UUID NOT NULL,
"website_id" UUID NOT NULL,
"session_id" UUID NOT NULL,
"chunk_index" INTEGER NOT NULL,
"events" BYTEA NOT NULL,
"event_count" INTEGER NOT NULL,
"started_at" TIMESTAMPTZ(6) NOT NULL,
"ended_at" TIMESTAMPTZ(6) NOT NULL,
"created_at" TIMESTAMPTZ(6) DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "session_recording_pkey" PRIMARY KEY ("recording_id")
);
-- CreateIndex
CREATE INDEX "session_recording_website_id_idx" ON "session_recording"("website_id");
CREATE INDEX "session_recording_session_id_idx" ON "session_recording"("session_id");
CREATE INDEX "session_recording_website_id_session_id_idx" ON "session_recording"("website_id", "session_id");
CREATE INDEX "session_recording_website_id_created_at_idx" ON "session_recording"("website_id", "created_at");
CREATE INDEX "session_recording_session_id_chunk_index_idx" ON "session_recording"("session_id", "chunk_index");