diff --git a/apps/web/src/lib/instrumentation/viewerCountSync.ts b/apps/web/src/lib/instrumentation/viewerCountSync.ts index e4fa349..4755f87 100644 --- a/apps/web/src/lib/instrumentation/viewerCountSync.ts +++ b/apps/web/src/lib/instrumentation/viewerCountSync.ts @@ -2,21 +2,39 @@ import { getRedisConnection, prisma } from "@hctv/db"; export async function viewerCountSync() { const streams = await prisma.streamInfo.findMany({ + where: { + isLive: true + }, include: { channel: true } }) - const redis = getRedisConnection(); - for (const stream of streams) { - const viewerCount = await redis.keys(`viewer:${stream.channel.name}:*`); - await prisma.streamInfo.update({ - where: { - username: stream.username, - }, - data: { - viewers: viewerCount.length, - }, - }); + if (streams.length === 0) { + return; } + + const redis = getRedisConnection(); + const multi = redis.multi(); + for (const stream of streams) { + multi.keys(`viewer:${stream.channel.name}:*`); + } + const results = await multi.exec(); + + await prisma.$transaction(async (tx) => { + const updates = results?.map((res, index) => { + const count = Array.isArray(res[1]) ? res[1].length : 0; + const stream = streams[index]; + return tx.streamInfo.update({ + where: { + // using username here because it uses a map + username: stream.username + }, + data: { + viewers: count + } + }) + }) + await Promise.all(updates || []); + }) } \ No newline at end of file diff --git a/package.json b/package.json index e781cd5..662cd0e 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "act": "act --secret-file .env.ci", "db:migrate": "yarn workspace @hctv/db db:migrate", "ui:add": "yarn workspace @hctv/web ui:add", - "prisma": "yarn workspace @hctv/db prisma" + "prisma": "yarn workspace @hctv/db prisma", + "r:rtmp": "docker compose -f dev/docker-compose.yml restart nginx-rtmp -t 0" }, "devDependencies": { "turbo": "^2.4.4" diff --git a/packages/db/prisma/migrations/20250823172249_index_username_stream_info/migration.sql b/packages/db/prisma/migrations/20250823172249_index_username_stream_info/migration.sql new file mode 100644 index 0000000..0b325eb --- /dev/null +++ b/packages/db/prisma/migrations/20250823172249_index_username_stream_info/migration.sql @@ -0,0 +1,2 @@ +-- CreateIndex +CREATE INDEX "StreamInfo_username_idx" ON "StreamInfo"("username"); diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index 802e732..c96b861 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -81,7 +81,7 @@ model StreamInfo { enableNotifications Boolean @default(true) - // TODO: index on username + @@index([username]) } model Follow {