|
|
@@ -0,0 +1,90 @@
|
|
|
+import { createRoute, OpenAPIHono } from '@hono/zod-openapi'
|
|
|
+import { ErrorSchema } from '@/server/utils/errorHandler'
|
|
|
+import { authMiddleware } from '@/server/middleware/auth.middleware'
|
|
|
+import { AuthContext } from '@/server/types/context'
|
|
|
+import { AgoraTokenService } from '@/server/modules/agora/agora-token.service'
|
|
|
+import { AgoraTokenRequestSchema, AgoraTokenResponseSchema } from '@/server/types/agora'
|
|
|
+
|
|
|
+const agoraTokenService = new AgoraTokenService()
|
|
|
+
|
|
|
+const routeDef = createRoute({
|
|
|
+ method: 'get',
|
|
|
+ path: '/token',
|
|
|
+ middleware: authMiddleware,
|
|
|
+ request: {
|
|
|
+ query: AgoraTokenRequestSchema
|
|
|
+ },
|
|
|
+ responses: {
|
|
|
+ 200: {
|
|
|
+ description: 'Token生成成功',
|
|
|
+ content: {
|
|
|
+ 'application/json': {
|
|
|
+ schema: AgoraTokenResponseSchema
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ 400: {
|
|
|
+ description: '请求参数错误',
|
|
|
+ content: {
|
|
|
+ 'application/json': {
|
|
|
+ schema: ErrorSchema
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ 401: {
|
|
|
+ description: '未授权',
|
|
|
+ content: {
|
|
|
+ 'application/json': {
|
|
|
+ schema: ErrorSchema
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ 500: {
|
|
|
+ description: '服务器内部错误',
|
|
|
+ content: {
|
|
|
+ 'application/json': {
|
|
|
+ schema: ErrorSchema
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const app = new OpenAPIHono<AuthContext>().openapi(routeDef, async (c) => {
|
|
|
+ try {
|
|
|
+ const { type, channel, userId } = c.req.valid('query')
|
|
|
+
|
|
|
+ // 验证参数
|
|
|
+ agoraTokenService.validateTokenParams(type, channel, userId)
|
|
|
+
|
|
|
+ let token: string
|
|
|
+
|
|
|
+ if (type === 'rtc') {
|
|
|
+ // 生成RTC Token
|
|
|
+ token = agoraTokenService.generateRtcToken(channel!, userId || '0')
|
|
|
+ } else {
|
|
|
+ // 生成RTM Token
|
|
|
+ token = agoraTokenService.generateRtmToken(userId!)
|
|
|
+ }
|
|
|
+
|
|
|
+ const tokenInfo = agoraTokenService.getTokenInfo(token, type)
|
|
|
+
|
|
|
+ return c.json(tokenInfo, 200)
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ if (error instanceof Error && error.message.includes('参数')) {
|
|
|
+ return c.json(
|
|
|
+ {
|
|
|
+ code: 400,
|
|
|
+ message: error.message
|
|
|
+ },
|
|
|
+ 400
|
|
|
+ )
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重新抛出其他错误,由错误处理中间件处理
|
|
|
+ throw error
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+export default app
|