This commit is contained in:
40
server/plugins/auth.ts
Normal file
40
server/plugins/auth.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import type { Session, User } from 'lucia'
|
||||
import fp from 'fastify-plugin'
|
||||
import { auth } from '../auth/lucia.ts'
|
||||
|
||||
declare module 'fastify' {
|
||||
interface FastifyRequest {
|
||||
user: User | null
|
||||
session: Session | null
|
||||
}
|
||||
}
|
||||
|
||||
export default fp(async (fastify) => {
|
||||
fastify.decorateRequest('user', null)
|
||||
fastify.decorateRequest('session', null)
|
||||
|
||||
fastify.addHook('preHandler', async (req, reply) => {
|
||||
try {
|
||||
const sessionId = auth.readSessionCookie(req.headers.cookie ?? '')
|
||||
|
||||
const { session, user } = await auth.validateSession(sessionId ?? '')
|
||||
|
||||
if (session && session.fresh) {
|
||||
const cookie = auth.createSessionCookie(session.id)
|
||||
reply.setCookie(cookie.name, cookie.value, cookie.attributes)
|
||||
}
|
||||
|
||||
if (!session) {
|
||||
const blank = auth.createBlankSessionCookie()
|
||||
reply.setCookie(blank.name, blank.value, blank.attributes)
|
||||
}
|
||||
|
||||
req.user = user
|
||||
req.session = session
|
||||
}
|
||||
catch {
|
||||
req.user = null
|
||||
req.session = null
|
||||
}
|
||||
})
|
||||
})
|
||||
29
server/plugins/mediasoup-router.ts
Normal file
29
server/plugins/mediasoup-router.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import type * as mediasoup from 'mediasoup'
|
||||
import fp from 'fastify-plugin'
|
||||
|
||||
declare module 'fastify' {
|
||||
interface FastifyInstance {
|
||||
mediasoupRouter: mediasoup.types.Router
|
||||
}
|
||||
}
|
||||
|
||||
export default fp<mediasoup.types.RouterOptions>(
|
||||
async (fastify, opts) => {
|
||||
const router = await fastify.mediasoupWorker.createRouter(opts)
|
||||
|
||||
fastify.decorate('mediasoupRouter', router)
|
||||
},
|
||||
{ name: 'mediasoup-router', dependencies: ['mediasoup-worker'] },
|
||||
)
|
||||
|
||||
export const autoConfig: mediasoup.types.RouterOptions = {
|
||||
mediaCodecs: [
|
||||
{
|
||||
kind: 'audio',
|
||||
mimeType: 'audio/opus',
|
||||
clockRate: 48000,
|
||||
channels: 2,
|
||||
parameters: { useinbandfec: 1, stereo: 1 },
|
||||
},
|
||||
],
|
||||
}
|
||||
23
server/plugins/mediasoup-worker.ts
Normal file
23
server/plugins/mediasoup-worker.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { consola } from 'consola'
|
||||
import fp from 'fastify-plugin'
|
||||
import * as mediasoup from 'mediasoup'
|
||||
|
||||
declare module 'fastify' {
|
||||
interface FastifyInstance {
|
||||
mediasoupWorker: mediasoup.types.Worker
|
||||
}
|
||||
}
|
||||
|
||||
export default fp(
|
||||
async (fastify) => {
|
||||
const worker = await mediasoup.createWorker()
|
||||
worker.on('died', () => {
|
||||
consola.error('[Mediasoup]', 'Worker died, exiting...')
|
||||
|
||||
process.exit(1)
|
||||
})
|
||||
|
||||
fastify.decorate('mediasoupWorker', worker)
|
||||
},
|
||||
{ name: 'mediasoup-worker' },
|
||||
)
|
||||
39
server/plugins/socket.ts
Normal file
39
server/plugins/socket.ts
Normal file
@@ -0,0 +1,39 @@
|
||||
import type { FastifyInstance } from 'fastify'
|
||||
import type { ServerOptions } from 'socket.io'
|
||||
import fp from 'fastify-plugin'
|
||||
import { Server } from 'socket.io'
|
||||
import registerWebrtcSocket from '../socket/webrtc.ts'
|
||||
|
||||
declare module 'fastify' {
|
||||
interface FastifyInstance {
|
||||
io: Server
|
||||
}
|
||||
}
|
||||
|
||||
export default fp<Partial<ServerOptions>>(
|
||||
async (fastify, opts) => {
|
||||
fastify.decorate('io', new Server(fastify.server, opts))
|
||||
|
||||
fastify.addHook('preClose', () => {
|
||||
fastify.io.disconnectSockets(true)
|
||||
})
|
||||
|
||||
fastify.addHook('onClose', async (fastify: FastifyInstance) => {
|
||||
await fastify.io.close()
|
||||
})
|
||||
|
||||
fastify.ready(() => {
|
||||
registerWebrtcSocket(fastify.io, fastify.mediasoupRouter)
|
||||
})
|
||||
},
|
||||
{ name: 'socket-io', dependencies: ['mediasoup-worker', 'mediasoup-router'] },
|
||||
)
|
||||
|
||||
export const autoConfig: Partial<ServerOptions> = {
|
||||
path: '/chad/ws',
|
||||
cors: {
|
||||
origin: process.env.CORS_ORIGIN || '*',
|
||||
methods: ['GET', 'POST'],
|
||||
credentials: true,
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user