From 0b6723cf45ac16df90ece126bd8a45999b452827 Mon Sep 17 00:00:00 2001 From: mtvpls Date: Wed, 10 Dec 2025 00:46:57 +0800 Subject: [PATCH] fix typecheck --- .claude/settings.local.json | 3 ++- src/components/WatchRoomProvider.tsx | 4 +++- src/lib/aes-decryptor.ts | 8 ++++++-- src/lib/m3u8-downloader.ts | 8 +++++--- tsconfig.json | 7 +++---- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 2555bfd..2e105bb 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -9,7 +9,8 @@ "WebFetch(domain:www.artplayer.org)", "WebFetch(domain:m.douban.com)", "WebFetch(domain:movie.douban.com)", - "Bash(cat:*)" + "Bash(cat:*)", + "Bash(pnpm typecheck)" ], "deny": [], "ask": [] diff --git a/src/components/WatchRoomProvider.tsx b/src/components/WatchRoomProvider.tsx index 4c47709..45c33c0 100644 --- a/src/components/WatchRoomProvider.tsx +++ b/src/components/WatchRoomProvider.tsx @@ -4,9 +4,11 @@ import React, { createContext, useContext, useEffect, useState, useCallback } from 'react'; import { useWatchRoom } from '@/hooks/useWatchRoom'; import type { Room, Member, ChatMessage, WatchRoomConfig } from '@/types/watch-room'; -import type { WatchRoomSocket } from '@/lib/watch-room-socket'; import Toast, { ToastProps } from '@/components/Toast'; +// Import type from watch-room-socket +type WatchRoomSocket = import('@/lib/watch-room-socket').WatchRoomSocket; + interface WatchRoomContextType { socket: WatchRoomSocket | null; isConnected: boolean; diff --git a/src/lib/aes-decryptor.ts b/src/lib/aes-decryptor.ts index 8c618a8..c885fcd 100644 --- a/src/lib/aes-decryptor.ts +++ b/src/lib/aes-decryptor.ts @@ -139,8 +139,8 @@ export class AESDecryptor { const invSubMix2 = invSubMix[2]; const invSubMix3 = invSubMix[3]; - let prev; - let t; + let prev: number = 0; + let t: number; for (ksRow = 0; ksRow < ksRows; ksRow++) { if (ksRow < keySize) { @@ -168,6 +168,10 @@ export class AESDecryptor { t = keySchedule[ksRow - 4]; } + if (t === undefined) { + throw new Error('Invalid key schedule'); + } + if (invKsRow < 4 || ksRow <= 4) { invKeySchedule[invKsRow] = t; } else { diff --git a/src/lib/m3u8-downloader.ts b/src/lib/m3u8-downloader.ts index dd96b14..e5d8f37 100644 --- a/src/lib/m3u8-downloader.ts +++ b/src/lib/m3u8-downloader.ts @@ -545,8 +545,10 @@ export class M3U8Downloader { if (xhr.status >= 200 && xhr.status < 300) { task.aesConf.key = xhr.response; // 初始化 AES 解密器 - task.aesConf.decryption = new AESDecryptor(); - task.aesConf.decryption.expandKey(task.aesConf.key); + if (task.aesConf.key) { + task.aesConf.decryption = new AESDecryptor(); + task.aesConf.decryption.expandKey(task.aesConf.key); + } resolve(); } else { reject(new Error('获取 AES 密钥失败')); @@ -562,7 +564,7 @@ export class M3U8Downloader { * AES 解密 */ private aesDecrypt(task: M3U8DownloadTask, data: ArrayBuffer, index: number): ArrayBuffer { - if (!task.aesConf.decryption) { + if (!task.aesConf.decryption || !task.aesConf.key) { return data; } diff --git a/tsconfig.json b/tsconfig.json index e2d132c..ebd30a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,8 +8,8 @@ "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, - "module": "Node16", - "moduleResolution": "node16", + "module": "esnext", + "moduleResolution": "node", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", @@ -26,6 +26,5 @@ ] }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"], - "moduleResolution": ["node_modules", ".next", "node"] + "exclude": ["node_modules"] }