Files
kestrelos/server/api/live/webrtc/create-consumer.post.js
Madison Grubb 1a566e2d80
Some checks failed
ci/woodpecker/pr/pr Pipeline failed
refactor testing
2026-02-17 11:05:57 -05:00

62 lines
2.2 KiB
JavaScript

import { requireAuth } from '../../../utils/authHelpers.js'
import { getLiveSession } from '../../../utils/liveSessions.js'
import { getRouter, getTransport, getProducer, createConsumer } from '../../../utils/mediasoup.js'
export default defineEventHandler(async (event) => {
const user = requireAuth(event) // Verify authentication
const body = await readBody(event).catch(() => ({}))
const { sessionId, transportId, rtpCapabilities } = body
if (!sessionId || !transportId || !rtpCapabilities) {
throw createError({ statusCode: 400, message: 'sessionId, transportId, and rtpCapabilities required' })
}
const session = getLiveSession(sessionId)
if (!session) {
throw createError({ statusCode: 404, message: `Session not found: ${sessionId}` })
}
// Authorization check: only session owner or admin/leader can consume
if (session.userId !== user.id && user.role !== 'admin' && user.role !== 'leader') {
throw createError({ statusCode: 403, message: 'Forbidden' })
}
if (!session.producerId) {
throw createError({ statusCode: 404, message: 'No producer available for this session' })
}
const transport = getTransport(transportId)
if (!transport) {
throw createError({ statusCode: 404, message: `Transport not found: ${transportId}` })
}
const producer = getProducer(session.producerId)
if (!producer) {
console.error('[create-consumer] Producer not found:', session.producerId)
throw createError({ statusCode: 404, message: `Producer not found: ${session.producerId}` })
}
if (producer.paused) {
await producer.resume()
}
if (producer.closed) {
throw createError({ statusCode: 404, message: 'Producer is closed' })
}
const router = await getRouter(sessionId)
const canConsume = router.canConsume({ producerId: producer.id, rtpCapabilities })
if (!canConsume) {
throw createError({ statusCode: 400, message: 'Cannot consume this producer' })
}
try {
const { params } = await createConsumer(transport, producer, rtpCapabilities)
return params
}
catch (err) {
console.error('[create-consumer] Error creating consumer:', err)
throw createError({ statusCode: 500, message: `Failed to create consumer: ${err.message || String(err)}` })
}
})