44 lines
1.4 KiB
JavaScript
44 lines
1.4 KiB
JavaScript
import { requireAuth } from '../../../utils/authHelpers.js'
|
|
import { getLiveSession, updateLiveSession } from '../../../utils/liveSessions.js'
|
|
import { getTransport, producers } from '../../../utils/mediasoup.js'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const user = requireAuth(event)
|
|
const body = await readBody(event).catch(() => ({}))
|
|
const { sessionId, transportId, kind, rtpParameters } = body
|
|
|
|
if (!sessionId || !transportId || !kind || !rtpParameters) {
|
|
throw createError({ statusCode: 400, message: 'sessionId, transportId, kind, and rtpParameters required' })
|
|
}
|
|
|
|
const session = getLiveSession(sessionId)
|
|
if (!session) {
|
|
throw createError({ statusCode: 404, message: 'Session not found' })
|
|
}
|
|
if (session.userId !== user.id) {
|
|
throw createError({ statusCode: 403, message: 'Forbidden' })
|
|
}
|
|
|
|
const transport = getTransport(transportId)
|
|
if (!transport) {
|
|
throw createError({ statusCode: 404, message: 'Transport not found' })
|
|
}
|
|
|
|
const producer = await transport.produce({ kind, rtpParameters })
|
|
producers.set(producer.id, producer)
|
|
producer.on('close', () => {
|
|
producers.delete(producer.id)
|
|
const s = getLiveSession(sessionId)
|
|
if (s && s.producerId === producer.id) {
|
|
updateLiveSession(sessionId, { producerId: null })
|
|
}
|
|
})
|
|
|
|
updateLiveSession(sessionId, { producerId: producer.id })
|
|
|
|
return {
|
|
id: producer.id,
|
|
kind: producer.kind,
|
|
}
|
|
})
|