refactor: eliminate any types across server and TTS worker

- app.ts: type serveFile context parameter as Hono Context
- bets.ts: replace catch(err: any) with err: unknown + narrowing
- fight-loop.ts: type pickMatchup style as union literal, replace
  as any casts with proper result type
- tts-worker.ts: import KokoroTTS type, use ProgressInfo inference

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-08 20:34:11 +00:00
co-authored by Claude Opus 4.6
parent 1ca8a6feb0
commit 010e18fbd3
4 changed files with 12 additions and 10 deletions
+5 -3
View File
@@ -1,7 +1,9 @@
// Web Worker for Kokoro TTS — runs ONNX neural network inference off the main thread.
// This prevents the 1-5 second freezes that occur when generate() runs on the UI thread.
let tts: any = null
import type { KokoroTTS } from 'kokoro-js'
let tts: KokoroTTS | null = null
self.addEventListener('message', async (e: MessageEvent) => {
const msg = e.data
@@ -13,8 +15,8 @@ self.addEventListener('message', async (e: MessageEvent) => {
tts = await KokoroTTS.from_pretrained('onnx-community/Kokoro-82M-ONNX', {
dtype: 'q8',
device: null,
progress_callback: (p: any) => {
if (p.progress !== undefined) {
progress_callback: (p) => {
if ('progress' in p && typeof p.progress === 'number') {
self.postMessage({ type: 'progress', progress: p.progress })
}
},
+2 -2
View File
@@ -1,4 +1,4 @@
import { Hono } from 'hono'
import { Hono, type Context } from 'hono'
import { cors } from 'hono/cors'
import { logger } from 'hono/logger'
import { secureHeaders } from 'hono/secure-headers'
@@ -79,7 +79,7 @@ if (process.env.NODE_ENV === 'production' && existsSync(publicDir)) {
webmanifest: 'application/manifest+json',
}
function serveFile(c: any, reqPath: string, cacheControl: string) {
function serveFile(c: Context, reqPath: string, cacheControl: string) {
const resolved = join(publicDir, reqPath)
// Prevent path traversal
if (!resolved.startsWith(publicDir)) return c.notFound()
+3 -3
View File
@@ -78,8 +78,8 @@ export async function startFightLoop(options: FightLoopOptions = {}): Promise<vo
onRoundComplete({
round: event.data.round as number,
hp: event.data.hp as { a: number; b: number },
challengeType: (event.data.result as any)?.challengeType || '',
winnerId: (event.data.result as any)?.winnerId || null,
challengeType: (event.data.result as { challengeType?: string } | undefined)?.challengeType || '',
winnerId: (event.data.result as { winnerId?: string | null } | undefined)?.winnerId || null,
})
}
})
@@ -151,7 +151,7 @@ export async function startFightLoop(options: FightLoopOptions = {}): Promise<vo
function pickMatchup(
bots: { id: string; eloRating: number; name: string; wins: number; losses: number }[],
style: string,
style: 'elo_close' | 'random' | 'mixed',
fightNum: number,
): [typeof bots[0], typeof bots[0]] {
const sorted = [...bots].sort((a, b) => b.eloRating - a.eloRating)
+2 -2
View File
@@ -103,8 +103,8 @@ betsRouter.post('/place', rateLimit(60_000, 10), async (c) => {
odds: bet.oddsAtPlacement,
potentialPayout: bet.potentialPayout,
})
} catch (err: any) {
return c.json({ error: err.message }, 400)
} catch (err: unknown) {
return c.json({ error: err instanceof Error ? err.message : String(err) }, 400)
}
})