nohup: ignoring input

> video-conferencing-frontend@0.1.0 start
> PORT=3020 HOST=0.0.0.0 react-scripts start

Attempting to bind to HOST environment variable: 0.0.0.0
If this was unintentional, check that you haven't mistakenly set it in your shell.
Learn more here: https://cra.link/advanced-config

(node:1725922) [DEP_WEBPACK_DEV_SERVER_ON_AFTER_SETUP_MIDDLEWARE] DeprecationWarning: 'onAfterSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
(Use `node --trace-deprecation ...` to show where the warning was created)
(node:1725922) [DEP_WEBPACK_DEV_SERVER_ON_BEFORE_SETUP_MIDDLEWARE] DeprecationWarning: 'onBeforeSetupMiddleware' option is deprecated. Please use the 'setupMiddlewares' option.
Starting the development server...

Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 12:7:  'RTMP_USERNAME' is assigned a value but never used  @typescript-eslint/no-unused-vars
  Line 13:7:  'RTMP_PASSWORD' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 12:7:  'RTMP_USERNAME' is assigned a value but never used  @typescript-eslint/no-unused-vars
  Line 13:7:  'RTMP_PASSWORD' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
Watchpack Error (watcher): Error: EACCES: permission denied, watch '/home'
Watchpack Error (initial scan): Error: EACCES: permission denied, scandir '/home'
No issues found.
Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 12:7:  'RTMP_USERNAME' is assigned a value but never used  @typescript-eslint/no-unused-vars
  Line 13:7:  'RTMP_PASSWORD' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 12:7:  'RTMP_USERNAME' is assigned a value but never used  @typescript-eslint/no-unused-vars
  Line 13:7:  'RTMP_PASSWORD' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 238:9:  'startOutputVideo' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 238:9:  'startOutputVideo' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
No issues found.
Compiling...
Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 238:9:  'startOutputVideo' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 238:9:  'startOutputVideo' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 12:7:  'BRIDGE_SERVER_URL' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 12:7:  'BRIDGE_SERVER_URL' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
No issues found.
Compiling...
Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 12:7:  'BRIDGE_SERVER_URL' is assigned a value but never used  @typescript-eslint/no-unused-vars
  Line 41:9:  'wsRef' is assigned a value but never used              @typescript-eslint/no-unused-vars
  Line 42:9:  'canvasRef' is assigned a value but never used          @typescript-eslint/no-unused-vars
  Line 43:9:  'animationFrameRef' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 12:7:  'BRIDGE_SERVER_URL' is assigned a value but never used  @typescript-eslint/no-unused-vars
  Line 41:9:  'wsRef' is assigned a value but never used              @typescript-eslint/no-unused-vars
  Line 42:9:  'canvasRef' is assigned a value but never used          @typescript-eslint/no-unused-vars
  Line 43:9:  'animationFrameRef' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
No issues found.
Compiling...
Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: ',' expected (262:6)
ERROR in ./src/TranslationRoom.tsx
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: /home/tniglobal/public_html/live/server/video-conferencing-frontend/src/TranslationRoom.tsx: Missing semicolon. (262:5)

  260 |       alert('Translation started! The output shows your local preview. RTMP streaming requires a server-side bridge.');
  261 |
> 262 |     } catch (err) {
      |      ^
  263 |       console.error('Error starting translation:', err);
  264 |       alert('Failed to start translation. Please check microphone permissions.');
  265 |     }
    at constructor (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:367:19)
    at TypeScriptParserMixin.raise (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6624:19)
    at TypeScriptParserMixin.semicolon (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6920:10)
    at TypeScriptParserMixin.parseVarStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13307:10)
    at TypeScriptParserMixin.parseVarStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9469:31)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12927:23)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseStatementListItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12823:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:61)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseBlock (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13373:10)
    at TypeScriptParserMixin.parseFunctionBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12174:24)
    at TypeScriptParserMixin.parseArrowExpression (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12149:10)
    at TypeScriptParserMixin.parseParenAndDistinguishExpression (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11759:12)
    at TypeScriptParserMixin.parseExprAtom (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11395:23)
    at TypeScriptParserMixin.parseExprAtom (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:4793:20)
    at TypeScriptParserMixin.parseExprSubscripts (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11145:23)
    at TypeScriptParserMixin.parseUpdate (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11130:21)
    at TypeScriptParserMixin.parseMaybeUnary (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11110:23)
    at TypeScriptParserMixin.parseMaybeUnary (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9890:18)
    at TypeScriptParserMixin.parseMaybeUnaryOrPrivate (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10963:61)
    at TypeScriptParserMixin.parseExprOps (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10968:23)
    at TypeScriptParserMixin.parseMaybeConditional (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10945:23)
    at TypeScriptParserMixin.parseMaybeAssign (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10895:21)
    at TypeScriptParserMixin.parseMaybeAssign (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9839:20)
    at /home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10864:39
    at TypeScriptParserMixin.allowInAnd (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12495:16)
    at TypeScriptParserMixin.parseMaybeAssignAllowIn (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10864:17)
    at TypeScriptParserMixin.parseVar (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13460:91)
    at TypeScriptParserMixin.parseVarStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13306:10)
    at TypeScriptParserMixin.parseVarStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9469:31)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12927:23)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseModuleItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12820:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:36)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseProgram (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12698:10)
    at TypeScriptParserMixin.parseTopLevel (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12688:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14568:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10183:18)
    at parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14602:38)
    at parser (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/parser/index.js:41:34)
    at parser.next (<anonymous>)
    at normalizeFile (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37)
    at normalizeFile.next (<anonymous>)
    at run (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/index.js:22:50)
    at run.next (<anonymous>)
    at transform (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transform.js:22:33)

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 262:6:  Parsing error: ',' expected

webpack compiled with 2 errors
ERROR in src/TranslationRoom.tsx:25:7
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    23 | ];
    24 |
  > 25 | const TranslationRoom: React.FC = () => {
       |       ^^^^^^^^^^^^^^^
    26 |   const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
    27 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');
    28 |   const [translatorName, setTranslatorName] = useState<string>('');

ERROR in src/TranslationRoom.tsx:262:7
TS1005: ',' expected.
    260 |       alert('Translation started! The output shows your local preview. RTMP streaming requires a server-side bridge.');
    261 |
  > 262 |     } catch (err) {
        |       ^^^^^
    263 |       console.error('Error starting translation:', err);
    264 |       alert('Failed to start translation. Please check microphone permissions.');
    265 |     }

ERROR in src/TranslationRoom.tsx:270:68
TS2304: Cannot find name 'selectedLanguage'.
    268 |   const tryLoadHlsStream = () => {
    269 |     // Try to load the HLS stream in case a bridge server is streaming
  > 270 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
        |                                                                    ^^^^^^^^^^^^^^^^
    271 |     
    272 |     if (Hls.isSupported() && !outputHlsRef.current) {
    273 |       const hls = new Hls({

ERROR in src/TranslationRoom.tsx:272:31
TS2304: Cannot find name 'outputHlsRef'.
    270 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    271 |     
  > 272 |     if (Hls.isSupported() && !outputHlsRef.current) {
        |                               ^^^^^^^^^^^^
    273 |       const hls = new Hls({
    274 |         enableWorker: true,
    275 |         lowLatencyMode: true,

ERROR in src/TranslationRoom.tsx:288:29
TS2304: Cannot find name 'outputVideoRef'.
    286 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
    287 |         console.log('HLS stream available, switching to remote stream');
  > 288 |         const outputVideo = outputVideoRef.current;
        |                             ^^^^^^^^^^^^^^
    289 |         if (outputVideo) {
    290 |           outputVideo.srcObject = null; // Stop showing local preview
    291 |           hls.attachMedia(outputVideo);

ERROR in src/TranslationRoom.tsx:292:36
TS7006: Parameter 'e' implicitly has an 'any' type.
    290 |           outputVideo.srcObject = null; // Stop showing local preview
    291 |           hls.attachMedia(outputVideo);
  > 292 |           outputVideo.play().catch(e => console.error('Error playing HLS stream:', e));
        |                                    ^
    293 |         }
    294 |       });
    295 |

ERROR in src/TranslationRoom.tsx:297:7
TS2304: Cannot find name 'outputHlsRef'.
    295 |
    296 |       hls.loadSource(watchUrl);
  > 297 |       outputHlsRef.current = hls;
        |       ^^^^^^^^^^^^
    298 |     }
    299 |   };
    300 |

ERROR in src/TranslationRoom.tsx:303:9
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    301 |   const stopTranslation = () => {
    302 |     // Stop media recorder
  > 303 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |         ^^^^^^^^^^^^^^^^
    304 |       mediaRecorderRef.current.stop();
    305 |     }
    306 |

ERROR in src/TranslationRoom.tsx:303:37
TS2304: Cannot find name 'mediaRecorderRef'.
    301 |   const stopTranslation = () => {
    302 |     // Stop media recorder
  > 303 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                     ^^^^^^^^^^^^^^^^
    304 |       mediaRecorderRef.current.stop();
    305 |     }
    306 |

ERROR in src/TranslationRoom.tsx:304:7
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    302 |     // Stop media recorder
    303 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
  > 304 |       mediaRecorderRef.current.stop();
        |       ^^^^^^^^^^^^^^^^
    305 |     }
    306 |
    307 |     // Stop all tracks

ERROR in src/TranslationRoom.tsx:308:9
TS2304: Cannot find name 'audioStreamRef'.
    306 |
    307 |     // Stop all tracks
  > 308 |     if (audioStreamRef.current) {
        |         ^^^^^^^^^^^^^^
    309 |       audioStreamRef.current.getTracks().forEach(track => track.stop());
    310 |     }
    311 |

ERROR in src/TranslationRoom.tsx:309:7
TS2304: Cannot find name 'audioStreamRef'.
    307 |     // Stop all tracks
    308 |     if (audioStreamRef.current) {
  > 309 |       audioStreamRef.current.getTracks().forEach(track => track.stop());
        |       ^^^^^^^^^^^^^^
    310 |     }
    311 |
    312 |     if (combinedStreamRef.current) {

ERROR in src/TranslationRoom.tsx:309:50
TS7006: Parameter 'track' implicitly has an 'any' type.
    307 |     // Stop all tracks
    308 |     if (audioStreamRef.current) {
  > 309 |       audioStreamRef.current.getTracks().forEach(track => track.stop());
        |                                                  ^^^^^
    310 |     }
    311 |
    312 |     if (combinedStreamRef.current) {

ERROR in src/TranslationRoom.tsx:312:9
TS2304: Cannot find name 'combinedStreamRef'.
    310 |     }
    311 |
  > 312 |     if (combinedStreamRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    313 |       combinedStreamRef.current.getTracks().forEach(track => track.stop());
    314 |     }
    315 |

ERROR in src/TranslationRoom.tsx:313:7
TS2304: Cannot find name 'combinedStreamRef'.
    311 |
    312 |     if (combinedStreamRef.current) {
  > 313 |       combinedStreamRef.current.getTracks().forEach(track => track.stop());
        |       ^^^^^^^^^^^^^^^^^
    314 |     }
    315 |
    316 |     // Clear output video

ERROR in src/TranslationRoom.tsx:313:53
TS7006: Parameter 'track' implicitly has an 'any' type.
    311 |
    312 |     if (combinedStreamRef.current) {
  > 313 |       combinedStreamRef.current.getTracks().forEach(track => track.stop());
        |                                                     ^^^^^
    314 |     }
    315 |
    316 |     // Clear output video

ERROR in src/TranslationRoom.tsx:317:25
TS2304: Cannot find name 'outputVideoRef'.
    315 |
    316 |     // Clear output video
  > 317 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    318 |     if (outputVideo) {
    319 |       outputVideo.srcObject = null;
    320 |       outputVideo.pause();

ERROR in src/TranslationRoom.tsx:324:9
TS2304: Cannot find name 'outputHlsRef'.
    322 |
    323 |     // Stop HLS if it's running
  > 324 |     if (outputHlsRef.current) {
        |         ^^^^^^^^^^^^
    325 |       outputHlsRef.current.destroy();
    326 |       outputHlsRef.current = null;
    327 |     }

ERROR in src/TranslationRoom.tsx:325:7
TS2304: Cannot find name 'outputHlsRef'.
    323 |     // Stop HLS if it's running
    324 |     if (outputHlsRef.current) {
  > 325 |       outputHlsRef.current.destroy();
        |       ^^^^^^^^^^^^
    326 |       outputHlsRef.current = null;
    327 |     }
    328 |

ERROR in src/TranslationRoom.tsx:326:7
TS2304: Cannot find name 'outputHlsRef'.
    324 |     if (outputHlsRef.current) {
    325 |       outputHlsRef.current.destroy();
  > 326 |       outputHlsRef.current = null;
        |       ^^^^^^^^^^^^
    327 |     }
    328 |
    329 |     setIsTranslating(false);

ERROR in src/TranslationRoom.tsx:329:5
TS2304: Cannot find name 'setIsTranslating'.
    327 |     }
    328 |
  > 329 |     setIsTranslating(false);
        |     ^^^^^^^^^^^^^^^^
    330 |   };
    331 |
    332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;

ERROR in src/TranslationRoom.tsx:332:41
TS2304: Cannot find name 'languages'.
    330 |   };
    331 |
  > 332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                         ^^^^^^^^^
    333 |
    334 |   if (!inSession) {
    335 |     return (

ERROR in src/TranslationRoom.tsx:332:54
TS2304: Cannot find name 'languages'.
    330 |   };
    331 |
  > 332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                      ^^^^^^^^^
    333 |
    334 |   if (!inSession) {
    335 |     return (

ERROR in src/TranslationRoom.tsx:332:69
TS7006: Parameter 'l' implicitly has an 'any' type.
    330 |   };
    331 |
  > 332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                     ^
    333 |
    334 |   if (!inSession) {
    335 |     return (

ERROR in src/TranslationRoom.tsx:332:86
TS2304: Cannot find name 'selectedLanguage'.
    330 |   };
    331 |
  > 332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                                      ^^^^^^^^^^^^^^^^
    333 |
    334 |   if (!inSession) {
    335 |     return (

ERROR in src/TranslationRoom.tsx:334:8
TS2304: Cannot find name 'inSession'.
    332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
    333 |
  > 334 |   if (!inSession) {
        |        ^^^^^^^^^
    335 |     return (
    336 |       <div className="translation-container">
    337 |         <div className="translation-setup">

ERROR in src/TranslationRoom.tsx:469:1
TS1128: Declaration or statement expected.
    467 |     </div>
    468 |   );
  > 469 | };
        | ^
    470 |
    471 | export default TranslationRoom;
    472 |

Compiling...
Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: ',' expected (262:6)
ERROR in ./src/TranslationRoom.tsx
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: /home/tniglobal/public_html/live/server/video-conferencing-frontend/src/TranslationRoom.tsx: Missing semicolon. (262:5)

  260 |       alert('Translation started! The output shows your local preview. RTMP streaming requires a server-side bridge.');
  261 |
> 262 |     } catch (err) {
      |      ^
  263 |       console.error('Error starting translation:', err);
  264 |       alert('Failed to start translation. Please check microphone permissions.');
  265 |     }
    at constructor (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:367:19)
    at TypeScriptParserMixin.raise (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6624:19)
    at TypeScriptParserMixin.semicolon (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6920:10)
    at TypeScriptParserMixin.parseVarStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13307:10)
    at TypeScriptParserMixin.parseVarStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9469:31)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12927:23)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseStatementListItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12823:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:61)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseBlock (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13373:10)
    at TypeScriptParserMixin.parseFunctionBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12174:24)
    at TypeScriptParserMixin.parseArrowExpression (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12149:10)
    at TypeScriptParserMixin.parseParenAndDistinguishExpression (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11759:12)
    at TypeScriptParserMixin.parseExprAtom (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11395:23)
    at TypeScriptParserMixin.parseExprAtom (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:4793:20)
    at TypeScriptParserMixin.parseExprSubscripts (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11145:23)
    at TypeScriptParserMixin.parseUpdate (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11130:21)
    at TypeScriptParserMixin.parseMaybeUnary (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:11110:23)
    at TypeScriptParserMixin.parseMaybeUnary (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9890:18)
    at TypeScriptParserMixin.parseMaybeUnaryOrPrivate (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10963:61)
    at TypeScriptParserMixin.parseExprOps (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10968:23)
    at TypeScriptParserMixin.parseMaybeConditional (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10945:23)
    at TypeScriptParserMixin.parseMaybeAssign (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10895:21)
    at TypeScriptParserMixin.parseMaybeAssign (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9839:20)
    at /home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10864:39
    at TypeScriptParserMixin.allowInAnd (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12495:16)
    at TypeScriptParserMixin.parseMaybeAssignAllowIn (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10864:17)
    at TypeScriptParserMixin.parseVar (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13460:91)
    at TypeScriptParserMixin.parseVarStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13306:10)
    at TypeScriptParserMixin.parseVarStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9469:31)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12927:23)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseModuleItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12820:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:36)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseProgram (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12698:10)
    at TypeScriptParserMixin.parseTopLevel (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12688:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14568:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10183:18)
    at parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14602:38)
    at parser (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/parser/index.js:41:34)
    at parser.next (<anonymous>)
    at normalizeFile (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37)
    at normalizeFile.next (<anonymous>)
    at run (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/index.js:22:50)
    at run.next (<anonymous>)
    at transform (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transform.js:22:33)

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 262:6:  Parsing error: ',' expected

webpack compiled with 2 errors
ERROR in src/TranslationRoom.tsx:25:7
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    23 | ];
    24 |
  > 25 | const TranslationRoom: React.FC = () => {
       |       ^^^^^^^^^^^^^^^
    26 |   const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
    27 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');
    28 |   const [translatorName, setTranslatorName] = useState<string>('');

ERROR in src/TranslationRoom.tsx:262:7
TS1005: ',' expected.
    260 |       alert('Translation started! The output shows your local preview. RTMP streaming requires a server-side bridge.');
    261 |
  > 262 |     } catch (err) {
        |       ^^^^^
    263 |       console.error('Error starting translation:', err);
    264 |       alert('Failed to start translation. Please check microphone permissions.');
    265 |     }

ERROR in src/TranslationRoom.tsx:270:68
TS2304: Cannot find name 'selectedLanguage'.
    268 |   const tryLoadHlsStream = () => {
    269 |     // Try to load the HLS stream in case a bridge server is streaming
  > 270 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
        |                                                                    ^^^^^^^^^^^^^^^^
    271 |     
    272 |     if (Hls.isSupported() && !outputHlsRef.current) {
    273 |       const hls = new Hls({

ERROR in src/TranslationRoom.tsx:272:31
TS2304: Cannot find name 'outputHlsRef'.
    270 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    271 |     
  > 272 |     if (Hls.isSupported() && !outputHlsRef.current) {
        |                               ^^^^^^^^^^^^
    273 |       const hls = new Hls({
    274 |         enableWorker: true,
    275 |         lowLatencyMode: true,

ERROR in src/TranslationRoom.tsx:288:29
TS2304: Cannot find name 'outputVideoRef'.
    286 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
    287 |         console.log('HLS stream available, switching to remote stream');
  > 288 |         const outputVideo = outputVideoRef.current;
        |                             ^^^^^^^^^^^^^^
    289 |         if (outputVideo) {
    290 |           outputVideo.srcObject = null; // Stop showing local preview
    291 |           hls.attachMedia(outputVideo);

ERROR in src/TranslationRoom.tsx:292:36
TS7006: Parameter 'e' implicitly has an 'any' type.
    290 |           outputVideo.srcObject = null; // Stop showing local preview
    291 |           hls.attachMedia(outputVideo);
  > 292 |           outputVideo.play().catch(e => console.error('Error playing HLS stream:', e));
        |                                    ^
    293 |         }
    294 |       });
    295 |

ERROR in src/TranslationRoom.tsx:297:7
TS2304: Cannot find name 'outputHlsRef'.
    295 |
    296 |       hls.loadSource(watchUrl);
  > 297 |       outputHlsRef.current = hls;
        |       ^^^^^^^^^^^^
    298 |     }
    299 |   };
    300 |

ERROR in src/TranslationRoom.tsx:303:9
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    301 |   const stopTranslation = () => {
    302 |     // Stop media recorder
  > 303 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |         ^^^^^^^^^^^^^^^^
    304 |       mediaRecorderRef.current.stop();
    305 |     }
    306 |

ERROR in src/TranslationRoom.tsx:303:37
TS2304: Cannot find name 'mediaRecorderRef'.
    301 |   const stopTranslation = () => {
    302 |     // Stop media recorder
  > 303 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                     ^^^^^^^^^^^^^^^^
    304 |       mediaRecorderRef.current.stop();
    305 |     }
    306 |

ERROR in src/TranslationRoom.tsx:304:7
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    302 |     // Stop media recorder
    303 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
  > 304 |       mediaRecorderRef.current.stop();
        |       ^^^^^^^^^^^^^^^^
    305 |     }
    306 |
    307 |     // Stop all tracks

ERROR in src/TranslationRoom.tsx:308:9
TS2304: Cannot find name 'audioStreamRef'.
    306 |
    307 |     // Stop all tracks
  > 308 |     if (audioStreamRef.current) {
        |         ^^^^^^^^^^^^^^
    309 |       audioStreamRef.current.getTracks().forEach(track => track.stop());
    310 |     }
    311 |

ERROR in src/TranslationRoom.tsx:309:7
TS2304: Cannot find name 'audioStreamRef'.
    307 |     // Stop all tracks
    308 |     if (audioStreamRef.current) {
  > 309 |       audioStreamRef.current.getTracks().forEach(track => track.stop());
        |       ^^^^^^^^^^^^^^
    310 |     }
    311 |
    312 |     if (combinedStreamRef.current) {

ERROR in src/TranslationRoom.tsx:309:50
TS7006: Parameter 'track' implicitly has an 'any' type.
    307 |     // Stop all tracks
    308 |     if (audioStreamRef.current) {
  > 309 |       audioStreamRef.current.getTracks().forEach(track => track.stop());
        |                                                  ^^^^^
    310 |     }
    311 |
    312 |     if (combinedStreamRef.current) {

ERROR in src/TranslationRoom.tsx:312:9
TS2304: Cannot find name 'combinedStreamRef'.
    310 |     }
    311 |
  > 312 |     if (combinedStreamRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    313 |       combinedStreamRef.current.getTracks().forEach(track => track.stop());
    314 |     }
    315 |

ERROR in src/TranslationRoom.tsx:313:7
TS2304: Cannot find name 'combinedStreamRef'.
    311 |
    312 |     if (combinedStreamRef.current) {
  > 313 |       combinedStreamRef.current.getTracks().forEach(track => track.stop());
        |       ^^^^^^^^^^^^^^^^^
    314 |     }
    315 |
    316 |     // Clear output video

ERROR in src/TranslationRoom.tsx:313:53
TS7006: Parameter 'track' implicitly has an 'any' type.
    311 |
    312 |     if (combinedStreamRef.current) {
  > 313 |       combinedStreamRef.current.getTracks().forEach(track => track.stop());
        |                                                     ^^^^^
    314 |     }
    315 |
    316 |     // Clear output video

ERROR in src/TranslationRoom.tsx:317:25
TS2304: Cannot find name 'outputVideoRef'.
    315 |
    316 |     // Clear output video
  > 317 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    318 |     if (outputVideo) {
    319 |       outputVideo.srcObject = null;
    320 |       outputVideo.pause();

ERROR in src/TranslationRoom.tsx:324:9
TS2304: Cannot find name 'outputHlsRef'.
    322 |
    323 |     // Stop HLS if it's running
  > 324 |     if (outputHlsRef.current) {
        |         ^^^^^^^^^^^^
    325 |       outputHlsRef.current.destroy();
    326 |       outputHlsRef.current = null;
    327 |     }

ERROR in src/TranslationRoom.tsx:325:7
TS2304: Cannot find name 'outputHlsRef'.
    323 |     // Stop HLS if it's running
    324 |     if (outputHlsRef.current) {
  > 325 |       outputHlsRef.current.destroy();
        |       ^^^^^^^^^^^^
    326 |       outputHlsRef.current = null;
    327 |     }
    328 |

ERROR in src/TranslationRoom.tsx:326:7
TS2304: Cannot find name 'outputHlsRef'.
    324 |     if (outputHlsRef.current) {
    325 |       outputHlsRef.current.destroy();
  > 326 |       outputHlsRef.current = null;
        |       ^^^^^^^^^^^^
    327 |     }
    328 |
    329 |     setIsTranslating(false);

ERROR in src/TranslationRoom.tsx:329:5
TS2304: Cannot find name 'setIsTranslating'.
    327 |     }
    328 |
  > 329 |     setIsTranslating(false);
        |     ^^^^^^^^^^^^^^^^
    330 |   };
    331 |
    332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;

ERROR in src/TranslationRoom.tsx:332:41
TS2304: Cannot find name 'languages'.
    330 |   };
    331 |
  > 332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                         ^^^^^^^^^
    333 |
    334 |   if (!inSession) {
    335 |     return (

ERROR in src/TranslationRoom.tsx:332:54
TS2304: Cannot find name 'languages'.
    330 |   };
    331 |
  > 332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                      ^^^^^^^^^
    333 |
    334 |   if (!inSession) {
    335 |     return (

ERROR in src/TranslationRoom.tsx:332:69
TS7006: Parameter 'l' implicitly has an 'any' type.
    330 |   };
    331 |
  > 332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                     ^
    333 |
    334 |   if (!inSession) {
    335 |     return (

ERROR in src/TranslationRoom.tsx:332:86
TS2304: Cannot find name 'selectedLanguage'.
    330 |   };
    331 |
  > 332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                                      ^^^^^^^^^^^^^^^^
    333 |
    334 |   if (!inSession) {
    335 |     return (

ERROR in src/TranslationRoom.tsx:334:8
TS2304: Cannot find name 'inSession'.
    332 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
    333 |
  > 334 |   if (!inSession) {
        |        ^^^^^^^^^
    335 |     return (
    336 |       <div className="translation-container">
    337 |         <div className="translation-setup">

ERROR in src/TranslationRoom.tsx:469:1
TS1128: Declaration or statement expected.
    467 |     </div>
    468 |   );
  > 469 | };
        | ^
    470 |
    471 | export default TranslationRoom;
    472 |

Compiling...
Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 296:9:  'tryLoadHlsStream' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 296:9:  'tryLoadHlsStream' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
No issues found.
Compiling...
Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: Declaration or statement expected (482:undefined)
ERROR in ./src/TranslationRoom.tsx
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: /home/tniglobal/public_html/live/server/video-conferencing-frontend/src/TranslationRoom.tsx: 'return' outside of function. (348:4)

  346 |
  347 |   if (!inSession) {
> 348 |     return (
      |     ^
  349 |       <div className="translation-container">
  350 |         <div className="translation-setup">
  351 |           <h1>🌐 Translation Room</h1>
    at constructor (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:367:19)
    at TypeScriptParserMixin.raise (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6624:19)
    at TypeScriptParserMixin.parseReturnStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13212:12)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12874:21)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseStatementListItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12823:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:61)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseBlock (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13373:10)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12934:21)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseStatementOrSloppyAnnexBFunctionDeclaration (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12833:17)
    at TypeScriptParserMixin.parseIfStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13206:28)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12872:21)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseModuleItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12820:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:36)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseProgram (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12698:10)
    at TypeScriptParserMixin.parseTopLevel (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12688:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14568:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10183:18)
    at parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14602:38)
    at parser (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/parser/index.js:41:34)
    at parser.next (<anonymous>)
    at normalizeFile (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37)
    at normalizeFile.next (<anonymous>)
    at run (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/index.js:22:50)
    at run.next (<anonymous>)
    at transform (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transform.js:22:33)
    at transform.next (<anonymous>)
    at step (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:261:32)
    at /home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:273:13
    at async.call.result.err.err (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:223:11)

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 482:  Parsing error: Declaration or statement expected

webpack compiled with 2 errors
ERROR in src/TranslationRoom.tsx:25:7
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    23 | ];
    24 |
  > 25 | const TranslationRoom: React.FC = () => {
       |       ^^^^^^^^^^^^^^^
    26 |   const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
    27 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');
    28 |   const [translatorName, setTranslatorName] = useState<string>('');

ERROR in src/TranslationRoom.tsx:300:9
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    298 |   const stopTranslation = () => {
    299 |     // Stop media recorder
  > 300 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |         ^^^^^^^^^^^^^^^^
    301 |       mediaRecorderRef.current.stop();
    302 |       mediaRecorderRef.current = null;
    303 |     }

ERROR in src/TranslationRoom.tsx:300:37
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    298 |   const stopTranslation = () => {
    299 |     // Stop media recorder
  > 300 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                     ^^^^^^^^^^^^^^^^
    301 |       mediaRecorderRef.current.stop();
    302 |       mediaRecorderRef.current = null;
    303 |     }

ERROR in src/TranslationRoom.tsx:301:7
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    299 |     // Stop media recorder
    300 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
  > 301 |       mediaRecorderRef.current.stop();
        |       ^^^^^^^^^^^^^^^^
    302 |       mediaRecorderRef.current = null;
    303 |     }
    304 |

ERROR in src/TranslationRoom.tsx:302:7
TS2304: Cannot find name 'mediaRecorderRef'.
    300 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
    301 |       mediaRecorderRef.current.stop();
  > 302 |       mediaRecorderRef.current = null;
        |       ^^^^^^^^^^^^^^^^
    303 |     }
    304 |
    305 |     // Stop animation frame

ERROR in src/TranslationRoom.tsx:306:9
TS2304: Cannot find name 'animationFrameRef'.
    304 |
    305 |     // Stop animation frame
  > 306 |     if (animationFrameRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    307 |       cancelAnimationFrame(animationFrameRef.current);
    308 |       animationFrameRef.current = null;
    309 |     }

ERROR in src/TranslationRoom.tsx:307:28
TS2304: Cannot find name 'animationFrameRef'.
    305 |     // Stop animation frame
    306 |     if (animationFrameRef.current) {
  > 307 |       cancelAnimationFrame(animationFrameRef.current);
        |                            ^^^^^^^^^^^^^^^^^
    308 |       animationFrameRef.current = null;
    309 |     }
    310 |

ERROR in src/TranslationRoom.tsx:308:7
TS2304: Cannot find name 'animationFrameRef'.
    306 |     if (animationFrameRef.current) {
    307 |       cancelAnimationFrame(animationFrameRef.current);
  > 308 |       animationFrameRef.current = null;
        |       ^^^^^^^^^^^^^^^^^
    309 |     }
    310 |
    311 |     // Stop all tracks

ERROR in src/TranslationRoom.tsx:312:9
TS2304: Cannot find name 'audioStreamRef'.
    310 |
    311 |     // Stop all tracks
  > 312 |     if (audioStreamRef.current) {
        |         ^^^^^^^^^^^^^^
    313 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    314 |       audioStreamRef.current = null;
    315 |     }

ERROR in src/TranslationRoom.tsx:313:7
TS2304: Cannot find name 'audioStreamRef'.
    311 |     // Stop all tracks
    312 |     if (audioStreamRef.current) {
  > 313 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |       ^^^^^^^^^^^^^^
    314 |       audioStreamRef.current = null;
    315 |     }
    316 |

ERROR in src/TranslationRoom.tsx:314:7
TS2304: Cannot find name 'audioStreamRef'.
    312 |     if (audioStreamRef.current) {
    313 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
  > 314 |       audioStreamRef.current = null;
        |       ^^^^^^^^^^^^^^
    315 |     }
    316 |
    317 |     if (combinedStreamRef.current) {

ERROR in src/TranslationRoom.tsx:317:9
TS2304: Cannot find name 'combinedStreamRef'.
    315 |     }
    316 |
  > 317 |     if (combinedStreamRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    318 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    319 |       combinedStreamRef.current = null;
    320 |     }

ERROR in src/TranslationRoom.tsx:318:7
TS2304: Cannot find name 'combinedStreamRef'.
    316 |
    317 |     if (combinedStreamRef.current) {
  > 318 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |       ^^^^^^^^^^^^^^^^^
    319 |       combinedStreamRef.current = null;
    320 |     }
    321 |

ERROR in src/TranslationRoom.tsx:319:7
TS2304: Cannot find name 'combinedStreamRef'.
    317 |     if (combinedStreamRef.current) {
    318 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
  > 319 |       combinedStreamRef.current = null;
        |       ^^^^^^^^^^^^^^^^^
    320 |     }
    321 |
    322 |     // Close WebSocket connection

ERROR in src/TranslationRoom.tsx:323:9
TS2304: Cannot find name 'wsRef'.
    321 |
    322 |     // Close WebSocket connection
  > 323 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |         ^^^^^
    324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    325 |       wsRef.current.close();
    326 |       wsRef.current = null;

ERROR in src/TranslationRoom.tsx:323:26
TS2304: Cannot find name 'wsRef'.
    321 |
    322 |     // Close WebSocket connection
  > 323 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |                          ^^^^^
    324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    325 |       wsRef.current.close();
    326 |       wsRef.current = null;

ERROR in src/TranslationRoom.tsx:324:7
TS2304: Cannot find name 'wsRef'.
    322 |     // Close WebSocket connection
    323 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
  > 324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
        |       ^^^^^
    325 |       wsRef.current.close();
    326 |       wsRef.current = null;
    327 |     }

ERROR in src/TranslationRoom.tsx:325:7
TS2304: Cannot find name 'wsRef'.
    323 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
    324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
  > 325 |       wsRef.current.close();
        |       ^^^^^
    326 |       wsRef.current = null;
    327 |     }
    328 |

ERROR in src/TranslationRoom.tsx:326:7
TS2304: Cannot find name 'wsRef'.
    324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    325 |       wsRef.current.close();
  > 326 |       wsRef.current = null;
        |       ^^^^^
    327 |     }
    328 |
    329 |     // Clear output video

ERROR in src/TranslationRoom.tsx:330:25
TS2304: Cannot find name 'outputVideoRef'.
    328 |
    329 |     // Clear output video
  > 330 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    331 |     if (outputVideo) {
    332 |       outputVideo.pause();
    333 |       outputVideo.src = '';

ERROR in src/TranslationRoom.tsx:337:9
TS2304: Cannot find name 'outputHlsRef'.
    335 |
    336 |     // Stop HLS if it's running
  > 337 |     if (outputHlsRef.current) {
        |         ^^^^^^^^^^^^
    338 |       outputHlsRef.current.destroy();
    339 |       outputHlsRef.current = null;
    340 |     }

ERROR in src/TranslationRoom.tsx:338:7
TS2304: Cannot find name 'outputHlsRef'.
    336 |     // Stop HLS if it's running
    337 |     if (outputHlsRef.current) {
  > 338 |       outputHlsRef.current.destroy();
        |       ^^^^^^^^^^^^
    339 |       outputHlsRef.current = null;
    340 |     }
    341 |

ERROR in src/TranslationRoom.tsx:339:7
TS2304: Cannot find name 'outputHlsRef'.
    337 |     if (outputHlsRef.current) {
    338 |       outputHlsRef.current.destroy();
  > 339 |       outputHlsRef.current = null;
        |       ^^^^^^^^^^^^
    340 |     }
    341 |
    342 |     setIsTranslating(false);

ERROR in src/TranslationRoom.tsx:342:5
TS2304: Cannot find name 'setIsTranslating'.
    340 |     }
    341 |
  > 342 |     setIsTranslating(false);
        |     ^^^^^^^^^^^^^^^^
    343 |   };
    344 |
    345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;

ERROR in src/TranslationRoom.tsx:345:41
TS2304: Cannot find name 'languages'.
    343 |   };
    344 |
  > 345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                         ^^^^^^^^^
    346 |
    347 |   if (!inSession) {
    348 |     return (

ERROR in src/TranslationRoom.tsx:345:54
TS2304: Cannot find name 'languages'.
    343 |   };
    344 |
  > 345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                      ^^^^^^^^^
    346 |
    347 |   if (!inSession) {
    348 |     return (

ERROR in src/TranslationRoom.tsx:345:69
TS7006: Parameter 'l' implicitly has an 'any' type.
    343 |   };
    344 |
  > 345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                     ^
    346 |
    347 |   if (!inSession) {
    348 |     return (

ERROR in src/TranslationRoom.tsx:345:86
TS2304: Cannot find name 'selectedLanguage'.
    343 |   };
    344 |
  > 345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                                      ^^^^^^^^^^^^^^^^
    346 |
    347 |   if (!inSession) {
    348 |     return (

ERROR in src/TranslationRoom.tsx:347:8
TS2304: Cannot find name 'inSession'.
    345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
    346 |
  > 347 |   if (!inSession) {
        |        ^^^^^^^^^
    348 |     return (
    349 |       <div className="translation-container">
    350 |         <div className="translation-setup">

ERROR in src/TranslationRoom.tsx:482:1
TS1128: Declaration or statement expected.
    480 |     </div>
    481 |   );
  > 482 | };
        | ^
    483 |
    484 | export default TranslationRoom;
    485 |

Compiling...
Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: Declaration or statement expected (482:undefined)
ERROR in ./src/TranslationRoom.tsx
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: /home/tniglobal/public_html/live/server/video-conferencing-frontend/src/TranslationRoom.tsx: 'return' outside of function. (348:4)

  346 |
  347 |   if (!inSession) {
> 348 |     return (
      |     ^
  349 |       <div className="translation-container">
  350 |         <div className="translation-setup">
  351 |           <h1>🌐 Translation Room</h1>
    at constructor (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:367:19)
    at TypeScriptParserMixin.raise (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6624:19)
    at TypeScriptParserMixin.parseReturnStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13212:12)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12874:21)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseStatementListItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12823:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:61)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseBlock (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13373:10)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12934:21)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseStatementOrSloppyAnnexBFunctionDeclaration (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12833:17)
    at TypeScriptParserMixin.parseIfStatement (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13206:28)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12872:21)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseModuleItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12820:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:36)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseProgram (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12698:10)
    at TypeScriptParserMixin.parseTopLevel (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12688:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14568:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10183:18)
    at parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14602:38)
    at parser (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/parser/index.js:41:34)
    at parser.next (<anonymous>)
    at normalizeFile (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37)
    at normalizeFile.next (<anonymous>)
    at run (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/index.js:22:50)
    at run.next (<anonymous>)
    at transform (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transform.js:22:33)
    at transform.next (<anonymous>)
    at step (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:261:32)
    at /home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:273:13
    at async.call.result.err.err (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:223:11)

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 482:  Parsing error: Declaration or statement expected

webpack compiled with 2 errors
ERROR in src/TranslationRoom.tsx:25:7
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    23 | ];
    24 |
  > 25 | const TranslationRoom: React.FC = () => {
       |       ^^^^^^^^^^^^^^^
    26 |   const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
    27 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');
    28 |   const [translatorName, setTranslatorName] = useState<string>('');

ERROR in src/TranslationRoom.tsx:300:9
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    298 |   const stopTranslation = () => {
    299 |     // Stop media recorder
  > 300 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |         ^^^^^^^^^^^^^^^^
    301 |       mediaRecorderRef.current.stop();
    302 |       mediaRecorderRef.current = null;
    303 |     }

ERROR in src/TranslationRoom.tsx:300:37
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    298 |   const stopTranslation = () => {
    299 |     // Stop media recorder
  > 300 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                     ^^^^^^^^^^^^^^^^
    301 |       mediaRecorderRef.current.stop();
    302 |       mediaRecorderRef.current = null;
    303 |     }

ERROR in src/TranslationRoom.tsx:301:7
TS2552: Cannot find name 'mediaRecorderRef'. Did you mean 'MediaRecorder'?
    299 |     // Stop media recorder
    300 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
  > 301 |       mediaRecorderRef.current.stop();
        |       ^^^^^^^^^^^^^^^^
    302 |       mediaRecorderRef.current = null;
    303 |     }
    304 |

ERROR in src/TranslationRoom.tsx:302:7
TS2304: Cannot find name 'mediaRecorderRef'.
    300 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
    301 |       mediaRecorderRef.current.stop();
  > 302 |       mediaRecorderRef.current = null;
        |       ^^^^^^^^^^^^^^^^
    303 |     }
    304 |
    305 |     // Stop animation frame

ERROR in src/TranslationRoom.tsx:306:9
TS2304: Cannot find name 'animationFrameRef'.
    304 |
    305 |     // Stop animation frame
  > 306 |     if (animationFrameRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    307 |       cancelAnimationFrame(animationFrameRef.current);
    308 |       animationFrameRef.current = null;
    309 |     }

ERROR in src/TranslationRoom.tsx:307:28
TS2304: Cannot find name 'animationFrameRef'.
    305 |     // Stop animation frame
    306 |     if (animationFrameRef.current) {
  > 307 |       cancelAnimationFrame(animationFrameRef.current);
        |                            ^^^^^^^^^^^^^^^^^
    308 |       animationFrameRef.current = null;
    309 |     }
    310 |

ERROR in src/TranslationRoom.tsx:308:7
TS2304: Cannot find name 'animationFrameRef'.
    306 |     if (animationFrameRef.current) {
    307 |       cancelAnimationFrame(animationFrameRef.current);
  > 308 |       animationFrameRef.current = null;
        |       ^^^^^^^^^^^^^^^^^
    309 |     }
    310 |
    311 |     // Stop all tracks

ERROR in src/TranslationRoom.tsx:312:9
TS2304: Cannot find name 'audioStreamRef'.
    310 |
    311 |     // Stop all tracks
  > 312 |     if (audioStreamRef.current) {
        |         ^^^^^^^^^^^^^^
    313 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    314 |       audioStreamRef.current = null;
    315 |     }

ERROR in src/TranslationRoom.tsx:313:7
TS2304: Cannot find name 'audioStreamRef'.
    311 |     // Stop all tracks
    312 |     if (audioStreamRef.current) {
  > 313 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |       ^^^^^^^^^^^^^^
    314 |       audioStreamRef.current = null;
    315 |     }
    316 |

ERROR in src/TranslationRoom.tsx:314:7
TS2304: Cannot find name 'audioStreamRef'.
    312 |     if (audioStreamRef.current) {
    313 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
  > 314 |       audioStreamRef.current = null;
        |       ^^^^^^^^^^^^^^
    315 |     }
    316 |
    317 |     if (combinedStreamRef.current) {

ERROR in src/TranslationRoom.tsx:317:9
TS2304: Cannot find name 'combinedStreamRef'.
    315 |     }
    316 |
  > 317 |     if (combinedStreamRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    318 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    319 |       combinedStreamRef.current = null;
    320 |     }

ERROR in src/TranslationRoom.tsx:318:7
TS2304: Cannot find name 'combinedStreamRef'.
    316 |
    317 |     if (combinedStreamRef.current) {
  > 318 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |       ^^^^^^^^^^^^^^^^^
    319 |       combinedStreamRef.current = null;
    320 |     }
    321 |

ERROR in src/TranslationRoom.tsx:319:7
TS2304: Cannot find name 'combinedStreamRef'.
    317 |     if (combinedStreamRef.current) {
    318 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
  > 319 |       combinedStreamRef.current = null;
        |       ^^^^^^^^^^^^^^^^^
    320 |     }
    321 |
    322 |     // Close WebSocket connection

ERROR in src/TranslationRoom.tsx:323:9
TS2304: Cannot find name 'wsRef'.
    321 |
    322 |     // Close WebSocket connection
  > 323 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |         ^^^^^
    324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    325 |       wsRef.current.close();
    326 |       wsRef.current = null;

ERROR in src/TranslationRoom.tsx:323:26
TS2304: Cannot find name 'wsRef'.
    321 |
    322 |     // Close WebSocket connection
  > 323 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |                          ^^^^^
    324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    325 |       wsRef.current.close();
    326 |       wsRef.current = null;

ERROR in src/TranslationRoom.tsx:324:7
TS2304: Cannot find name 'wsRef'.
    322 |     // Close WebSocket connection
    323 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
  > 324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
        |       ^^^^^
    325 |       wsRef.current.close();
    326 |       wsRef.current = null;
    327 |     }

ERROR in src/TranslationRoom.tsx:325:7
TS2304: Cannot find name 'wsRef'.
    323 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
    324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
  > 325 |       wsRef.current.close();
        |       ^^^^^
    326 |       wsRef.current = null;
    327 |     }
    328 |

ERROR in src/TranslationRoom.tsx:326:7
TS2304: Cannot find name 'wsRef'.
    324 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    325 |       wsRef.current.close();
  > 326 |       wsRef.current = null;
        |       ^^^^^
    327 |     }
    328 |
    329 |     // Clear output video

ERROR in src/TranslationRoom.tsx:330:25
TS2304: Cannot find name 'outputVideoRef'.
    328 |
    329 |     // Clear output video
  > 330 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    331 |     if (outputVideo) {
    332 |       outputVideo.pause();
    333 |       outputVideo.src = '';

ERROR in src/TranslationRoom.tsx:337:9
TS2304: Cannot find name 'outputHlsRef'.
    335 |
    336 |     // Stop HLS if it's running
  > 337 |     if (outputHlsRef.current) {
        |         ^^^^^^^^^^^^
    338 |       outputHlsRef.current.destroy();
    339 |       outputHlsRef.current = null;
    340 |     }

ERROR in src/TranslationRoom.tsx:338:7
TS2304: Cannot find name 'outputHlsRef'.
    336 |     // Stop HLS if it's running
    337 |     if (outputHlsRef.current) {
  > 338 |       outputHlsRef.current.destroy();
        |       ^^^^^^^^^^^^
    339 |       outputHlsRef.current = null;
    340 |     }
    341 |

ERROR in src/TranslationRoom.tsx:339:7
TS2304: Cannot find name 'outputHlsRef'.
    337 |     if (outputHlsRef.current) {
    338 |       outputHlsRef.current.destroy();
  > 339 |       outputHlsRef.current = null;
        |       ^^^^^^^^^^^^
    340 |     }
    341 |
    342 |     setIsTranslating(false);

ERROR in src/TranslationRoom.tsx:342:5
TS2304: Cannot find name 'setIsTranslating'.
    340 |     }
    341 |
  > 342 |     setIsTranslating(false);
        |     ^^^^^^^^^^^^^^^^
    343 |   };
    344 |
    345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;

ERROR in src/TranslationRoom.tsx:345:41
TS2304: Cannot find name 'languages'.
    343 |   };
    344 |
  > 345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                         ^^^^^^^^^
    346 |
    347 |   if (!inSession) {
    348 |     return (

ERROR in src/TranslationRoom.tsx:345:54
TS2304: Cannot find name 'languages'.
    343 |   };
    344 |
  > 345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                      ^^^^^^^^^
    346 |
    347 |   if (!inSession) {
    348 |     return (

ERROR in src/TranslationRoom.tsx:345:69
TS7006: Parameter 'l' implicitly has an 'any' type.
    343 |   };
    344 |
  > 345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                     ^
    346 |
    347 |   if (!inSession) {
    348 |     return (

ERROR in src/TranslationRoom.tsx:345:86
TS2304: Cannot find name 'selectedLanguage'.
    343 |   };
    344 |
  > 345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                                      ^^^^^^^^^^^^^^^^
    346 |
    347 |   if (!inSession) {
    348 |     return (

ERROR in src/TranslationRoom.tsx:347:8
TS2304: Cannot find name 'inSession'.
    345 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
    346 |
  > 347 |   if (!inSession) {
        |        ^^^^^^^^^
    348 |     return (
    349 |       <div className="translation-container">
    350 |         <div className="translation-setup">

ERROR in src/TranslationRoom.tsx:482:1
TS1128: Declaration or statement expected.
    480 |     </div>
    481 |   );
  > 482 | };
        | ^
    483 |
    484 | export default TranslationRoom;
    485 |

Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: Declaration or statement expected (482:undefined)
ERROR in ./src/App.tsx 9:0-48
Module not found: Error: Can't resolve './TranslationRoom' in '/home/tniglobal/public_html/live/server/video-conferencing-frontend/src'

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 482:  Parsing error: Declaration or statement expected

webpack compiled with 2 errors
ERROR in src/App.tsx:5:29
TS2307: Cannot find module './TranslationRoom' or its corresponding type declarations.
    3 | import Sidebar from './Sidebar';
    4 | import VideoRooms from './VideoRooms';
  > 5 | import TranslationRoom from './TranslationRoom';
      |                             ^^^^^^^^^^^^^^^^^^^
    6 | import './App.css';
    7 |
    8 | function App() {

Compiling...
Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: Property or signature expected (9:20)
ERROR in ./src/TranslationRoom.tsx
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: /home/tniglobal/public_html/live/server/video-conferencing-frontend/src/TranslationRoom.tsx: Identifier 'React' has already been declared. (1:66)

> 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    |                                                                   ^
  2 |
  3 | import Hls from 'hls.js';import Hls from 'hls.js';
  4 |
    at constructor (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:367:19)
    at TypeScriptParserMixin.raise (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6624:19)
    at TypeScriptScopeHandler.checkRedeclarationInScope (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:1646:19)
    at TypeScriptScopeHandler.declareName (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:1612:12)
    at TypeScriptScopeHandler.declareName (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:4909:11)
    at TypeScriptParserMixin.declareNameFromIdentifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7594:16)
    at TypeScriptParserMixin.checkIdentifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7590:12)
    at TypeScriptParserMixin.checkLVal (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7527:12)
    at TypeScriptParserMixin.finishImportSpecifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14342:10)
    at TypeScriptParserMixin.parseImportSpecifierLocal (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14339:31)
    at TypeScriptParserMixin.maybeParseDefaultImportSpecifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14446:12)
    at TypeScriptParserMixin.parseImportSpecifiersAndAfter (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14315:29)
    at TypeScriptParserMixin.parseImport (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14311:17)
    at TypeScriptParserMixin.parseImport (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9412:26)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12952:27)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseModuleItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12820:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:36)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseProgram (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12698:10)
    at TypeScriptParserMixin.parseTopLevel (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12688:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14568:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10183:18)
    at parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14602:38)
    at parser (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/parser/index.js:41:34)
    at parser.next (<anonymous>)
    at normalizeFile (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37)
    at normalizeFile.next (<anonymous>)
    at run (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/index.js:22:50)
    at run.next (<anonymous>)
    at transform (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transform.js:22:33)
    at transform.next (<anonymous>)
    at step (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:261:32)
    at /home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:273:13
    at async.call.result.err.err (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:223:11)

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 9:20:  Parsing error: Property or signature expected

webpack compiled with 2 errors
Files successfully emitted, waiting for typecheck results...
Issues checking in progress...
ERROR in src/TranslationRoom.tsx
TS2451: Cannot redeclare block-scoped variable '(Missing)'.

ERROR in src/TranslationRoom.tsx
TS7006: Parameter '(Missing)' implicitly has an 'any' type.

ERROR in src/TranslationRoom.tsx
TS7031: Binding element '(Missing)' implicitly has an 'any' type.

ERROR in src/TranslationRoom.tsx:1:8
TS2300: Duplicate identifier 'React'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |        ^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:17
TS2300: Duplicate identifier 'useState'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                 ^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:27
TS2300: Duplicate identifier 'useEffect'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                           ^^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:38
TS2300: Duplicate identifier 'useRef'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                      ^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:67
TS2300: Duplicate identifier 'React'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                   ^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:76
TS2300: Duplicate identifier 'useState'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                            ^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:86
TS2300: Duplicate identifier 'useEffect'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                                      ^^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:97
TS2300: Duplicate identifier 'useRef'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                                                 ^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:3:8
TS2300: Duplicate identifier 'Hls'.
    1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    2 |
  > 3 | import Hls from 'hls.js';import Hls from 'hls.js';
      |        ^^^
    4 |
    5 | import './TranslationRoom.css';import './TranslationRoom.css';
    6 |

ERROR in src/TranslationRoom.tsx:3:33
TS2300: Duplicate identifier 'Hls'.
    1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    2 |
  > 3 | import Hls from 'hls.js';import Hls from 'hls.js';
      |                                 ^^^
    4 |
    5 | import './TranslationRoom.css';import './TranslationRoom.css';
    6 |

ERROR in src/TranslationRoom.tsx:9:21
TS1131: Property or signature expected.
     7 |
     8 |
  >  9 | interface Language {interface Language {
       |                     ^^^^^^^^^
    10 |
    11 |   label: string;  label: string;
    12 |

ERROR in src/TranslationRoom.tsx:11:3
TS2300: Duplicate identifier 'label'.
     9 | interface Language {interface Language {
    10 |
  > 11 |   label: string;  label: string;
       |   ^^^^^
    12 |
    13 |   value: string;  value: string;
    14 |

ERROR in src/TranslationRoom.tsx:11:19
TS2300: Duplicate identifier 'label'.
     9 | interface Language {interface Language {
    10 |
  > 11 |   label: string;  label: string;
       |                   ^^^^^
    12 |
    13 |   value: string;  value: string;
    14 |

ERROR in src/TranslationRoom.tsx:13:3
TS2300: Duplicate identifier 'value'.
    11 |   label: string;  label: string;
    12 |
  > 13 |   value: string;  value: string;
       |   ^^^^^
    14 |
    15 |   code: string;}
    16 |

ERROR in src/TranslationRoom.tsx:13:19
TS2300: Duplicate identifier 'value'.
    11 |   label: string;  label: string;
    12 |
  > 13 |   value: string;  value: string;
       |                   ^^^^^
    14 |
    15 |   code: string;}
    16 |

ERROR in src/TranslationRoom.tsx:17:1
TS1128: Declaration or statement expected.
    15 |   code: string;}
    16 |
  > 17 | }
       | ^
    18 |
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |

ERROR in src/TranslationRoom.tsx:19:7
TS2451: Cannot redeclare block-scoped variable 'SOURCE_VIDEO_URL'.
    17 | }
    18 |
  > 19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
       |       ^^^^^^^^^^^^^^^^
    20 |
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |

ERROR in src/TranslationRoom.tsx:21:7
TS2451: Cannot redeclare block-scoped variable 'SOURCE_VIDEO_URL'.
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |
  > 21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
       |       ^^^^^^^^^^^^^^^^
    22 |
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |

ERROR in src/TranslationRoom.tsx:21:133
TS2451: Cannot redeclare block-scoped variable 'RTMP_SERVER'.
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |
  > 21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
       |                                                                                                                                     ^^^^^^^^^^^
    22 |
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |

ERROR in src/TranslationRoom.tsx:23:7
TS2451: Cannot redeclare block-scoped variable 'RTMP_SERVER'.
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |
  > 23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
       |       ^^^^^^^^^^^
    24 |
    25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
    26 |

ERROR in src/TranslationRoom.tsx:23:78
TS2451: Cannot redeclare block-scoped variable 'BRIDGE_SERVER_URL'.
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |
  > 23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
       |                                                                              ^^^^^^^^^^^^^^^^^
    24 |
    25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
    26 |

ERROR in src/TranslationRoom.tsx:25:7
TS2451: Cannot redeclare block-scoped variable 'BRIDGE_SERVER_URL'.
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |
  > 25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
       |       ^^^^^^^^^^^^^^^^^
    26 |
    27 | // const RTMP_PASSWORD = '244PLK'; // Will be used when implementing RTMP streaming
    28 |

ERROR in src/TranslationRoom.tsx:29:7
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    27 | // const RTMP_PASSWORD = '244PLK'; // Will be used when implementing RTMP streaming
    28 |
  > 29 | const TranslationRoom: React.FC = () => {
       |       ^^^^^^^^^^^^^^^
    30 |
    31 |   const [languages, setLanguages] = useState<Language[]>([]);// Default fallback languages in case API fails
    32 |

ERROR in src/TranslationRoom.tsx:35:3
TS1137: Expression or comma expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |   ^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:79
TS2695: Left side of comma operator is unused and has no side effects.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                               ^^^^^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:90
TS2304: Cannot find name 'value'.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                          ^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:95
TS1005: ';' expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                               ^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:103
TS1128: Declaration or statement expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                                       ^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:37:73
TS2695: Left side of comma operator is unused and has no side effects.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                         ^^^^^^^^^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:84
TS2304: Cannot find name 'value'.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                    ^^^^^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:89
TS1005: ';' expected.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                         ^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:97
TS1128: Declaration or statement expected.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                                 ^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:39:81
TS2695: Left side of comma operator is unused and has no side effects.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                 ^^^^^^^^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:91
TS2304: Cannot find name 'value'.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                           ^^^^^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:96
TS1005: ';' expected.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                                ^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:104
TS1128: Declaration or statement expected.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                                        ^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:41:68
TS2695: Left side of comma operator is unused and has no side effects.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                    ^^^^^^^^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:78
TS2304: Cannot find name 'value'.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                              ^^^^^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:83
TS1005: ';' expected.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                                   ^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:91
TS1128: Declaration or statement expected.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                                           ^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:43:61
TS2695: Left side of comma operator is unused and has no side effects.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                             ^^^^^^^^^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:43:72
TS2304: Cannot find name 'value'.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                                        ^^^^^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:43:77
TS1005: ';' expected.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                                             ^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:45:64
TS1128: Declaration or statement expected.
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |
  > 45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
       |                                                                ^
    46 |
    47 |
    48 |

ERROR in src/TranslationRoom.tsx:49:63
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    47 |
    48 |
  > 49 |   const sourceVideoRef = useRef<HTMLVideoElement>(null);const TranslationRoom: React.FC = () => {
       |                                                               ^^^^^^^^^^^^^^^
    50 |
    51 |   const outputVideoRef = useRef<HTMLVideoElement>(null);  const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
    52 |

ERROR in src/TranslationRoom.tsx:51:9
TS2451: Cannot redeclare block-scoped variable 'outputVideoRef'.
    49 |   const sourceVideoRef = useRef<HTMLVideoElement>(null);const TranslationRoom: React.FC = () => {
    50 |
  > 51 |   const outputVideoRef = useRef<HTMLVideoElement>(null);  const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
       |         ^^^^^^^^^^^^^^
    52 |
    53 |   const mediaRecorderRef = useRef<MediaRecorder | null>(null);  const [selectedLanguage, setSelectedLanguage] = useState<string>('');
    54 |

ERROR in src/TranslationRoom.tsx:59:9
TS2451: Cannot redeclare block-scoped variable 'hlsInstanceRef'.
    57 |   const combinedStreamRef = useRef<MediaStream | null>(null);  const [inSession, setInSession] = useState<boolean>(false);
    58 |
  > 59 |   const hlsInstanceRef = useRef<Hls | null>(null);  const [isTranslating, setIsTranslating] = useState<boolean>(false);
       |         ^^^^^^^^^^^^^^
    60 |
    61 |   const outputHlsRef = useRef<Hls | null>(null);  const [loading, setLoading] = useState<boolean>(true);
    62 |

ERROR in src/TranslationRoom.tsx:61:9
TS2451: Cannot redeclare block-scoped variable 'outputHlsRef'.
    59 |   const hlsInstanceRef = useRef<Hls | null>(null);  const [isTranslating, setIsTranslating] = useState<boolean>(false);
    60 |
  > 61 |   const outputHlsRef = useRef<Hls | null>(null);  const [loading, setLoading] = useState<boolean>(true);
       |         ^^^^^^^^^^^^
    62 |
    63 |   const wsRef = useRef<WebSocket | null>(null);  const [error, setError] = useState<string>('');
    64 |

ERROR in src/TranslationRoom.tsx:69:9
TS2451: Cannot redeclare block-scoped variable 'outputVideoRef'.
    67 |   const animationFrameRef = useRef<number | null>(null);  const sourceVideoRef = useRef<HTMLVideoElement>(null);
    68 |
  > 69 |   const outputVideoRef = useRef<HTMLVideoElement>(null);
       |         ^^^^^^^^^^^^^^
    70 |
    71 |   // Fetch languages on component mount  const mediaRecorderRef = useRef<MediaRecorder | null>(null);
    72 |

ERROR in src/TranslationRoom.tsx:77:18
TS2451: Cannot redeclare block-scoped variable 'hlsInstanceRef'.
    75 |     fetchLanguages();  const combinedStreamRef = useRef<MediaStream | null>(null);
    76 |
  > 77 |   }, []);  const hlsInstanceRef = useRef<Hls | null>(null);
       |                  ^^^^^^^^^^^^^^
    78 |
    79 |   const outputHlsRef = useRef<Hls | null>(null);
    80 |

ERROR in src/TranslationRoom.tsx:79:9
TS2451: Cannot redeclare block-scoped variable 'outputHlsRef'.
    77 |   }, []);  const hlsInstanceRef = useRef<Hls | null>(null);
    78 |
  > 79 |   const outputHlsRef = useRef<Hls | null>(null);
       |         ^^^^^^^^^^^^
    80 |
    81 |   const fetchLanguages = async () => {  const wsRef = useRef<WebSocket | null>(null);
    82 |

ERROR in src/TranslationRoom.tsx:95:70
TS1128: Declaration or statement expected.
    93 |       if (!response.ok) {    fetchLanguages();
    94 |
  > 95 |         throw new Error(`HTTP error! status: ${response.status}`);  }, []);
       |                                                                      ^
    96 |
    97 |       }
    98 |

ERROR in src/TranslationRoom.tsx:95:74
TS1005: ';' expected.
    93 |       if (!response.ok) {    fetchLanguages();
    94 |
  > 95 |         throw new Error(`HTTP error! status: ${response.status}`);  }, []);
       |                                                                          ^
    96 |
    97 |       }
    98 |

ERROR in src/TranslationRoom.tsx:99:9
TS1472: 'catch' or 'finally' expected.
     97 |       }
     98 |
  >  99 |         const fetchLanguages = async () => {
        |         ^^^^^
    100 |
    101 |       const result = await response.json();    try {
    102 |

ERROR in src/TranslationRoom.tsx:101:28
TS2304: Cannot find name 'response'.
     99 |         const fetchLanguages = async () => {
    100 |
  > 101 |       const result = await response.json();    try {
        |                            ^^^^^^^^
    102 |
    103 |             setLoading(true);
    104 |

ERROR in src/TranslationRoom.tsx:107:11
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |           ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:29
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                             ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:58
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                                                          ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:74
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                                                                          ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:109:22
TS2448: Block-scoped variable 'result' used before its declaration.
    107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
    108 |
  > 109 |         setLanguages(result.data);      
        |                      ^^^^^^
    110 |
    111 |         console.log(`Loaded ${result.data.length} languages from API`);      if (!response.ok) {
    112 |

ERROR in src/TranslationRoom.tsx:111:31
TS2448: Block-scoped variable 'result' used before its declaration.
    109 |         setLanguages(result.data);      
    110 |
  > 111 |         console.log(`Loaded ${result.data.length} languages from API`);      if (!response.ok) {
        |                               ^^^^^^
    112 |
    113 |       } else {        throw new Error(`HTTP error! status: ${response.status}`);
    114 |

ERROR in src/TranslationRoom.tsx:115:66
TS2448: Block-scoped variable 'result' used before its declaration.
    113 |       } else {        throw new Error(`HTTP error! status: ${response.status}`);
    114 |
  > 115 |         console.error('API did not return valid language data:', result);      }
        |                                                                  ^^^^^^
    116 |
    117 |         setError('Failed to load languages from API. Please try again.');      
    118 |

ERROR in src/TranslationRoom.tsx:119:35
TS2304: Cannot find name 'response'.
    117 |         setError('Failed to load languages from API. Please try again.');      
    118 |
  > 119 |       }      const result = await response.json();
        |                                   ^^^^^^^^
    120 |
    121 |             
    122 |

ERROR in src/TranslationRoom.tsx:133:14
TS1128: Declaration or statement expected.
    131 |       setLoading(false);        console.log(`Loaded ${result.data.length} languages from API`);
    132 |
  > 133 |     }      } else {
        |              ^^^^
    134 |
    135 |   };        console.error('API did not return valid language data:', result);
    136 |

ERROR in src/TranslationRoom.tsx:145:20
TS1005: 'try' expected.
    143 |       alert('Please select a language and enter your name');      setLoading(false);
    144 |
  > 145 |       return;    } catch (err) {
        |                    ^^^^^
    146 |
    147 |     }      console.error('Error fetching languages:', err);
    148 |

ERROR in src/TranslationRoom.tsx:147:55
TS2304: Cannot find name 'err'.
    145 |       return;    } catch (err) {
    146 |
  > 147 |     }      console.error('Error fetching languages:', err);
        |                                                       ^^^
    148 |
    149 |     setInSession(true);      setError('Failed to load languages from API. Please try again.')
    150 |

ERROR in src/TranslationRoom.tsx:161:10
TS1005: ',' expected.
    159 |       stopTranslation();  const handleJoinSession = () => {
    160 |
  > 161 |     }    if (!selectedLanguage || !translatorName.trim()) {
        |          ^^
    162 |
    163 |     setInSession(false);      alert('Please select a language and enter your name');
    164 |

ERROR in src/TranslationRoom.tsx:187:11
TS2304: Cannot find name 'hlsInstanceRef'.
    185 |     return () => {    setSelectedLanguage('');
    186 |
  > 187 |       if (hlsInstanceRef.current) {    setTranslatorName('');
        |           ^^^^^^^^^^^^^^
    188 |
    189 |         hlsInstanceRef.current.destroy();  };
    190 |

ERROR in src/TranslationRoom.tsx:189:9
TS2304: Cannot find name 'hlsInstanceRef'.
    187 |       if (hlsInstanceRef.current) {    setTranslatorName('');
    188 |
  > 189 |         hlsInstanceRef.current.destroy();  };
        |         ^^^^^^^^^^^^^^
    190 |
    191 |       }
    192 |

ERROR in src/TranslationRoom.tsx:193:11
TS2304: Cannot find name 'outputHlsRef'.
    191 |       }
    192 |
  > 193 |       if (outputHlsRef.current) {  // Initialize source video when entering session
        |           ^^^^^^^^^^^^
    194 |
    195 |         outputHlsRef.current.destroy();  useEffect(() => {
    196 |

ERROR in src/TranslationRoom.tsx:195:9
TS2304: Cannot find name 'outputHlsRef'.
    193 |       if (outputHlsRef.current) {  // Initialize source video when entering session
    194 |
  > 195 |         outputHlsRef.current.destroy();  useEffect(() => {
        |         ^^^^^^^^^^^^
    196 |
    197 |       }    if (inSession && sourceVideoRef.current) {
    198 |

ERROR in src/TranslationRoom.tsx:197:12
TS1005: ',' expected.
    195 |         outputHlsRef.current.destroy();  useEffect(() => {
    196 |
  > 197 |       }    if (inSession && sourceVideoRef.current) {
        |            ^^
    198 |
    199 |     };      initializeSourceVideo();
    200 |

ERROR in src/TranslationRoom.tsx:201:4
TS1128: Declaration or statement expected.
    199 |     };      initializeSourceVideo();
    200 |
  > 201 |   }, [inSession]);    }
        |    ^
    202 |
    203 |
    204 |

ERROR in src/TranslationRoom.tsx:201:17
TS1005: ';' expected.
    199 |     };      initializeSourceVideo();
    200 |
  > 201 |   }, [inSession]);    }
        |                 ^
    202 |
    203 |
    204 |

ERROR in src/TranslationRoom.tsx:205:51
TS2695: Left side of comma operator is unused and has no side effects.
    203 |
    204 |
  > 205 |   const initializeSourceVideo = () => {    return () => {
        |                                                   ^^^^^^^
    206 |
    207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
    208 |

ERROR in src/TranslationRoom.tsx:207:19
TS2304: Cannot find name 'sourceVideoRef'.
    205 |   const initializeSourceVideo = () => {    return () => {
    206 |
  > 207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
        |                   ^^^^^^^^^^^^^^
    208 |
    209 |     if (!video) return;        hlsInstanceRef.current.destroy();
    210 |

ERROR in src/TranslationRoom.tsx:207:52
TS2304: Cannot find name 'hlsInstanceRef'.
    205 |   const initializeSourceVideo = () => {    return () => {
    206 |
  > 207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
        |                                                    ^^^^^^^^^^^^^^
    208 |
    209 |     if (!video) return;        hlsInstanceRef.current.destroy();
    210 |

ERROR in src/TranslationRoom.tsx:209:32
TS2304: Cannot find name 'hlsInstanceRef'.
    207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
    208 |
  > 209 |     if (!video) return;        hlsInstanceRef.current.destroy();
        |                                ^^^^^^^^^^^^^^
    210 |
    211 |       }
    212 |

ERROR in src/TranslationRoom.tsx:213:39
TS2304: Cannot find name 'outputHlsRef'.
    211 |       }
    212 |
  > 213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
        |                                       ^^^^^^^^^^^^
    214 |
    215 |       const hls = new Hls({        outputHlsRef.current.destroy();
    216 |

ERROR in src/TranslationRoom.tsx:215:36
TS18004: No value exists in scope for the shorthand property 'outputHlsRef'. Either declare one or provide an initializer.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                    ^^^^^^^^^^^^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:215:48
TS1005: ',' expected.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                                ^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:215:66
TS1005: ',' expected.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                                                  ^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:219:9
TS1005: ',' expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:9
TS2304: Cannot find name 'lowLatencyMode'.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:9
TS2554: Expected 0-1 arguments, but got 3.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:23
TS1005: ',' expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |                       ^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:34
TS1135: Argument expression expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |                                  ^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:221:8
TS1128: Declaration or statement expected.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |        ^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:221:16
TS2304: Cannot find name 'inSession'.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |                ^^^^^^^^^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:221:26
TS1005: ';' expected.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |                          ^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:223:7
TS2304: Cannot find name 'hls'.
    221 |       });  }, [inSession]);
    222 |
  > 223 |       hls.loadSource(SOURCE_VIDEO_URL);
        |       ^^^
    224 |
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |

ERROR in src/TranslationRoom.tsx:225:7
TS2304: Cannot find name 'hls'.
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |
  > 225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
        |       ^^^
    226 |
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |

ERROR in src/TranslationRoom.tsx:225:23
TS2304: Cannot find name 'video'.
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |
  > 225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
        |                       ^^^^^
    226 |
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |

ERROR in src/TranslationRoom.tsx:227:7
TS2304: Cannot find name 'hls'.
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |
  > 227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
        |       ^^^
    228 |
    229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
    230 |

ERROR in src/TranslationRoom.tsx:227:67
TS2304: Cannot find name 'sourceVideoRef'.
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |
  > 227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
        |                                                                   ^^^^^^^^^^^^^^
    228 |
    229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
    230 |

ERROR in src/TranslationRoom.tsx:229:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |
  > 229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
        |                            ^
    230 |
    231 |       });
    232 |

ERROR in src/TranslationRoom.tsx:233:7
TS2304: Cannot find name 'hlsInstanceRef'.
    231 |       });
    232 |
  > 233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
        |       ^^^^^^^^^^^^^^
    234 |
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |

ERROR in src/TranslationRoom.tsx:233:32
TS2304: Cannot find name 'hls'.
    231 |       });
    232 |
  > 233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
        |                                ^^^
    234 |
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |

ERROR in src/TranslationRoom.tsx:235:16
TS2304: Cannot find name 'video'.
    233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
    234 |
  > 235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
        |                ^^^^^
    236 |
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |

ERROR in src/TranslationRoom.tsx:237:7
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |       ^^^^^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:7
TS2345: Argument of type '{ video: any; "": any; enableWorker: true; }' is not assignable to parameter of type 'Partial<HlsConfig>'.
  Object literal may only specify known properties, and 'video' does not exist in type 'Partial<HlsConfig>'.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |       ^^^^^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:12
TS1005: ',' expected.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |            ^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:35
TS1005: ',' expected.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |                                   ^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:239:7
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |       ^^^^^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:239:12
TS1005: ',' expected.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |            ^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:239:79
TS2695: Left side of comma operator is unused and has no side effects.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |                                                                               ^^^^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:241:9
TS2304: Cannot find name 'video'.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |         ^^^^^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:241:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |                            ^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:241:90
TS1005: ',' expected.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |                                                                                          ^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:245:12
TS2304: Cannot find name 'hls'.
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |
  > 245 |     }      hls.attachMedia(video);
        |            ^^^
    246 |
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |

ERROR in src/TranslationRoom.tsx:245:28
TS2304: Cannot find name 'video'.
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |
  > 245 |     }      hls.attachMedia(video);
        |                            ^^^^^
    246 |
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |

ERROR in src/TranslationRoom.tsx:247:11
TS2304: Cannot find name 'hls'.
    245 |     }      hls.attachMedia(video);
    246 |
  > 247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
        |           ^^^
    248 |
    249 |         video.play().catch(e => console.error('Error playing source video:', e));
    250 |

ERROR in src/TranslationRoom.tsx:249:9
TS2304: Cannot find name 'video'.
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |
  > 249 |         video.play().catch(e => console.error('Error playing source video:', e));
        |         ^^^^^
    250 |
    251 |   const startTranslation = async () => {      });
    252 |

ERROR in src/TranslationRoom.tsx:249:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |
  > 249 |         video.play().catch(e => console.error('Error playing source video:', e));
        |                            ^
    250 |
    251 |   const startTranslation = async () => {      });
    252 |

ERROR in src/TranslationRoom.tsx:251:48
TS1005: ',' expected.
    249 |         video.play().catch(e => console.error('Error playing source video:', e));
    250 |
  > 251 |   const startTranslation = async () => {      });
        |                                                ^
    252 |
    253 |     try {      hlsInstanceRef.current = hls;
    254 |

ERROR in src/TranslationRoom.tsx:253:16
TS2304: Cannot find name 'hlsInstanceRef'.
    251 |   const startTranslation = async () => {      });
    252 |
  > 253 |     try {      hlsInstanceRef.current = hls;
        |                ^^^^^^^^^^^^^^
    254 |
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |

ERROR in src/TranslationRoom.tsx:253:41
TS2304: Cannot find name 'hls'.
    251 |   const startTranslation = async () => {      });
    252 |
  > 253 |     try {      hlsInstanceRef.current = hls;
        |                                         ^^^
    254 |
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |

ERROR in src/TranslationRoom.tsx:255:7
TS2304: Cannot find name 'setStreamStatus'.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |       ^^^^^^^^^^^^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:255:48
TS1472: 'catch' or 'finally' expected.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |                                                ^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:255:57
TS2304: Cannot find name 'video'.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |                                                         ^^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:257:7
TS2304: Cannot find name 'video'.
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |
  > 257 |       video.src = SOURCE_VIDEO_URL;
        |       ^^^^^
    258 |
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |

ERROR in src/TranslationRoom.tsx:261:78
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                              ^^^^^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:83
TS1005: ',' expected.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                   ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:83
TS2345: Argument of type '{ video: any; "": any; audio: {}; }' is not assignable to parameter of type 'MediaStreamConstraints'.
  Object literal may only specify known properties, and '(Missing)' does not exist in type 'MediaStreamConstraints'.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:97
TS7006: Parameter 'e' implicitly has an 'any' type.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                                 ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:150
TS1005: ',' expected.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                                                                                      ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:263:24
TS1005: ',' expected.
    261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
    262 |
  > 263 |         audio: {      });
        |                        ^
    264 |
    265 |           echoCancellation: true,    }
    266 |

ERROR in src/TranslationRoom.tsx:265:29
TS2695: Left side of comma operator is unused and has no side effects.
    263 |         audio: {      });
    264 |
  > 265 |           echoCancellation: true,    }
        |                             ^^^^
    266 |
    267 |           noiseSuppression: true,  };
    268 |

ERROR in src/TranslationRoom.tsx:265:38
TS1109: Expression expected.
    263 |         audio: {      });
    264 |
  > 265 |           echoCancellation: true,    }
        |                                      ^
    266 |
    267 |           noiseSuppression: true,  };
    268 |

ERROR in src/TranslationRoom.tsx:267:29
TS2695: Left side of comma operator is unused and has no side effects.
    265 |           echoCancellation: true,    }
    266 |
  > 267 |           noiseSuppression: true,  };
        |                             ^^^^
    268 |
    269 |           autoGainControl: true,
    270 |

ERROR in src/TranslationRoom.tsx:267:36
TS1109: Expression expected.
    265 |           echoCancellation: true,    }
    266 |
  > 267 |           noiseSuppression: true,  };
        |                                    ^
    268 |
    269 |           autoGainControl: true,
    270 |

ERROR in src/TranslationRoom.tsx:269:28
TS2695: Left side of comma operator is unused and has no side effects.
    267 |           noiseSuppression: true,  };
    268 |
  > 269 |           autoGainControl: true,
        |                            ^^^^
    270 |
    271 |         },  const startTranslation = async () => {
    272 |

ERROR in src/TranslationRoom.tsx:271:9
TS1109: Expression expected.
    269 |           autoGainControl: true,
    270 |
  > 271 |         },  const startTranslation = async () => {
        |         ^
    272 |
    273 |         video: false,    try {
    274 |

ERROR in src/TranslationRoom.tsx:271:10
TS1128: Declaration or statement expected.
    269 |           autoGainControl: true,
    270 |
  > 271 |         },  const startTranslation = async () => {
        |          ^
    272 |
    273 |         video: false,    try {
    274 |

ERROR in src/TranslationRoom.tsx:273:16
TS2695: Left side of comma operator is unused and has no side effects.
    271 |         },  const startTranslation = async () => {
    272 |
  > 273 |         video: false,    try {
        |                ^^^^^
    274 |
    275 |       });      setIsTranslating(true);
    276 |

ERROR in src/TranslationRoom.tsx:273:26
TS1109: Expression expected.
    271 |         },  const startTranslation = async () => {
    272 |
  > 273 |         video: false,    try {
        |                          ^^^
    274 |
    275 |       });      setIsTranslating(true);
    276 |

ERROR in src/TranslationRoom.tsx:275:8
TS1472: 'catch' or 'finally' expected.
    273 |         video: false,    try {
    274 |
  > 275 |       });      setIsTranslating(true);
        |        ^
    276 |
    277 |
    278 |

ERROR in src/TranslationRoom.tsx:275:16
TS2304: Cannot find name 'setIsTranslating'.
    273 |         video: false,    try {
    274 |
  > 275 |       });      setIsTranslating(true);
        |                ^^^^^^^^^^^^^^^^
    276 |
    277 |
    278 |

ERROR in src/TranslationRoom.tsx:279:7
TS2304: Cannot find name 'audioStreamRef'.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |       ^^^^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:279:32
TS2448: Block-scoped variable 'audioStream' used before its declaration.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |                                ^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:279:32
TS2454: Variable 'audioStream' is used before being assigned.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |                                ^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:285:13
TS1005: ':' expected.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |             ^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:13
TS2588: Cannot assign to 'videoElement' because it is a constant.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |             ^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:28
TS2304: Cannot find name 'sourceVideoRef'.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |                            ^^^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:50
TS1005: ',' expected.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |                                                  ^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:287:11
TS1003: Identifier expected.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |           ^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:287:12
TS7006: Parameter 'videoElement' implicitly has an 'any' type.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |            ^^^^^^^^^^^^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:287:55
TS2695: Left side of comma operator is unused and has no side effects.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |                                                       ^^^^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:289:9
TS1109: Expression expected.
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |
  > 289 |         throw new Error('Source video not available');          autoGainControl: true,
        |         ^^^^^
    290 |
    291 |       }        },
    292 |

ERROR in src/TranslationRoom.tsx:289:82
TS2695: Left side of comma operator is unused and has no side effects.
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |
  > 289 |         throw new Error('Source video not available');          autoGainControl: true,
        |                                                                                  ^^^^
    290 |
    291 |       }        },
    292 |

ERROR in src/TranslationRoom.tsx:291:7
TS1109: Expression expected.
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |
  > 291 |       }        },
        |       ^
    292 |
    293 |         video: false,
    294 |

ERROR in src/TranslationRoom.tsx:293:9
TS2304: Cannot find name 'video'.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |         ^^^^^
    294 |
    295 |       setStreamStatus('Capturing video...');      });
    296 |

ERROR in src/TranslationRoom.tsx:293:9
TS2554: Expected 0-1 arguments, but got 4.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |         ^^^^^^^^^^^^^
  > 294 |
        | ^
  > 295 |       setStreamStatus('Capturing video...');      });
        | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:293:14
TS1005: ',' expected.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |              ^
    294 |
    295 |       setStreamStatus('Capturing video...');      });
    296 |

ERROR in src/TranslationRoom.tsx:295:7
TS2304: Cannot find name 'setStreamStatus'.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |       ^^^^^^^^^^^^^^^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:295:44
TS1005: ')' expected.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |                                            ^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:295:52
TS1005: ',' expected.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |                                                    ^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:301:13
TS2451: Cannot redeclare block-scoped variable 'canvas'.
    299 |       // Create canvas to capture video      audioStreamRef.current = audioStream;
    300 |
  > 301 |       const canvas = document.createElement('canvas');
        |             ^^^^^^
    302 |
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |

ERROR in src/TranslationRoom.tsx:303:22
TS2448: Block-scoped variable 'videoElement' used before its declaration.
    301 |       const canvas = document.createElement('canvas');
    302 |
  > 303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
        |                      ^^^^^^^^^^^^
    304 |
    305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
    306 |

ERROR in src/TranslationRoom.tsx:305:23
TS2448: Block-scoped variable 'videoElement' used before its declaration.
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |
  > 305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
        |                       ^^^^^^^^^^^^
    306 |
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |

ERROR in src/TranslationRoom.tsx:305:82
TS2304: Cannot find name 'sourceVideoRef'.
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |
  > 305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
        |                                                                                  ^^^^^^^^^^^^^^
    306 |
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |

ERROR in src/TranslationRoom.tsx:309:7
TS2552: Cannot find name 'canvasRef'. Did you mean 'canvas'?
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |
  > 309 |       canvasRef.current = canvas;        throw new Error('Source video not available');
        |       ^^^^^^^^^
    310 |
    311 |       }
    312 |

ERROR in src/TranslationRoom.tsx:315:13
TS2451: Cannot redeclare block-scoped variable 'videoStream'.
    313 |       // Capture video frames at 30fps
    314 |
  > 315 |       const videoStream = canvas.captureStream(30);      // Create canvas to capture video
        |             ^^^^^^^^^^^
    316 |
    317 |             const canvas = document.createElement('canvas');
    318 |

ERROR in src/TranslationRoom.tsx:317:19
TS2451: Cannot redeclare block-scoped variable 'canvas'.
    315 |       const videoStream = canvas.captureStream(30);      // Create canvas to capture video
    316 |
  > 317 |             const canvas = document.createElement('canvas');
        |                   ^^^^^^
    318 |
    319 |       // Draw video frames to canvas      canvas.width = videoElement.videoWidth || 1280;
    320 |

ERROR in src/TranslationRoom.tsx:321:13
TS2451: Cannot redeclare block-scoped variable 'drawFrame'.
    319 |       // Draw video frames to canvas      canvas.width = videoElement.videoWidth || 1280;
    320 |
  > 321 |       const drawFrame = () => {      canvas.height = videoElement.videoHeight || 720;
        |             ^^^^^^^^^
    322 |
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |

ERROR in src/TranslationRoom.tsx:323:36
TS2304: Cannot find name 'isTranslating'.
    321 |       const drawFrame = () => {      canvas.height = videoElement.videoHeight || 720;
    322 |
  > 323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
        |                                    ^^^^^^^^^^^^^
    324 |
    325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
    326 |

ERROR in src/TranslationRoom.tsx:325:11
TS18047: 'ctx' is possibly 'null'.
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |
  > 325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
        |           ^^^
    326 |
    327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
    328 |

ERROR in src/TranslationRoom.tsx:325:80
TS2304: Cannot find name 'canvasRef'.
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |
  > 325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
        |                                                                                ^^^^^^^^^
    326 |
    327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
    328 |

ERROR in src/TranslationRoom.tsx:327:11
TS2304: Cannot find name 'animationFrameRef'.
    325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
    326 |
  > 327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
        |           ^^^^^^^^^^^^^^^^^
    328 |
    329 |         }      // Capture video frames at 30fps
    330 |

ERROR in src/TranslationRoom.tsx:331:21
TS2451: Cannot redeclare block-scoped variable 'videoStream'.
    329 |         }      // Capture video frames at 30fps
    330 |
  > 331 |       };      const videoStream = canvas.captureStream(30);
        |                     ^^^^^^^^^^^
    332 |
    333 |             
    334 |

ERROR in src/TranslationRoom.tsx:335:7
TS2304: Cannot find name 'setIsTranslating'.
    333 |             
    334 |
  > 335 |       setIsTranslating(true);      // Draw video frames to canvas
        |       ^^^^^^^^^^^^^^^^
    336 |
    337 |       drawFrame();      const drawFrame = () => {
    338 |

ERROR in src/TranslationRoom.tsx:337:31
TS2451: Cannot redeclare block-scoped variable 'drawFrame'.
    335 |       setIsTranslating(true);      // Draw video frames to canvas
    336 |
  > 337 |       drawFrame();      const drawFrame = () => {
        |                               ^^^^^^^^^
    338 |
    339 |         if (ctx && videoElement && isTranslating) {
    340 |

ERROR in src/TranslationRoom.tsx:339:36
TS2304: Cannot find name 'isTranslating'.
    337 |       drawFrame();      const drawFrame = () => {
    338 |
  > 339 |         if (ctx && videoElement && isTranslating) {
        |                                    ^^^^^^^^^^^^^
    340 |
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |

ERROR in src/TranslationRoom.tsx:343:30
TS2769: No overload matches this call.
  Overload 1 of 3, '(stream: MediaStream): MediaStream', gave the following error.
    Argument of type 'number[]' is not assignable to parameter of type 'MediaStream'.
      Type 'number[]' is missing the following properties from type 'MediaStream': active, id, onaddtrack, onremovetrack, and 10 more.
  Overload 2 of 3, '(tracks: MediaStreamTrack[]): MediaStream', gave the following error.
    Type 'number' is not assignable to type 'MediaStreamTrack'.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:343:57
TS2304: Cannot find name 'animationFrameRef'.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                                                         ^^^^^^^^^^^^^^^^^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:343:117
TS1005: ',' expected.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                                                                                                                     ^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:345:9
TS1128: Declaration or statement expected.
    343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
    344 |
  > 345 |         ...videoStream.getVideoTracks(),        }
        |         ^^^
    346 |
    347 |         ...audioStream.getAudioTracks(),      };
    348 |

ERROR in src/TranslationRoom.tsx:345:49
TS1109: Expression expected.
    343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
    344 |
  > 345 |         ...videoStream.getVideoTracks(),        }
        |                                                 ^
    346 |
    347 |         ...audioStream.getAudioTracks(),      };
    348 |

ERROR in src/TranslationRoom.tsx:347:9
TS1128: Declaration or statement expected.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |         ^^^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:347:12
TS2304: Cannot find name 'audioStream'.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |            ^^^^^^^^^^^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:347:47
TS1109: Expression expected.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |                                               ^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:349:7
TS1128: Declaration or statement expected.
    347 |         ...audioStream.getAudioTracks(),      };
    348 |
  > 349 |       ]);      drawFrame();
        |       ^
    350 |
    351 |
    352 |

ERROR in src/TranslationRoom.tsx:349:8
TS1128: Declaration or statement expected.
    347 |         ...audioStream.getAudioTracks(),      };
    348 |
  > 349 |       ]);      drawFrame();
        |        ^
    350 |
    351 |
    352 |

ERROR in src/TranslationRoom.tsx:353:7
TS2552: Cannot find name 'combinedStreamRef'. Did you mean 'combinedStream'?
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |       ^^^^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:353:35
TS2448: Block-scoped variable 'combinedStream' used before its declaration.
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |                                   ^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:353:35
TS2454: Variable 'combinedStream' is used before being assigned.
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |                                   ^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:357:7
TS2304: Cannot find name 'setStreamStatus'.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |       ^^^^^^^^^^^^^^^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:357:59
TS1005: ',' expected.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |                                                           ^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:357:68
TS1128: Declaration or statement expected.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |                                                                    ^^^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:359:9
TS1109: Expression expected.
    357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
    358 |
  > 359 |         ...audioStream.getAudioTracks(),
        |         ^^^
    360 |
    361 |       // Connect to WebSocket bridge server      ]);
    362 |

ERROR in src/TranslationRoom.tsx:359:12
TS2304: Cannot find name 'audioStream'.
    357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
    358 |
  > 359 |         ...audioStream.getAudioTracks(),
        |            ^^^^^^^^^^^
    360 |
    361 |       // Connect to WebSocket bridge server      ]);
    362 |

ERROR in src/TranslationRoom.tsx:363:7
TS1109: Expression expected.
    361 |       // Connect to WebSocket bridge server      ]);
    362 |
  > 363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
        |       ^^^^^
    364 |
    365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
    366 |

ERROR in src/TranslationRoom.tsx:365:7
TS2304: Cannot find name 'wsRef'.
    363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
    364 |
  > 365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
        |       ^^^^^
    366 |
    367 |
    368 |

ERROR in src/TranslationRoom.tsx:365:32
TS2552: Cannot find name 'combinedStreamRef'. Did you mean 'combinedStream'?
    363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
    364 |
  > 365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
        |                                ^^^^^^^^^^^^^^^^^
    366 |
    367 |
    368 |

ERROR in src/TranslationRoom.tsx:373:9
TS2304: Cannot find name 'setStreamStatus'.
    371 |         console.log('Connected to RTMP bridge server');      const ws = new WebSocket(BRIDGE_SERVER_URL);
    372 |
  > 373 |         setStreamStatus('Connected. Starting stream...');      wsRef.current = ws;
        |         ^^^^^^^^^^^^^^^
    374 |
    375 |         
    376 |

ERROR in src/TranslationRoom.tsx:373:64
TS2304: Cannot find name 'wsRef'.
    371 |         console.log('Connected to RTMP bridge server');      const ws = new WebSocket(BRIDGE_SERVER_URL);
    372 |
  > 373 |         setStreamStatus('Connected. Starting stream...');      wsRef.current = ws;
        |                                                                ^^^^^
    374 |
    375 |         
    376 |

ERROR in src/TranslationRoom.tsx:379:48
TS1005: ',' expected.
    377 |         // Start streaming      ws.onopen = () => {
    378 |
  > 379 |         ws.send(JSON.stringify({        console.log('Connected to RTMP bridge server');
        |                                                ^
    380 |
    381 |           type: 'start',        
    382 |

ERROR in src/TranslationRoom.tsx:379:87
TS1005: ',' expected.
    377 |         // Start streaming      ws.onopen = () => {
    378 |
  > 379 |         ws.send(JSON.stringify({        console.log('Connected to RTMP bridge server');
        |                                                                                       ^
    380 |
    381 |           type: 'start',        
    382 |

ERROR in src/TranslationRoom.tsx:383:21
TS2304: Cannot find name 'selectedLanguage'.
    381 |           type: 'start',        
    382 |
  > 383 |           language: selectedLanguage        // Start streaming
        |                     ^^^^^^^^^^^^^^^^
    384 |
    385 |         }));        ws.send(JSON.stringify({
    386 |

ERROR in src/TranslationRoom.tsx:391:15
TS1005: ':' expected.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |               ^^^^^^^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:391:15
TS2588: Cannot assign to 'options' because it is a constant.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |               ^^^^^^^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:391:35
TS1005: ',' expected.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |                                   ^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:393:21
TS2695: Left side of comma operator is unused and has no side effects.
    391 |         const options = {        }));
    392 |
  > 393 |           mimeType: 'video/webm;codecs=vp8,opus',
        |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    394 |
    395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
    396 |

ERROR in src/TranslationRoom.tsx:395:11
TS2304: Cannot find name 'videoBitsPerSecond'.
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |
  > 395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
        |           ^^^^^^^^^^^^^^^^^^
    396 |
    397 |         };        const options = {
    398 |

ERROR in src/TranslationRoom.tsx:395:29
TS1005: ';' expected.
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |
  > 395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
        |                             ^
    396 |
    397 |         };        const options = {
    398 |

ERROR in src/TranslationRoom.tsx:397:25
TS7022: 'options' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
    395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
    396 |
  > 397 |         };        const options = {
        |                         ^^^^^^^
    398 |
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |

ERROR in src/TranslationRoom.tsx:401:15
TS1005: ':' expected.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |               ^^^^^^^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:15
TS2304: Cannot find name 'mediaRecorder'.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |               ^^^^^^^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:65
TS2448: Block-scoped variable 'options' used before its declaration.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |                                                                 ^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:73
TS1005: ',' expected.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |                                                                         ^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:403:9
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |         ^^^^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:9
TS18004: No value exists in scope for the shorthand property 'mediaRecorderRef'. Either declare one or provide an initializer.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |         ^^^^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:25
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                         ^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:36
TS2304: Cannot find name 'mediaRecorder'.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                                    ^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:49
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                                                 ^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:407:9
TS2304: Cannot find name 'mediaRecorder'.
    405 |
    406 |
  > 407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
        |         ^^^^^^^^^^^^^
    408 |
    409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
    410 |

ERROR in src/TranslationRoom.tsx:407:42
TS7006: Parameter 'event' implicitly has an 'any' type.
    405 |
    406 |
  > 407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
        |                                          ^^^^^
    408 |
    409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
    410 |

ERROR in src/TranslationRoom.tsx:409:81
TS2304: Cannot find name 'mediaRecorderRef'.
    407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
    408 |
  > 409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
        |                                                                                 ^^^^^^^^^^^^^^^^
    410 |
    411 |             ws.send(event.data);
    412 |

ERROR in src/TranslationRoom.tsx:419:78
TS2339: Property 'data' does not exist on type 'Event'.
    417 |             // Send binary data to bridge server
    418 |
  > 419 |         mediaRecorder.onerror = (event: Event) => {            ws.send(event.data);
        |                                                                              ^^^^
    420 |
    421 |           console.error('MediaRecorder error:', event);          }
    422 |

ERROR in src/TranslationRoom.tsx:423:11
TS2304: Cannot find name 'setStreamStatus'.
    421 |           console.error('MediaRecorder error:', event);          }
    422 |
  > 423 |           setStreamStatus('Error: MediaRecorder failed');        };
        |           ^^^^^^^^^^^^^^^
    424 |
    425 |         };
    426 |

ERROR in src/TranslationRoom.tsx:427:9
TS2304: Cannot find name 'mediaRecorder'.
    425 |         };
    426 |
  > 427 |         mediaRecorder.onerror = (event) => {
        |         ^^^^^^^^^^^^^
    428 |
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |

ERROR in src/TranslationRoom.tsx:427:34
TS7006: Parameter 'event' implicitly has an 'any' type.
    425 |         };
    426 |
  > 427 |         mediaRecorder.onerror = (event) => {
        |                                  ^^^^^
    428 |
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |

ERROR in src/TranslationRoom.tsx:431:9
TS2304: Cannot find name 'mediaRecorder'.
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |
  > 431 |         mediaRecorder.start(100);        };
        |         ^^^^^^^^^^^^^
    432 |
    433 |         
    434 |

ERROR in src/TranslationRoom.tsx:437:7
TS1128: Declaration or statement expected.
    435 |         console.log('Started streaming to RTMP via bridge server');        // Start recording in chunks
    436 |
  > 437 |       };        mediaRecorder.start(100); // Send data every 100ms
        |       ^
    438 |
    439 |         
    440 |

ERROR in src/TranslationRoom.tsx:437:17
TS2304: Cannot find name 'mediaRecorder'.
    435 |         console.log('Started streaming to RTMP via bridge server');        // Start recording in chunks
    436 |
  > 437 |       };        mediaRecorder.start(100); // Send data every 100ms
        |                 ^^^^^^^^^^^^^
    438 |
    439 |         
    440 |

ERROR in src/TranslationRoom.tsx:445:9
TS2304: Cannot find name 'setStreamStatus'.
    443 |         console.error('WebSocket error:', error);      };
    444 |
  > 445 |         setStreamStatus('Error: Cannot connect to bridge server');
        |         ^^^^^^^^^^^^^^^
    446 |
    447 |         alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');      ws.onerror = (error) => {
    448 |

ERROR in src/TranslationRoom.tsx:449:9
TS2304: Cannot find name 'setIsTranslating'.
    447 |         alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');      ws.onerror = (error) => {
    448 |
  > 449 |         setIsTranslating(false);        console.error('WebSocket error:', error);
        |         ^^^^^^^^^^^^^^^^
    450 |
    451 |       };        alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');
    452 |

ERROR in src/TranslationRoom.tsx:453:9
TS2304: Cannot find name 'setIsTranslating'.
    451 |       };        alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');
    452 |
  > 453 |         setIsTranslating(false);
        |         ^^^^^^^^^^^^^^^^
    454 |
    455 |       ws.onclose = () => {      };
    456 |

ERROR in src/TranslationRoom.tsx:459:9
TS2304: Cannot find name 'setStreamStatus'.
    457 |         console.log('Disconnected from bridge server');
    458 |
  > 459 |         setStreamStatus('Disconnected from bridge server');      ws.onclose = () => {
        |         ^^^^^^^^^^^^^^^
    460 |
    461 |       };        console.log('Disconnected from bridge server');
    462 |

ERROR in src/TranslationRoom.tsx:463:7
TS1128: Declaration or statement expected.
    461 |       };        console.log('Disconnected from bridge server');
    462 |
  > 463 |       };
        |       ^
    464 |
    465 |       ws.onmessage = (event) => {
    466 |

ERROR in src/TranslationRoom.tsx:475:13
TS2304: Cannot find name 'setStreamStatus'.
    473 |             console.log('RTMP streaming started for:', data.streamKey);          if (data.type === 'started') {
    474 |
  > 475 |             setStreamStatus(`Streaming live to ${data.streamKey}`);            console.log('RTMP streaming started for:', data.streamKey);
        |             ^^^^^^^^^^^^^^^
    476 |
    477 |             // Start monitoring the output stream after a delay            // Start monitoring the output stream
    478 |

ERROR in src/TranslationRoom.tsx:489:13
TS2304: Cannot find name 'setStreamStatus'.
    487 |             console.error('Bridge server error:', data.error);            console.error('Bridge server error:', data.error);
    488 |
  > 489 |             setStreamStatus(`Error: ${data.error}`);            alert(`Streaming error: ${data.error}`);
        |             ^^^^^^^^^^^^^^^
    490 |
    491 |           } else if (data.type === 'stopped') {          }
    492 |

ERROR in src/TranslationRoom.tsx:493:13
TS2304: Cannot find name 'setStreamStatus'.
    491 |           } else if (data.type === 'stopped') {          }
    492 |
  > 493 |             setStreamStatus('Stream stopped');        } catch (err) {
        |             ^^^^^^^^^^^^^^^
    494 |
    495 |           }          console.log('Non-JSON message from bridge:', event.data);
    496 |

ERROR in src/TranslationRoom.tsx:493:57
TS1005: 'try' expected.
    491 |           } else if (data.type === 'stopped') {          }
    492 |
  > 493 |             setStreamStatus('Stream stopped');        } catch (err) {
        |                                                         ^^^^^
    494 |
    495 |           }          console.log('Non-JSON message from bridge:', event.data);
    496 |

ERROR in src/TranslationRoom.tsx:503:8
TS1472: 'catch' or 'finally' expected.
    501 |         }
    502 |
  > 503 |       };    } catch (err) {
        |        ^
    504 |
    505 |       console.error('Error starting translation:', err);
    506 |

ERROR in src/TranslationRoom.tsx:503:15
TS1005: ';' expected.
    501 |         }
    502 |
  > 503 |       };    } catch (err) {
        |               ^^^^^
    504 |
    505 |       console.error('Error starting translation:', err);
    506 |

ERROR in src/TranslationRoom.tsx:507:7
TS1005: 'try' expected.
    505 |       console.error('Error starting translation:', err);
    506 |
  > 507 |     } catch (err) {      alert('Failed to start translation. Please check microphone permissions.');
        |       ^^^^^
    508 |
    509 |       console.error('Error starting translation:', err);      setIsTranslating(false);
    510 |

ERROR in src/TranslationRoom.tsx:509:63
TS2304: Cannot find name 'setIsTranslating'.
    507 |     } catch (err) {      alert('Failed to start translation. Please check microphone permissions.');
    508 |
  > 509 |       console.error('Error starting translation:', err);      setIsTranslating(false);
        |                                                               ^^^^^^^^^^^^^^^^
    510 |
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |

ERROR in src/TranslationRoom.tsx:513:7
TS2304: Cannot find name 'setIsTranslating'.
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |
  > 513 |       setIsTranslating(false);  };
        |       ^^^^^^^^^^^^^^^^
    514 |
    515 |       setStreamStatus('Failed to start');
    516 |

ERROR in src/TranslationRoom.tsx:513:33
TS1128: Declaration or statement expected.
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |
  > 513 |       setIsTranslating(false);  };
        |                                 ^
    514 |
    515 |       setStreamStatus('Failed to start');
    516 |

ERROR in src/TranslationRoom.tsx:515:7
TS2304: Cannot find name 'setStreamStatus'.
    513 |       setIsTranslating(false);  };
    514 |
  > 515 |       setStreamStatus('Failed to start');
        |       ^^^^^^^^^^^^^^^
    516 |
    517 |     }  const startOutputVideo = () => {
    518 |

ERROR in src/TranslationRoom.tsx:517:5
TS1128: Declaration or statement expected.
    515 |       setStreamStatus('Failed to start');
    516 |
  > 517 |     }  const startOutputVideo = () => {
        |     ^
    518 |
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |

ERROR in src/TranslationRoom.tsx:517:14
TS2451: Cannot redeclare block-scoped variable 'startOutputVideo'.
    515 |       setStreamStatus('Failed to start');
    516 |
  > 517 |     }  const startOutputVideo = () => {
        |              ^^^^^^^^^^^^^^^^
    518 |
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |

ERROR in src/TranslationRoom.tsx:519:72
TS2304: Cannot find name 'selectedLanguage'.
    517 |     }  const startOutputVideo = () => {
    518 |
  > 519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
        |                                                                        ^^^^^^^^^^^^^^^^
    520 |
    521 |     const outputVideo = outputVideoRef.current;
    522 |

ERROR in src/TranslationRoom.tsx:521:25
TS2304: Cannot find name 'outputVideoRef'.
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |
  > 521 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    522 |
    523 |   const startOutputVideo = () => {    
    524 |

ERROR in src/TranslationRoom.tsx:523:9
TS2451: Cannot redeclare block-scoped variable 'startOutputVideo'.
    521 |     const outputVideo = outputVideoRef.current;
    522 |
  > 523 |   const startOutputVideo = () => {    
        |         ^^^^^^^^^^^^^^^^
    524 |
    525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
    526 |

ERROR in src/TranslationRoom.tsx:525:68
TS2304: Cannot find name 'selectedLanguage'.
    523 |   const startOutputVideo = () => {    
    524 |
  > 525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
        |                                                                    ^^^^^^^^^^^^^^^^
    526 |
    527 |     const outputVideo = outputVideoRef.current;
    528 |

ERROR in src/TranslationRoom.tsx:525:110
TS2448: Block-scoped variable 'outputVideo' used before its declaration.
    523 |   const startOutputVideo = () => {    
    524 |
  > 525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
        |                                                                                                              ^^^^^^^^^^^
    526 |
    527 |     const outputVideo = outputVideoRef.current;
    528 |

ERROR in src/TranslationRoom.tsx:527:25
TS2304: Cannot find name 'outputVideoRef'.
    525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
    526 |
  > 527 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    528 |
    529 |         console.log('Loading translated output stream:', watchUrl);
    530 |

ERROR in src/TranslationRoom.tsx:535:76
TS2451: Cannot redeclare block-scoped variable 'hls'.
    533 |     if (Hls.isSupported()) {
    534 |
  > 535 |     console.log('Loading translated output stream:', watchUrl);      const hls = new Hls({
        |                                                                            ^^^
    536 |
    537 |         enableWorker: true,
    538 |

ERROR in src/TranslationRoom.tsx:539:5
TS2345: Argument of type '{ enableWorker: true; if(Hls: any): any; "": any; }' is not assignable to parameter of type 'Partial<HlsConfig>'.
  Object literal may only specify known properties, and 'if' does not exist in type 'Partial<HlsConfig>'.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |     ^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:9
TS7006: Parameter 'Hls' implicitly has an 'any' type.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |         ^^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:12
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |            ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:26
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                          ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:28
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                            ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:53
TS1359: Identifier expected. 'true' is a reserved word that cannot be used here.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                                                     ^^^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:57
TS1005: ':' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                                                         ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:541:13
TS1005: ':' expected.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |             ^^^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:541:13
TS2451: Cannot redeclare block-scoped variable 'hls'.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |             ^^^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:541:36
TS1005: ',' expected.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |                                    ^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:543:23
TS2695: Left side of comma operator is unused and has no side effects.
    541 |       const hls = new Hls({      });
    542 |
  > 543 |         enableWorker: true,      
        |                       ^^^^
    544 |
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |

ERROR in src/TranslationRoom.tsx:545:9
TS2304: Cannot find name 'lowLatencyMode'.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |         ^^^^^^^^^^^^^^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:545:23
TS1005: ';' expected.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |                       ^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:545:25
TS2695: Left side of comma operator is unused and has no side effects.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |                         ^^^^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:547:22
TS2304: Cannot find name 'data'.
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |
  > 547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
        |                      ^^^^
    548 |
    549 |                 console.log('HLS stream not available yet, will retry...');
    550 |

ERROR in src/TranslationRoom.tsx:547:36
TS2304: Cannot find name 'data'.
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |
  > 547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
        |                                    ^^^^
    548 |
    549 |                 console.log('HLS stream not available yet, will retry...');
    550 |

ERROR in src/TranslationRoom.tsx:561:18
TS1005: ',' expected.
    559 |           setTimeout(() => startOutputVideo(), 3000);      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    560 |
  > 561 |         }        console.log('Translation output stream is now available');
        |                  ^^^^^^^
    562 |
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |

ERROR in src/TranslationRoom.tsx:561:75
TS1005: ')' expected.
    559 |           setTimeout(() => startOutputVideo(), 3000);      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    560 |
  > 561 |         }        console.log('Translation output stream is now available');
        |                                                                           ^
    562 |
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |

ERROR in src/TranslationRoom.tsx:563:8
TS1128: Declaration or statement expected.
    561 |         }        console.log('Translation output stream is now available');
    562 |
  > 563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
        |        ^
    564 |
    565 |       });
    566 |

ERROR in src/TranslationRoom.tsx:565:8
TS1128: Declaration or statement expected.
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |
  > 565 |       });
        |        ^
    566 |
    567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
    568 |

ERROR in src/TranslationRoom.tsx:567:7
TS2304: Cannot find name 'hls'.
    565 |       });
    566 |
  > 567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
        |       ^^^
    568 |
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |

ERROR in src/TranslationRoom.tsx:569:73
TS2304: Cannot find name 'hls'.
    567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
    568 |
  > 569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
        |                                                                         ^^^
    570 |
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |

ERROR in src/TranslationRoom.tsx:571:9
TS2304: Cannot find name 'setStreamStatus'.
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |
  > 571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
        |         ^^^^^^^^^^^^^^^
    572 |
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |

ERROR in src/TranslationRoom.tsx:571:68
TS2304: Cannot find name 'hls'.
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |
  > 571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
        |                                                                    ^^^
    572 |
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |

ERROR in src/TranslationRoom.tsx:573:95
TS2304: Cannot find name 'outputHlsRef'.
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |
  > 573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
        |                                                                                               ^^^^^^^^^^^^
    574 |
    575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
    576 |

ERROR in src/TranslationRoom.tsx:573:118
TS2304: Cannot find name 'hls'.
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |
  > 573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
        |                                                                                                                      ^^^
    574 |
    575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
    576 |

ERROR in src/TranslationRoom.tsx:575:16
TS1005: ',' expected.
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |
  > 575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
        |                ^^^^
    576 |
    577 |       outputVideo.src = watchUrl;
    578 |

ERROR in src/TranslationRoom.tsx:575:21
TS1389: 'if' is not allowed as a variable declaration name.
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |
  > 575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
        |                     ^^
    576 |
    577 |       outputVideo.src = watchUrl;
    578 |

ERROR in src/TranslationRoom.tsx:579:7
TS2304: Cannot find name 'hls'.
    577 |       outputVideo.src = watchUrl;
    578 |
  > 579 |       hls.loadSource(watchUrl);      outputVideo.addEventListener('loadedmetadata', () => {
        |       ^^^
    580 |
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |

ERROR in src/TranslationRoom.tsx:581:7
TS2304: Cannot find name 'hls'.
    579 |       hls.loadSource(watchUrl);      outputVideo.addEventListener('loadedmetadata', () => {
    580 |
  > 581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
        |       ^^^
    582 |
    583 |       outputHlsRef.current = hls;      });
    584 |

ERROR in src/TranslationRoom.tsx:583:7
TS2304: Cannot find name 'outputHlsRef'.
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |
  > 583 |       outputHlsRef.current = hls;      });
        |       ^^^^^^^^^^^^
    584 |
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |

ERROR in src/TranslationRoom.tsx:583:30
TS2304: Cannot find name 'hls'.
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |
  > 583 |       outputHlsRef.current = hls;      });
        |                              ^^^
    584 |
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |

ERROR in src/TranslationRoom.tsx:587:36
TS1128: Declaration or statement expected.
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |
  > 587 |       outputVideo.src = watchUrl;  };
        |                                    ^
    588 |
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |

ERROR in src/TranslationRoom.tsx:591:9
TS2304: Cannot find name 'setStreamStatus'.
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |
  > 591 |         setStreamStatus('Streaming live - Output available');  };
        |         ^^^^^^^^^^^^^^^
    592 |
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |

ERROR in src/TranslationRoom.tsx:591:65
TS1005: ')' expected.
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |
  > 591 |         setStreamStatus('Streaming live - Output available');  };
        |                                                                 ^
    592 |
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |

ERROR in src/TranslationRoom.tsx:595:7
TS1128: Declaration or statement expected.
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |
  > 595 |       });  const stopTranslation = () => {
        |       ^
    596 |
    597 |     }    // Stop media recorder
    598 |

ERROR in src/TranslationRoom.tsx:595:8
TS1128: Declaration or statement expected.
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |
  > 595 |       });  const stopTranslation = () => {
        |        ^
    596 |
    597 |     }    // Stop media recorder
    598 |

ERROR in src/TranslationRoom.tsx:599:3
TS1128: Declaration or statement expected.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |   ^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:599:13
TS2304: Cannot find name 'mediaRecorderRef'.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |             ^^^^^^^^^^^^^^^^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:599:41
TS2304: Cannot find name 'mediaRecorderRef'.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                         ^^^^^^^^^^^^^^^^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:601:7
TS2304: Cannot find name 'mediaRecorderRef'.
    599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
    600 |
  > 601 |       mediaRecorderRef.current.stop();
        |       ^^^^^^^^^^^^^^^^
    602 |
    603 |   const stopTranslation = () => {      mediaRecorderRef.current = null;
    604 |

ERROR in src/TranslationRoom.tsx:603:40
TS2304: Cannot find name 'mediaRecorderRef'.
    601 |       mediaRecorderRef.current.stop();
    602 |
  > 603 |   const stopTranslation = () => {      mediaRecorderRef.current = null;
        |                                        ^^^^^^^^^^^^^^^^
    604 |
    605 |     // Stop media recorder    }
    606 |

ERROR in src/TranslationRoom.tsx:607:9
TS2304: Cannot find name 'mediaRecorderRef'.
    605 |     // Stop media recorder    }
    606 |
  > 607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |         ^^^^^^^^^^^^^^^^
    608 |
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |

ERROR in src/TranslationRoom.tsx:607:37
TS2304: Cannot find name 'mediaRecorderRef'.
    605 |     // Stop media recorder    }
    606 |
  > 607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                     ^^^^^^^^^^^^^^^^
    608 |
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |

ERROR in src/TranslationRoom.tsx:609:7
TS2304: Cannot find name 'mediaRecorderRef'.
    607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
    608 |
  > 609 |       mediaRecorderRef.current.stop();    // Stop animation frame
        |       ^^^^^^^^^^^^^^^^
    610 |
    611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
    612 |

ERROR in src/TranslationRoom.tsx:611:7
TS2304: Cannot find name 'mediaRecorderRef'.
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |
  > 611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
        |       ^^^^^^^^^^^^^^^^
    612 |
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |

ERROR in src/TranslationRoom.tsx:611:47
TS2304: Cannot find name 'animationFrameRef'.
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |
  > 611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
        |                                               ^^^^^^^^^^^^^^^^^
    612 |
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |

ERROR in src/TranslationRoom.tsx:613:33
TS2304: Cannot find name 'animationFrameRef'.
    611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
    612 |
  > 613 |     }      cancelAnimationFrame(animationFrameRef.current);
        |                                 ^^^^^^^^^^^^^^^^^
    614 |
    615 |       animationFrameRef.current = null;
    616 |

ERROR in src/TranslationRoom.tsx:615:7
TS2304: Cannot find name 'animationFrameRef'.
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |
  > 615 |       animationFrameRef.current = null;
        |       ^^^^^^^^^^^^^^^^^
    616 |
    617 |     // Stop animation frame    }
    618 |

ERROR in src/TranslationRoom.tsx:619:9
TS2304: Cannot find name 'animationFrameRef'.
    617 |     // Stop animation frame    }
    618 |
  > 619 |     if (animationFrameRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    620 |
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |

ERROR in src/TranslationRoom.tsx:621:28
TS2304: Cannot find name 'animationFrameRef'.
    619 |     if (animationFrameRef.current) {
    620 |
  > 621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
        |                            ^^^^^^^^^^^^^^^^^
    622 |
    623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
    624 |

ERROR in src/TranslationRoom.tsx:623:7
TS2304: Cannot find name 'animationFrameRef'.
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |
  > 623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
        |       ^^^^^^^^^^^^^^^^^
    624 |
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |

ERROR in src/TranslationRoom.tsx:623:48
TS2304: Cannot find name 'audioStreamRef'.
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |
  > 623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
        |                                                ^^^^^^^^^^^^^^
    624 |
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |

ERROR in src/TranslationRoom.tsx:625:12
TS2304: Cannot find name 'audioStreamRef'.
    623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
    624 |
  > 625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |            ^^^^^^^^^^^^^^
    626 |
    627 |       audioStreamRef.current = null;
    628 |

ERROR in src/TranslationRoom.tsx:627:7
TS2304: Cannot find name 'audioStreamRef'.
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |
  > 627 |       audioStreamRef.current = null;
        |       ^^^^^^^^^^^^^^
    628 |
    629 |     // Stop all tracks    }
    630 |

ERROR in src/TranslationRoom.tsx:631:9
TS2304: Cannot find name 'audioStreamRef'.
    629 |     // Stop all tracks    }
    630 |
  > 631 |     if (audioStreamRef.current) {
        |         ^^^^^^^^^^^^^^
    632 |
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |

ERROR in src/TranslationRoom.tsx:633:7
TS2304: Cannot find name 'audioStreamRef'.
    631 |     if (audioStreamRef.current) {
    632 |
  > 633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
        |       ^^^^^^^^^^^^^^
    634 |
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |

ERROR in src/TranslationRoom.tsx:633:101
TS2304: Cannot find name 'combinedStreamRef'.
    631 |     if (audioStreamRef.current) {
    632 |
  > 633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
        |                                                                                                     ^^^^^^^^^^^^^^^^^
    634 |
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |

ERROR in src/TranslationRoom.tsx:635:7
TS2304: Cannot find name 'audioStreamRef'.
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |
  > 635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |       ^^^^^^^^^^^^^^
    636 |
    637 |     }      combinedStreamRef.current = null;
    638 |

ERROR in src/TranslationRoom.tsx:635:43
TS2304: Cannot find name 'combinedStreamRef'.
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |
  > 635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |                                           ^^^^^^^^^^^^^^^^^
    636 |
    637 |     }      combinedStreamRef.current = null;
    638 |

ERROR in src/TranslationRoom.tsx:637:12
TS2304: Cannot find name 'combinedStreamRef'.
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |
  > 637 |     }      combinedStreamRef.current = null;
        |            ^^^^^^^^^^^^^^^^^
    638 |
    639 |     }
    640 |

ERROR in src/TranslationRoom.tsx:641:9
TS2304: Cannot find name 'combinedStreamRef'.
    639 |     }
    640 |
  > 641 |     if (combinedStreamRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    642 |
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |

ERROR in src/TranslationRoom.tsx:643:7
TS2304: Cannot find name 'combinedStreamRef'.
    641 |     if (combinedStreamRef.current) {
    642 |
  > 643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
        |       ^^^^^^^^^^^^^^^^^
    644 |
    645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
    646 |

ERROR in src/TranslationRoom.tsx:645:7
TS2304: Cannot find name 'combinedStreamRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |       ^^^^^^^^^^^^^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:645:48
TS2304: Cannot find name 'wsRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |                                                ^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:645:65
TS2304: Cannot find name 'wsRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |                                                                 ^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:647:12
TS2304: Cannot find name 'wsRef'.
    645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
    646 |
  > 647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
        |            ^^^^^
    648 |
    649 |       wsRef.current.close();
    650 |

ERROR in src/TranslationRoom.tsx:649:7
TS2304: Cannot find name 'wsRef'.
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |
  > 649 |       wsRef.current.close();
        |       ^^^^^
    650 |
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |

ERROR in src/TranslationRoom.tsx:653:9
TS2304: Cannot find name 'wsRef'.
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |
  > 653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
        |         ^^^^^
    654 |
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |

ERROR in src/TranslationRoom.tsx:653:26
TS2304: Cannot find name 'wsRef'.
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |
  > 653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
        |                          ^^^^^
    654 |
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |

ERROR in src/TranslationRoom.tsx:655:7
TS2304: Cannot find name 'wsRef'.
    653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
    654 |
  > 655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
        |       ^^^^^
    656 |
    657 |       wsRef.current.close();    // Clear output video
    658 |

ERROR in src/TranslationRoom.tsx:657:7
TS2304: Cannot find name 'wsRef'.
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |
  > 657 |       wsRef.current.close();    // Clear output video
        |       ^^^^^
    658 |
    659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
    660 |

ERROR in src/TranslationRoom.tsx:659:7
TS2304: Cannot find name 'wsRef'.
    657 |       wsRef.current.close();    // Clear output video
    658 |
  > 659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
        |       ^^^^^
    660 |
    661 |     }    if (outputVideo) {
    662 |

ERROR in src/TranslationRoom.tsx:659:52
TS2304: Cannot find name 'outputVideoRef'.
    657 |       wsRef.current.close();    // Clear output video
    658 |
  > 659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
        |                                                    ^^^^^^^^^^^^^^
    660 |
    661 |     }    if (outputVideo) {
    662 |

ERROR in src/TranslationRoom.tsx:663:7
TS2448: Block-scoped variable 'outputVideo' used before its declaration.
    661 |     }    if (outputVideo) {
    662 |
  > 663 |       outputVideo.pause();
        |       ^^^^^^^^^^^
    664 |
    665 |     // Clear output video      outputVideo.src = '';
    666 |

ERROR in src/TranslationRoom.tsx:667:25
TS2304: Cannot find name 'outputVideoRef'.
    665 |     // Clear output video      outputVideo.src = '';
    666 |
  > 667 |     const outputVideo = outputVideoRef.current;    }
        |                         ^^^^^^^^^^^^^^
    668 |
    669 |     if (outputVideo) {
    670 |

ERROR in src/TranslationRoom.tsx:673:36
TS2304: Cannot find name 'outputHlsRef'.
    671 |       outputVideo.pause();    // Stop HLS if it's running
    672 |
  > 673 |       outputVideo.src = '';    if (outputHlsRef.current) {
        |                                    ^^^^^^^^^^^^
    674 |
    675 |     }      outputHlsRef.current.destroy();
    676 |

ERROR in src/TranslationRoom.tsx:675:12
TS2304: Cannot find name 'outputHlsRef'.
    673 |       outputVideo.src = '';    if (outputHlsRef.current) {
    674 |
  > 675 |     }      outputHlsRef.current.destroy();
        |            ^^^^^^^^^^^^
    676 |
    677 |       outputHlsRef.current = null;
    678 |

ERROR in src/TranslationRoom.tsx:677:7
TS2304: Cannot find name 'outputHlsRef'.
    675 |     }      outputHlsRef.current.destroy();
    676 |
  > 677 |       outputHlsRef.current = null;
        |       ^^^^^^^^^^^^
    678 |
    679 |     // Stop HLS if it's running    }
    680 |

ERROR in src/TranslationRoom.tsx:681:9
TS2304: Cannot find name 'outputHlsRef'.
    679 |     // Stop HLS if it's running    }
    680 |
  > 681 |     if (outputHlsRef.current) {
        |         ^^^^^^^^^^^^
    682 |
    683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
    684 |

ERROR in src/TranslationRoom.tsx:683:7
TS2304: Cannot find name 'outputHlsRef'.
    681 |     if (outputHlsRef.current) {
    682 |
  > 683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
        |       ^^^^^^^^^^^^
    684 |
    685 |       outputHlsRef.current = null;  };
    686 |

ERROR in src/TranslationRoom.tsx:683:42
TS2304: Cannot find name 'setIsTranslating'.
    681 |     if (outputHlsRef.current) {
    682 |
  > 683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
        |                                          ^^^^^^^^^^^^^^^^
    684 |
    685 |       outputHlsRef.current = null;  };
    686 |

ERROR in src/TranslationRoom.tsx:685:7
TS2304: Cannot find name 'outputHlsRef'.
    683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
    684 |
  > 685 |       outputHlsRef.current = null;  };
        |       ^^^^^^^^^^^^
    686 |
    687 |     }
    688 |

ERROR in src/TranslationRoom.tsx:689:41
TS2304: Cannot find name 'languages'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                         ^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:54
TS2304: Cannot find name 'languages'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                      ^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:69
TS7006: Parameter 'l' implicitly has an 'any' type.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                     ^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:86
TS2304: Cannot find name 'selectedLanguage'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                                      ^^^^^^^^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:691:5
TS2304: Cannot find name 'setIsTranslating'.
    689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
    690 |
  > 691 |     setIsTranslating(false);
        |     ^^^^^^^^^^^^^^^^
    692 |
    693 |     setStreamStatus('Stopped');  if (!inSession) {
    694 |

ERROR in src/TranslationRoom.tsx:693:5
TS2304: Cannot find name 'setStreamStatus'.
    691 |     setIsTranslating(false);
    692 |
  > 693 |     setStreamStatus('Stopped');  if (!inSession) {
        |     ^^^^^^^^^^^^^^^
    694 |
    695 |   };    return (
    696 |

ERROR in src/TranslationRoom.tsx:693:39
TS2304: Cannot find name 'inSession'.
    691 |     setIsTranslating(false);
    692 |
  > 693 |     setStreamStatus('Stopped');  if (!inSession) {
        |                                       ^^^^^^^^^
    694 |
    695 |   };    return (
    696 |

ERROR in src/TranslationRoom.tsx:699:72
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    697 |       <div className="translation-container">
    698 |
  > 699 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;        <div className="translation-setup">
        |                                                                        ^
    700 |
    701 |           <h1>🌐 Translation Room</h1>
    702 |

ERROR in src/TranslationRoom.tsx:705:5
TS1005: '}' expected.
    703 |   if (!inSession) {          <p className="subtitle">Select a language and start translating live video content</p>
    704 |
  > 705 |     return (
        |     ^^^^^^
    706 |
    707 |       <div className="translation-container">          {loading ? (
    708 |

ERROR in src/TranslationRoom.tsx:707:57
TS2304: Cannot find name 'loading'.
    705 |     return (
    706 |
  > 707 |       <div className="translation-container">          {loading ? (
        |                                                         ^^^^^^^
    708 |
    709 |         <div className="translation-setup">            <div className="loading">Loading languages...</div>
    710 |

ERROR in src/TranslationRoom.tsx:713:133
TS2304: Cannot find name 'error'.
    711 |           <h1>🌐 Translation Room</h1>          ) : error ? (
    712 |
  > 713 |           <p className="subtitle">Select a language and start translating live video content</p>            <div className="error">{error}</div>
        |                                                                                                                                     ^^^^^
    714 |
    715 |           ) : (
    716 |

ERROR in src/TranslationRoom.tsx:717:12
TS2304: Cannot find name 'loading'.
    715 |           ) : (
    716 |
  > 717 |           {loading ? (            <div className="setup-form">
        |            ^^^^^^^
    718 |
    719 |             <div className="loading">Loading languages...</div>              <div className="form-group">
    720 |

ERROR in src/TranslationRoom.tsx:723:37
TS2304: Cannot find name 'error'.
    721 |           ) : error ? (                <label htmlFor="translatorName">Your Name</label>
    722 |
  > 723 |             <div className="error">{error}</div>                <input
        |                                     ^^^^^
    724 |
    725 |           ) : (                  id="translatorName"
    726 |

ERROR in src/TranslationRoom.tsx:725:11
TS1003: Identifier expected.
    723 |             <div className="error">{error}</div>                <input
    724 |
  > 725 |           ) : (                  id="translatorName"
        |           ^
    726 |
    727 |             <div className="setup-form">                  type="text"
    728 |

ERROR in src/TranslationRoom.tsx:731:91
TS2304: Cannot find name 'translatorName'.
    729 |               <div className="form-group">                  placeholder="Enter your name"
    730 |
  > 731 |                 <label htmlFor="translatorName">Your Name</label>                  value={translatorName}
        |                                                                                           ^^^^^^^^^^^^^^
    732 |
    733 |                 <input                  onChange={(e) => setTranslatorName(e.target.value)}
    734 |

ERROR in src/TranslationRoom.tsx:733:58
TS2304: Cannot find name 'setTranslatorName'.
    731 |                 <label htmlFor="translatorName">Your Name</label>                  value={translatorName}
    732 |
  > 733 |                 <input                  onChange={(e) => setTranslatorName(e.target.value)}
        |                                                          ^^^^^^^^^^^^^^^^^
    734 |
    735 |                   id="translatorName"                  className="translator-input"
    736 |

ERROR in src/TranslationRoom.tsx:741:26
TS2304: Cannot find name 'translatorName'.
    739 |                   placeholder="Enter your name"              </div>
    740 |
  > 741 |                   value={translatorName}
        |                          ^^^^^^^^^^^^^^
    742 |
    743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
    744 |

ERROR in src/TranslationRoom.tsx:743:30
TS7006: Parameter 'e' implicitly has an 'any' type.
    741 |                   value={translatorName}
    742 |
  > 743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
        |                              ^
    744 |
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |

ERROR in src/TranslationRoom.tsx:743:36
TS2304: Cannot find name 'setTranslatorName'.
    741 |                   value={translatorName}
    742 |
  > 743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
        |                                    ^^^^^^^^^^^^^^^^^
    744 |
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |

ERROR in src/TranslationRoom.tsx:747:18
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |
  > 747 |                 />                <select
        |                  ^
    748 |
    749 |               </div>                  id="language"
    750 |

ERROR in src/TranslationRoom.tsx:749:15
TS1003: Identifier expected.
    747 |                 />                <select
    748 |
  > 749 |               </div>                  id="language"
        |               ^^
    750 |
    751 |                   value={selectedLanguage}
    752 |

ERROR in src/TranslationRoom.tsx:751:26
TS2304: Cannot find name 'selectedLanguage'.
    749 |               </div>                  id="language"
    750 |
  > 751 |                   value={selectedLanguage}
        |                          ^^^^^^^^^^^^^^^^
    752 |
    753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
    754 |

ERROR in src/TranslationRoom.tsx:753:16
TS2746: This JSX tag's 'children' prop expects a single child of type 'ReactNode', but multiple children were provided.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                ^^^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:753:72
TS7006: Parameter 'e' implicitly has an 'any' type.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                                                                        ^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:753:78
TS2304: Cannot find name 'setSelectedLanguage'.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                                                                              ^^^^^^^^^^^^^^^^^^^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:761:26
TS2304: Cannot find name 'selectedLanguage'.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                          ^^^^^^^^^^^^^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:761:62
TS2304: Cannot find name 'languages'.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                                                              ^^^^^^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:761:77
TS7006: Parameter 'lang' implicitly has an 'any' type.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                                                                             ^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:763:19
TS2304: Cannot find name 'onChange'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                   ^^^^^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:28
TS2349: This expression is not callable.
  Type '{}' has no call signatures.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                            ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:29
TS1136: Property assignment expected.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                             ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:30
TS2304: Cannot find name 'e'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                              ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:33
TS1005: ')' expected.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                 ^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:34
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                  ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:71
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                       ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:105
TS2304: Cannot find name 'lang'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                                                         ^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:124
TS2304: Cannot find name 'lang'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                                                                            ^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:765:69
TS2304: Cannot find name 'lang'.
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |
  > 765 |                   className="language-select"                      {lang.label}
        |                                                                     ^^^^
    766 |
    767 |                 >                    </option>
    768 |

ERROR in src/TranslationRoom.tsx:767:17
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    765 |                   className="language-select"                      {lang.label}
    766 |
  > 767 |                 >                    </option>
        |                 ^
    768 |
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |

ERROR in src/TranslationRoom.tsx:769:88
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    767 |                 >                    </option>
    768 |
  > 769 |                   <option value="">-- Select a language --</option>                  ))}
        |                                                                                        ^
    770 |
    771 |                   {languages.map((lang) => (                </select>
    772 |

ERROR in src/TranslationRoom.tsx:771:20
TS2304: Cannot find name 'languages'.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                    ^^^^^^^^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:771:35
TS7006: Parameter 'lang' implicitly has an 'any' type.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                                   ^^^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:771:61
TS1109: Expression expected.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                                                             ^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:773:22
TS17008: JSX element 'option' has no corresponding closing tag.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                      ^^^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:773:34
TS2304: Cannot find name 'lang'.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                                  ^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:773:53
TS2304: Cannot find name 'lang'.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                                                     ^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:775:24
TS2304: Cannot find name 'lang'.
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |
  > 775 |                       {lang.label}
        |                        ^^^^
    776 |
    777 |                     </option>              <button
    778 |

ERROR in src/TranslationRoom.tsx:777:23
TS17002: Expected corresponding JSX closing tag for 'div'.
    775 |                       {lang.label}
    776 |
  > 777 |                     </option>              <button
        |                       ^^^^^^
    778 |
    779 |                   ))}                className="join-translation-btn"
    780 |

ERROR in src/TranslationRoom.tsx:779:19
TS1003: Identifier expected.
    777 |                     </option>              <button
    778 |
  > 779 |                   ))}                className="join-translation-btn"
        |                   ^
    780 |
    781 |                 </select>                onClick={handleJoinSession}
    782 |

ERROR in src/TranslationRoom.tsx:779:21
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    777 |                     </option>              <button
    778 |
  > 779 |                   ))}                className="join-translation-btn"
        |                     ^
    780 |
    781 |                 </select>                onClick={handleJoinSession}
    782 |

ERROR in src/TranslationRoom.tsx:781:19
TS17002: Expected corresponding JSX closing tag for 'div'.
    779 |                   ))}                className="join-translation-btn"
    780 |
  > 781 |                 </select>                onClick={handleJoinSession}
        |                   ^^^^^^
    782 |
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |

ERROR in src/TranslationRoom.tsx:781:51
TS2304: Cannot find name 'handleJoinSession'.
    779 |                   ))}                className="join-translation-btn"
    780 |
  > 781 |                 </select>                onClick={handleJoinSession}
        |                                                   ^^^^^^^^^^^^^^^^^
    782 |
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |

ERROR in src/TranslationRoom.tsx:783:37
TS1005: ')' expected.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                     ^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:783:48
TS2304: Cannot find name 'selectedLanguage'.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                                ^^^^^^^^^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:783:69
TS2304: Cannot find name 'translatorName'.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                                                     ^^^^^^^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:785:15
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |
  > 785 |               >
        |               ^
    786 |
    787 |               <button                Join Translation Room
    788 |

ERROR in src/TranslationRoom.tsx:787:38
TS2322: Type '{ Join: true; Translation: true; Room: true; className: string; }' is not assignable to type 'DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>'.
  Property 'Join' does not exist on type 'DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>'.
    785 |               >
    786 |
  > 787 |               <button                Join Translation Room
        |                                      ^^^^
    788 |
    789 |                 className="join-translation-btn"              </button>
    790 |

ERROR in src/TranslationRoom.tsx:789:63
TS1003: Identifier expected.
    787 |               <button                Join Translation Room
    788 |
  > 789 |                 className="join-translation-btn"              </button>
        |                                                               ^^
    790 |
    791 |                 onClick={handleJoinSession}            </div>
    792 |

ERROR in src/TranslationRoom.tsx:789:65
TS17002: Expected corresponding JSX closing tag for 'div'.
    787 |               <button                Join Translation Room
    788 |
  > 789 |                 className="join-translation-btn"              </button>
        |                                                                 ^^^^^^
    790 |
    791 |                 onClick={handleJoinSession}            </div>
    792 |

ERROR in src/TranslationRoom.tsx:791:17
TS1005: ')' expected.
    789 |                 className="join-translation-btn"              </button>
    790 |
  > 791 |                 onClick={handleJoinSession}            </div>
        |                 ^^^^^^^
    792 |
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |

ERROR in src/TranslationRoom.tsx:791:26
TS2304: Cannot find name 'handleJoinSession'.
    789 |                 className="join-translation-btn"              </button>
    790 |
  > 791 |                 onClick={handleJoinSession}            </div>
        |                          ^^^^^^^^^^^^^^^^^
    792 |
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |

ERROR in src/TranslationRoom.tsx:793:28
TS2304: Cannot find name 'selectedLanguage'.
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                            ^^^^^^^^^^^^^^^^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:793:49
TS2304: Cannot find name 'translatorName'.
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                                                 ^^^^^^^^^^^^^^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:793:82
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                                                                                  ^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:795:15
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |
  > 795 |               >        </div>
        |               ^
    796 |
    797 |                 Join Translation Room      </div>
    798 |

ERROR in src/TranslationRoom.tsx:799:15
TS1005: ')' expected.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |               ^^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:799:17
TS2304: Cannot find name 'button'.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |                 ^^^^^^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:799:28
TS1109: Expression expected.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |                            ^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:801:13
TS1128: Declaration or statement expected.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |             ^^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:801:15
TS2304: Cannot find name 'div'.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |               ^^^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:801:21
TS1109: Expression expected.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |                     ^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:803:11
TS1128: Declaration or statement expected.
    801 |             </div>  }
    802 |
  > 803 |           )}
        |           ^
    804 |
    805 |         </div>  return (
    806 |

ERROR in src/TranslationRoom.tsx:803:12
TS1128: Declaration or statement expected.
    801 |             </div>  }
    802 |
  > 803 |           )}
        |            ^
    804 |
    805 |         </div>  return (
    806 |

ERROR in src/TranslationRoom.tsx:805:9
TS1128: Declaration or statement expected.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |         ^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:805:11
TS2304: Cannot find name 'div'.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |           ^^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:805:17
TS1109: Expression expected.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |                 ^^^^^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:807:7
TS1109: Expression expected.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |       ^^
    808 |
    809 |     );      <header className="session-header">
    810 |

ERROR in src/TranslationRoom.tsx:807:9
TS2304: Cannot find name 'div'.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |         ^^^
    808 |
    809 |     );      <header className="session-header">
    810 |

ERROR in src/TranslationRoom.tsx:807:17
TS2657: JSX expressions must have one parent element.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  > 808 |
        | ^
  > 809 |     );      <header className="session-header">
        | ^
  > 810 |
        | ^
  > 811 |   }        <div className="header-info">
        | ^
  > 812 |
        | ^
  > 813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
        | ^
  > 814 |
        | ^
  > 815 |   return (          <span className="translator-badge">{translatorName}</span>
        | ^
  > 816 |
        | ^
  > 817 |     <div className="translation-session">        </div>
        | ^
  > 818 |
        | ^
  > 819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
        | ^
  > 820 |
        | ^
  > 821 |         <div className="header-info">          ← Leave Session
        | ^
  > 822 |
        | ^
  > 823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
        | ^
  > 824 |
        | ^
  > 825 |           <span className="translator-badge">{translatorName}</span>      </header>
        | ^
  > 826 |
        | ^
  > 827 |         </div>
        | ^
  > 828 |
        | ^
  > 829 |         <button className="leave-session-btn" onClick={handleLeaveSession}>      <div className="video-grid">
        | ^
  > 830 |
        | ^
  > 831 |           ← Leave Session        <div className="video-panel">
        | ^
  > 832 |
        | ^
  > 833 |         </button>          <div className="panel-header">
        | ^
  > 834 |
        | ^
  > 835 |       </header>            <h3>📺 Source Video</h3>
        | ^
  > 836 |
        | ^
  > 837 |             <span className="status-badge source">Live</span>
        | ^
  > 838 |
        | ^
  > 839 |       <div className="video-grid">          </div>
        | ^
  > 840 |
        | ^
  > 841 |         <div className="video-panel">          <div className="video-wrapper">
        | ^
  > 842 |
        | ^
  > 843 |           <div className="panel-header">            <video
        | ^
  > 844 |
        | ^
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        | ^
  > 846 |
        | ^
  > 847 |             <span className="status-badge source">Live</span>              className="translation-video"
        | ^
  > 848 |
        | ^
  > 849 |           </div>              controls
        | ^
  > 850 |
        | ^
  > 851 |           <div className="video-wrapper">              muted
        | ^
  > 852 |
        | ^
  > 853 |             <video              playsInline
        | ^
  > 854 |
        | ^
  > 855 |               ref={sourceVideoRef}            />
        | ^
  > 856 |
        | ^
  > 857 |               className="translation-video"          </div>
        | ^
  > 858 |
        | ^
  > 859 |               controls        </div>
        | ^
  > 860 |
        | ^
  > 861 |               muted
        | ^
  > 862 |
        | ^
  > 863 |               playsInline        <div className="video-panel">
        | ^
  > 864 |
        | ^
  > 865 |             />          <div className="panel-header">
        | ^
  > 866 |
        | ^
  > 867 |           </div>            <h3>🎙️ Translation Output</h3>
        | ^
  > 868 |
        | ^
  > 869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
        | ^
  > 870 |
        | ^
  > 871 |               {isTranslating ? 'Streaming' : 'Waiting'}
        | ^
  > 872 |
        | ^
  > 873 |         <div className="video-panel">            </span>
        | ^
  > 874 |
        | ^
  > 875 |           <div className="panel-header">          </div>
        | ^
  > 876 |
        | ^
  > 877 |             <h3>🎙️ Translation Output</h3>          <div className="video-wrapper">
        | ^
  > 878 |
        | ^
  > 879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
        | ^
  > 880 |
        | ^
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        | ^
  > 882 |
        | ^
  > 883 |             </span>              className="translation-video"
        | ^
  > 884 |
        | ^
  > 885 |           </div>              controls
        | ^
  > 886 |
        | ^
  > 887 |           <div className="video-wrapper">              playsInline
        | ^
  > 888 |
        | ^
  > 889 |             <video            />
        | ^
  > 890 |
        | ^
  > 891 |               ref={outputVideoRef}          </div>
        | ^
  > 892 |
        | ^
  > 893 |               className="translation-video"        </div>
        | ^
  > 894 |
        | ^
  > 895 |               controls      </div>
        | ^
  > 896 |
        | ^
  > 897 |               playsInline
        | ^
  > 898 |
        | ^
  > 899 |             />      <div className="control-panel">
        | ^
  > 900 |
        | ^
  > 901 |           </div>        <div className="stream-info">
        | ^
  > 902 |
        | ^
  > 903 |         </div>          <div className="info-item">
        | ^
  > 904 |
        | ^
  > 905 |       </div>            <strong>RTMP Server:</strong> {RTMP_SERVER}
        | ^
  > 906 |
        | ^
  > 907 |           </div>
        | ^
  > 908 |
        | ^
  > 909 |       <div className="control-panel">          <div className="info-item">
        | ^
  > 910 |
        | ^
  > 911 |         <div className="stream-info">            <strong>Stream Key:</strong> {selectedLanguage}
        | ^
  > 912 |
        | ^
  > 913 |           <div className="info-item">          </div>
        | ^
  > 914 |
        | ^
  > 915 |             <strong>RTMP Server:</strong> {RTMP_SERVER}          <div className="info-item">
        | ^
  > 916 |
        | ^
  > 917 |           </div>            <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8
        | ^
  > 918 |
        | ^
  > 919 |           <div className="info-item">          </div>
        | ^
  > 920 |
        | ^
  > 921 |             <strong>Stream Key:</strong> {selectedLanguage}        </div>
        | ^
  > 922 |
        | ^
  > 923 |           </div>
        | ^
  > 924 |
        | ^
  > 925 |           <div className="info-item">        <div className="control-buttons">
        | ^
  > 926 |
        | ^
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        | ^
  > 928 |
        | ^
  > 929 |           </div>            <button className="start-btn" onClick={startTranslation}>
        | ^
  > 930 |
        | ^
  > 931 |           {streamStatus && (              🎙️ Start Translating
        | ^
  > 932 |
        | ^
  > 933 |             <div className="info-item status-info">            </button>
        | ^
  > 934 |
        | ^
  > 935 |               <strong>Status:</strong> {streamStatus}          ) : (
        | ^
  > 936 |
        | ^
  > 937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
        | ^
  > 938 |
        | ^
  > 939 |           )}              ⏹️ Stop Streaming
        | ^
  > 940 |
        | ^
  > 941 |         </div>            </button>
        | ^^^^^^^^^^^^^^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:809:14
TS17008: JSX element 'header' has no corresponding closing tag.
    807 |       </div>    <div className="translation-session">
    808 |
  > 809 |     );      <header className="session-header">
        |              ^^^^^^
    810 |
    811 |   }        <div className="header-info">
    812 |

ERROR in src/TranslationRoom.tsx:811:3
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    809 |     );      <header className="session-header">
    810 |
  > 811 |   }        <div className="header-info">
        |   ^
    812 |
    813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
    814 |

ERROR in src/TranslationRoom.tsx:813:38
TS2304: Cannot find name 'selectedLangObj'.
    811 |   }        <div className="header-info">
    812 |
  > 813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
        |                                      ^^^^^^^^^^^^^^^
    814 |
    815 |   return (          <span className="translator-badge">{translatorName}</span>
    816 |

ERROR in src/TranslationRoom.tsx:815:57
TS2304: Cannot find name 'translatorName'.
    813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
    814 |
  > 815 |   return (          <span className="translator-badge">{translatorName}</span>
        |                                                         ^^^^^^^^^^^^^^
    816 |
    817 |     <div className="translation-session">        </div>
    818 |

ERROR in src/TranslationRoom.tsx:819:97
TS2304: Cannot find name 'handleLeaveSession'.
    817 |     <div className="translation-session">        </div>
    818 |
  > 819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
        |                                                                                                 ^^^^^^^^^^^^^^^^^^
    820 |
    821 |         <div className="header-info">          ← Leave Session
    822 |

ERROR in src/TranslationRoom.tsx:821:10
TS17008: JSX element 'div' has no corresponding closing tag.
    819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
    820 |
  > 821 |         <div className="header-info">          ← Leave Session
        |          ^^^
    822 |
    823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
    824 |

ERROR in src/TranslationRoom.tsx:823:38
TS2304: Cannot find name 'selectedLangObj'.
    821 |         <div className="header-info">          ← Leave Session
    822 |
  > 823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
        |                                      ^^^^^^^^^^^^^^^
    824 |
    825 |           <span className="translator-badge">{translatorName}</span>      </header>
    826 |

ERROR in src/TranslationRoom.tsx:825:47
TS2304: Cannot find name 'translatorName'.
    823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
    824 |
  > 825 |           <span className="translator-badge">{translatorName}</span>      </header>
        |                                               ^^^^^^^^^^^^^^
    826 |
    827 |         </div>
    828 |

ERROR in src/TranslationRoom.tsx:829:56
TS2304: Cannot find name 'handleLeaveSession'.
    827 |         </div>
    828 |
  > 829 |         <button className="leave-session-btn" onClick={handleLeaveSession}>      <div className="video-grid">
        |                                                        ^^^^^^^^^^^^^^^^^^
    830 |
    831 |           ← Leave Session        <div className="video-panel">
    832 |

ERROR in src/TranslationRoom.tsx:833:11
TS17002: Expected corresponding JSX closing tag for 'div'.
    831 |           ← Leave Session        <div className="video-panel">
    832 |
  > 833 |         </button>          <div className="panel-header">
        |           ^^^^^^
    834 |
    835 |       </header>            <h3>📺 Source Video</h3>
    836 |

ERROR in src/TranslationRoom.tsx:835:9
TS17002: Expected corresponding JSX closing tag for 'div'.
    833 |         </button>          <div className="panel-header">
    834 |
  > 835 |       </header>            <h3>📺 Source Video</h3>
        |         ^^^^^^
    836 |
    837 |             <span className="status-badge source">Live</span>
    838 |

ERROR in src/TranslationRoom.tsx:845:14
TS2304: Cannot find name 'h3'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |              ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:14
TS2558: Expected 0 type arguments, but got 1.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |              ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:17
TS1127: Invalid character.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                 ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:34
TS17002: Expected corresponding JSX closing tag for 'div'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                                  ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:56
TS2304: Cannot find name 'sourceVideoRef'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                                                        ^^^^^^^^^^^^^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:855:20
TS2304: Cannot find name 'sourceVideoRef'.
    853 |             <video              playsInline
    854 |
  > 855 |               ref={sourceVideoRef}            />
        |                    ^^^^^^^^^^^^^^
    856 |
    857 |               className="translation-video"          </div>
    858 |

ERROR in src/TranslationRoom.tsx:865:14
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    863 |               playsInline        <div className="video-panel">
    864 |
  > 865 |             />          <div className="panel-header">
        |              ^
    866 |
    867 |           </div>            <h3>🎙️ Translation Output</h3>
    868 |

ERROR in src/TranslationRoom.tsx:869:60
TS2304: Cannot find name 'isTranslating'.
    867 |           </div>            <h3>🎙️ Translation Output</h3>
    868 |
  > 869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
        |                                                            ^^^^^^^^^^^^^
    870 |
    871 |               {isTranslating ? 'Streaming' : 'Waiting'}
    872 |

ERROR in src/TranslationRoom.tsx:871:16
TS2304: Cannot find name 'isTranslating'.
    869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
    870 |
  > 871 |               {isTranslating ? 'Streaming' : 'Waiting'}
        |                ^^^^^^^^^^^^^
    872 |
    873 |         <div className="video-panel">            </span>
    874 |

ERROR in src/TranslationRoom.tsx:873:10
TS17008: JSX element 'div' has no corresponding closing tag.
    871 |               {isTranslating ? 'Streaming' : 'Waiting'}
    872 |
  > 873 |         <div className="video-panel">            </span>
        |          ^^^
    874 |
    875 |           <div className="panel-header">          </div>
    876 |

ERROR in src/TranslationRoom.tsx:879:46
TS2304: Cannot find name 'isTranslating'.
    877 |             <h3>🎙️ Translation Output</h3>          <div className="video-wrapper">
    878 |
  > 879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
        |                                              ^^^^^^^^^^^^^
    880 |
    881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
    882 |

ERROR in src/TranslationRoom.tsx:881:16
TS1005: '...' expected.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:16
TS2304: Cannot find name 'isTranslating'.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:16
TS2698: Spread types may only be created from object types.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:75
TS2304: Cannot find name 'outputVideoRef'.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                                                                           ^^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:883:13
TS1003: Identifier expected.
    881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
    882 |
  > 883 |             </span>              className="translation-video"
        |             ^^
    884 |
    885 |           </div>              controls
    886 |

ERROR in src/TranslationRoom.tsx:891:20
TS2304: Cannot find name 'outputVideoRef'.
    889 |             <video            />
    890 |
  > 891 |               ref={outputVideoRef}          </div>
        |                    ^^^^^^^^^^^^^^
    892 |
    893 |               className="translation-video"        </div>
    894 |

ERROR in src/TranslationRoom.tsx:895:31
TS17002: Expected corresponding JSX closing tag for 'button'.
    893 |               className="translation-video"        </div>
    894 |
  > 895 |               controls      </div>
        |                               ^^^
    896 |
    897 |               playsInline
    898 |

ERROR in src/TranslationRoom.tsx:899:14
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    897 |               playsInline
    898 |
  > 899 |             />      <div className="control-panel">
        |              ^
    900 |
    901 |           </div>        <div className="stream-info">
    902 |

ERROR in src/TranslationRoom.tsx:911:80
TS2304: Cannot find name 'selectedLanguage'.
    909 |       <div className="control-panel">          <div className="info-item">
    910 |
  > 911 |         <div className="stream-info">            <strong>Stream Key:</strong> {selectedLanguage}
        |                                                                                ^^^^^^^^^^^^^^^^
    912 |
    913 |           <div className="info-item">          </div>
    914 |

ERROR in src/TranslationRoom.tsx:917:101
TS2304: Cannot find name 'selectedLanguage'.
    915 |             <strong>RTMP Server:</strong> {RTMP_SERVER}          <div className="info-item">
    916 |
  > 917 |           </div>            <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8
        |                                                                                                     ^^^^^^^^^^^^^^^^
    918 |
    919 |           <div className="info-item">          </div>
    920 |

ERROR in src/TranslationRoom.tsx:921:43
TS2304: Cannot find name 'selectedLanguage'.
    919 |           <div className="info-item">          </div>
    920 |
  > 921 |             <strong>Stream Key:</strong> {selectedLanguage}        </div>
        |                                           ^^^^^^^^^^^^^^^^
    922 |
    923 |           </div>
    924 |

ERROR in src/TranslationRoom.tsx:927:85
TS2304: Cannot find name 'selectedLanguage'.
    925 |           <div className="info-item">        <div className="control-buttons">
    926 |
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        |                                                                                     ^^^^^^^^^^^^^^^^
    928 |
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |

ERROR in src/TranslationRoom.tsx:927:128
TS2304: Cannot find name 'isTranslating'.
    925 |           <div className="info-item">        <div className="control-buttons">
    926 |
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        |                                                                                                                                ^^^^^^^^^^^^^
    928 |
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |

ERROR in src/TranslationRoom.tsx:929:11
TS1109: Expression expected.
    927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
    928 |
  > 929 |           </div>            <button className="start-btn" onClick={startTranslation}>
        |           ^^
    930 |
    931 |           {streamStatus && (              🎙️ Start Translating
    932 |

ERROR in src/TranslationRoom.tsx:931:12
TS2304: Cannot find name 'streamStatus'.
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |
  > 931 |           {streamStatus && (              🎙️ Start Translating
        |            ^^^^^^^^^^^^
    932 |
    933 |             <div className="info-item status-info">            </button>
    934 |

ERROR in src/TranslationRoom.tsx:931:43
TS1127: Invalid character.
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |
  > 931 |           {streamStatus && (              🎙️ Start Translating
        |                                           ^^
    932 |
    933 |             <div className="info-item status-info">            </button>
    934 |

ERROR in src/TranslationRoom.tsx:933:14
TS17008: JSX element 'div' has no corresponding closing tag.
    931 |           {streamStatus && (              🎙️ Start Translating
    932 |
  > 933 |             <div className="info-item status-info">            </button>
        |              ^^^
    934 |
    935 |               <strong>Status:</strong> {streamStatus}          ) : (
    936 |

ERROR in src/TranslationRoom.tsx:935:41
TS2304: Cannot find name 'streamStatus'.
    933 |             <div className="info-item status-info">            </button>
    934 |
  > 935 |               <strong>Status:</strong> {streamStatus}          ) : (
        |                                         ^^^^^^^^^^^^
    936 |
    937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
    938 |

ERROR in src/TranslationRoom.tsx:937:32
TS17008: JSX element 'button' has no corresponding closing tag.
    935 |               <strong>Status:</strong> {streamStatus}          ) : (
    936 |
  > 937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
        |                                ^^^^^^
    938 |
    939 |           )}              ⏹️ Stop Streaming
    940 |

ERROR in src/TranslationRoom.tsx:939:12
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
    938 |
  > 939 |           )}              ⏹️ Stop Streaming
        |            ^
    940 |
    941 |         </div>            </button>
    942 |

ERROR in src/TranslationRoom.tsx:941:27
TS1005: ';' expected.
    939 |           )}              ⏹️ Stop Streaming
    940 |
  > 941 |         </div>            </button>
        |                           ^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:941:29
TS2304: Cannot find name 'button'.
    939 |           )}              ⏹️ Stop Streaming
    940 |
  > 941 |         </div>            </button>
        |                             ^^^^^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:943:11
TS1109: Expression expected.
    941 |         </div>            </button>
    942 |
  > 943 |           )}
        |           ^
    944 |
    945 |         <div className="control-buttons">        </div>
    946 |

ERROR in src/TranslationRoom.tsx:943:12
TS1128: Declaration or statement expected.
    941 |         </div>            </button>
    942 |
  > 943 |           )}
        |            ^
    944 |
    945 |         <div className="control-buttons">        </div>
    946 |

ERROR in src/TranslationRoom.tsx:947:13
TS2304: Cannot find name 'isTranslating'.
    945 |         <div className="control-buttons">        </div>
    946 |
  > 947 |           {!isTranslating ? (
        |             ^^^^^^^^^^^^^
    948 |
    949 |             <button className="start-btn" onClick={startTranslation}>        <div className="rtmp-note">
    950 |

ERROR in src/TranslationRoom.tsx:949:79
TS17008: JSX element 'div' has no corresponding closing tag.
    947 |           {!isTranslating ? (
    948 |
  > 949 |             <button className="start-btn" onClick={startTranslation}>        <div className="rtmp-note">
        |                                                                               ^^^
    950 |
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |

ERROR in src/TranslationRoom.tsx:953:32
TS1005: ')' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                ^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:32
TS2304: Cannot find name 'Consider'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                ^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:41
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                         ^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:41
TS2304: Cannot find name 'using'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                         ^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:47
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                               ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:47
TS2304: Cannot find name 'OBS'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                               ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:51
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                   ^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:51
TS2304: Cannot find name 'Browser'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                   ^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:59
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                           ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:59
TS2304: Cannot find name 'Source'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                           ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:66
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                  ^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:66
TS2304: Cannot find name 'or'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                  ^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:69
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                     ^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:69
TS2304: Cannot find name 'a'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                     ^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:71
TS1435: Unknown keyword or identifier. Did you mean 'string'?
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                       ^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:71
TS2304: Cannot find name 'streaming'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                       ^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:81
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                 ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:81
TS2304: Cannot find name 'server'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                 ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:92
TS1005: '(' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                            ^^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:92
TS2304: Cannot find name 'production'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                            ^^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:103
TS1005: ';' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                                       ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:103
TS2304: Cannot find name 'use'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                                       ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:955:11
TS1003: Identifier expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |           ^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:13
TS1109: Expression expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |             ^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:24
TS1109: Expression expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |                        ^^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:26
TS2304: Cannot find name 'div'.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |                          ^^^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:957:76
TS17002: Expected corresponding JSX closing tag for 'button'.
    955 |           ) : (        </div>
    956 |
  > 957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
        |                                                                            ^^^
    958 |
    959 |               ⏹️ Stop Streaming    </div>
    960 |

ERROR in src/TranslationRoom.tsx:959:15
TS1127: Invalid character.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |               ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:15
TS1128: Declaration or statement expected.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |               ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:16
TS1127: Invalid character.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:18
TS1434: Unexpected keyword or identifier.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                  ^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:18
TS2304: Cannot find name 'Stop'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                  ^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:23
TS1435: Unknown keyword or identifier. Did you mean 'string'?
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                       ^^^^^^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:23
TS2304: Cannot find name 'Streaming'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                       ^^^^^^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:36
TS1128: Declaration or statement expected.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                                    ^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:38
TS2304: Cannot find name 'div'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                                      ^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:961:13
TS1109: Expression expected.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |             ^^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:961:15
TS2304: Cannot find name 'button'.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |               ^^^^^^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:961:24
TS1109: Expression expected.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |                        ^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:963:11
TS1128: Declaration or statement expected.
    961 |             </button>  );
    962 |
  > 963 |           )}};
        |           ^
    964 |
    965 |         </div>
    966 |

ERROR in src/TranslationRoom.tsx:963:13
TS1128: Declaration or statement expected.
    961 |             </button>  );
    962 |
  > 963 |           )}};
        |             ^
    964 |
    965 |         </div>
    966 |

ERROR in src/TranslationRoom.tsx:965:9
TS1128: Declaration or statement expected.
    963 |           )}};
    964 |
  > 965 |         </div>
        |         ^^
    966 |
    967 | export default TranslationRoom;
    968 |

ERROR in src/TranslationRoom.tsx:965:11
TS2304: Cannot find name 'div'.
    963 |           )}};
    964 |
  > 965 |         </div>
        |           ^^^
    966 |
    967 | export default TranslationRoom;
    968 |

ERROR in src/TranslationRoom.tsx:967:1
TS1109: Expression expected.
    965 |         </div>
    966 |
  > 967 | export default TranslationRoom;
        | ^^^^^^
    968 |
    969 |         <div className="rtmp-note">
    970 |           <strong>How it works:</strong> Your microphone audio is combined with the source video and streamed to the RTMP server via a WebSocket bridge. 

ERROR in src/TranslationRoom.tsx:967:16
TS2528: A module cannot have multiple default exports.
    965 |         </div>
    966 |
  > 967 | export default TranslationRoom;
        |                ^^^^^^^^^^^^^^^
    968 |
    969 |         <div className="rtmp-note">
    970 |           <strong>How it works:</strong> Your microphone audio is combined with the source video and streamed to the RTMP server via a WebSocket bridge. 

ERROR in src/TranslationRoom.tsx:973:7
TS1128: Declaration or statement expected.
    971 |           Viewers can watch at the output URL above.
    972 |         </div>
  > 973 |       </div>
        |       ^^
    974 |     </div>
    975 |   );
    976 | };

ERROR in src/TranslationRoom.tsx:973:9
TS2304: Cannot find name 'div'.
    971 |           Viewers can watch at the output URL above.
    972 |         </div>
  > 973 |       </div>
        |         ^^^
    974 |     </div>
    975 |   );
    976 | };

ERROR in src/TranslationRoom.tsx:974:5
TS1109: Expression expected.
    972 |         </div>
    973 |       </div>
  > 974 |     </div>
        |     ^^
    975 |   );
    976 | };
    977 |

ERROR in src/TranslationRoom.tsx:974:7
TS2304: Cannot find name 'div'.
    972 |         </div>
    973 |       </div>
  > 974 |     </div>
        |       ^^^
    975 |   );
    976 | };
    977 |

ERROR in src/TranslationRoom.tsx:975:3
TS1109: Expression expected.
    973 |       </div>
    974 |     </div>
  > 975 |   );
        |   ^
    976 | };
    977 |
    978 | export default TranslationRoom;

ERROR in src/TranslationRoom.tsx:976:1
TS1128: Declaration or statement expected.
    974 |     </div>
    975 |   );
  > 976 | };
        | ^
    977 |
    978 | export default TranslationRoom;
    979 |

ERROR in src/TranslationRoom.tsx:978:16
TS2528: A module cannot have multiple default exports.
    976 | };
    977 |
  > 978 | export default TranslationRoom;
        |                ^^^^^^^^^^^^^^^
    979 |

Compiling...
Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: Property or signature expected (9:20)
ERROR in ./src/TranslationRoom.tsx
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: /home/tniglobal/public_html/live/server/video-conferencing-frontend/src/TranslationRoom.tsx: Identifier 'React' has already been declared. (1:66)

> 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    |                                                                   ^
  2 |
  3 | import Hls from 'hls.js';import Hls from 'hls.js';
  4 |
    at constructor (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:367:19)
    at TypeScriptParserMixin.raise (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6624:19)
    at TypeScriptScopeHandler.checkRedeclarationInScope (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:1646:19)
    at TypeScriptScopeHandler.declareName (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:1612:12)
    at TypeScriptScopeHandler.declareName (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:4909:11)
    at TypeScriptParserMixin.declareNameFromIdentifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7594:16)
    at TypeScriptParserMixin.checkIdentifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7590:12)
    at TypeScriptParserMixin.checkLVal (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7527:12)
    at TypeScriptParserMixin.finishImportSpecifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14342:10)
    at TypeScriptParserMixin.parseImportSpecifierLocal (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14339:31)
    at TypeScriptParserMixin.maybeParseDefaultImportSpecifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14446:12)
    at TypeScriptParserMixin.parseImportSpecifiersAndAfter (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14315:29)
    at TypeScriptParserMixin.parseImport (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14311:17)
    at TypeScriptParserMixin.parseImport (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9412:26)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12952:27)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseModuleItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12820:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:36)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseProgram (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12698:10)
    at TypeScriptParserMixin.parseTopLevel (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12688:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14568:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10183:18)
    at parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14602:38)
    at parser (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/parser/index.js:41:34)
    at parser.next (<anonymous>)
    at normalizeFile (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37)
    at normalizeFile.next (<anonymous>)
    at run (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/index.js:22:50)
    at run.next (<anonymous>)
    at transform (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transform.js:22:33)
    at transform.next (<anonymous>)
    at step (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:261:32)
    at /home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:273:13
    at async.call.result.err.err (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:223:11)

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 9:20:  Parsing error: Property or signature expected

webpack compiled with 2 errors
ERROR in src/TranslationRoom.tsx
TS2451: Cannot redeclare block-scoped variable '(Missing)'.

ERROR in src/TranslationRoom.tsx
TS7006: Parameter '(Missing)' implicitly has an 'any' type.

ERROR in src/TranslationRoom.tsx
TS7031: Binding element '(Missing)' implicitly has an 'any' type.

ERROR in src/TranslationRoom.tsx:1:8
TS2300: Duplicate identifier 'React'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |        ^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:17
TS2300: Duplicate identifier 'useState'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                 ^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:27
TS2300: Duplicate identifier 'useEffect'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                           ^^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:38
TS2300: Duplicate identifier 'useRef'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                      ^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:67
TS2300: Duplicate identifier 'React'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                   ^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:76
TS2300: Duplicate identifier 'useState'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                            ^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:86
TS2300: Duplicate identifier 'useEffect'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                                      ^^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:97
TS2300: Duplicate identifier 'useRef'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                                                 ^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:3:8
TS2300: Duplicate identifier 'Hls'.
    1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    2 |
  > 3 | import Hls from 'hls.js';import Hls from 'hls.js';
      |        ^^^
    4 |
    5 | import './TranslationRoom.css';import './TranslationRoom.css';
    6 |

ERROR in src/TranslationRoom.tsx:3:33
TS2300: Duplicate identifier 'Hls'.
    1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    2 |
  > 3 | import Hls from 'hls.js';import Hls from 'hls.js';
      |                                 ^^^
    4 |
    5 | import './TranslationRoom.css';import './TranslationRoom.css';
    6 |

ERROR in src/TranslationRoom.tsx:9:21
TS1131: Property or signature expected.
     7 |
     8 |
  >  9 | interface Language {interface Language {
       |                     ^^^^^^^^^
    10 |
    11 |   label: string;  label: string;
    12 |

ERROR in src/TranslationRoom.tsx:11:3
TS2300: Duplicate identifier 'label'.
     9 | interface Language {interface Language {
    10 |
  > 11 |   label: string;  label: string;
       |   ^^^^^
    12 |
    13 |   value: string;  value: string;
    14 |

ERROR in src/TranslationRoom.tsx:11:19
TS2300: Duplicate identifier 'label'.
     9 | interface Language {interface Language {
    10 |
  > 11 |   label: string;  label: string;
       |                   ^^^^^
    12 |
    13 |   value: string;  value: string;
    14 |

ERROR in src/TranslationRoom.tsx:13:3
TS2300: Duplicate identifier 'value'.
    11 |   label: string;  label: string;
    12 |
  > 13 |   value: string;  value: string;
       |   ^^^^^
    14 |
    15 |   code: string;}
    16 |

ERROR in src/TranslationRoom.tsx:13:19
TS2300: Duplicate identifier 'value'.
    11 |   label: string;  label: string;
    12 |
  > 13 |   value: string;  value: string;
       |                   ^^^^^
    14 |
    15 |   code: string;}
    16 |

ERROR in src/TranslationRoom.tsx:17:1
TS1128: Declaration or statement expected.
    15 |   code: string;}
    16 |
  > 17 | }
       | ^
    18 |
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |

ERROR in src/TranslationRoom.tsx:19:7
TS2451: Cannot redeclare block-scoped variable 'SOURCE_VIDEO_URL'.
    17 | }
    18 |
  > 19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
       |       ^^^^^^^^^^^^^^^^
    20 |
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |

ERROR in src/TranslationRoom.tsx:21:7
TS2451: Cannot redeclare block-scoped variable 'SOURCE_VIDEO_URL'.
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |
  > 21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
       |       ^^^^^^^^^^^^^^^^
    22 |
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |

ERROR in src/TranslationRoom.tsx:21:133
TS2451: Cannot redeclare block-scoped variable 'RTMP_SERVER'.
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |
  > 21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
       |                                                                                                                                     ^^^^^^^^^^^
    22 |
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |

ERROR in src/TranslationRoom.tsx:23:7
TS2451: Cannot redeclare block-scoped variable 'RTMP_SERVER'.
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |
  > 23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
       |       ^^^^^^^^^^^
    24 |
    25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
    26 |

ERROR in src/TranslationRoom.tsx:23:78
TS2451: Cannot redeclare block-scoped variable 'BRIDGE_SERVER_URL'.
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |
  > 23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
       |                                                                              ^^^^^^^^^^^^^^^^^
    24 |
    25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
    26 |

ERROR in src/TranslationRoom.tsx:25:7
TS2451: Cannot redeclare block-scoped variable 'BRIDGE_SERVER_URL'.
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |
  > 25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
       |       ^^^^^^^^^^^^^^^^^
    26 |
    27 | // const RTMP_PASSWORD = '244PLK'; // Will be used when implementing RTMP streaming
    28 |

ERROR in src/TranslationRoom.tsx:29:7
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    27 | // const RTMP_PASSWORD = '244PLK'; // Will be used when implementing RTMP streaming
    28 |
  > 29 | const TranslationRoom: React.FC = () => {
       |       ^^^^^^^^^^^^^^^
    30 |
    31 |   const [languages, setLanguages] = useState<Language[]>([]);// Default fallback languages in case API fails
    32 |

ERROR in src/TranslationRoom.tsx:35:3
TS1137: Expression or comma expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |   ^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:79
TS2695: Left side of comma operator is unused and has no side effects.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                               ^^^^^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:90
TS2304: Cannot find name 'value'.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                          ^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:95
TS1005: ';' expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                               ^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:103
TS1128: Declaration or statement expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                                       ^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:37:73
TS2695: Left side of comma operator is unused and has no side effects.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                         ^^^^^^^^^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:84
TS2304: Cannot find name 'value'.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                    ^^^^^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:89
TS1005: ';' expected.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                         ^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:97
TS1128: Declaration or statement expected.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                                 ^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:39:81
TS2695: Left side of comma operator is unused and has no side effects.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                 ^^^^^^^^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:91
TS2304: Cannot find name 'value'.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                           ^^^^^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:96
TS1005: ';' expected.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                                ^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:104
TS1128: Declaration or statement expected.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                                        ^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:41:68
TS2695: Left side of comma operator is unused and has no side effects.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                    ^^^^^^^^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:78
TS2304: Cannot find name 'value'.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                              ^^^^^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:83
TS1005: ';' expected.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                                   ^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:91
TS1128: Declaration or statement expected.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                                           ^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:43:61
TS2695: Left side of comma operator is unused and has no side effects.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                             ^^^^^^^^^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:43:72
TS2304: Cannot find name 'value'.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                                        ^^^^^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:43:77
TS1005: ';' expected.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                                             ^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:45:64
TS1128: Declaration or statement expected.
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |
  > 45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
       |                                                                ^
    46 |
    47 |
    48 |

ERROR in src/TranslationRoom.tsx:49:63
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    47 |
    48 |
  > 49 |   const sourceVideoRef = useRef<HTMLVideoElement>(null);const TranslationRoom: React.FC = () => {
       |                                                               ^^^^^^^^^^^^^^^
    50 |
    51 |   const outputVideoRef = useRef<HTMLVideoElement>(null);  const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
    52 |

ERROR in src/TranslationRoom.tsx:51:9
TS2451: Cannot redeclare block-scoped variable 'outputVideoRef'.
    49 |   const sourceVideoRef = useRef<HTMLVideoElement>(null);const TranslationRoom: React.FC = () => {
    50 |
  > 51 |   const outputVideoRef = useRef<HTMLVideoElement>(null);  const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
       |         ^^^^^^^^^^^^^^
    52 |
    53 |   const mediaRecorderRef = useRef<MediaRecorder | null>(null);  const [selectedLanguage, setSelectedLanguage] = useState<string>('');
    54 |

ERROR in src/TranslationRoom.tsx:59:9
TS2451: Cannot redeclare block-scoped variable 'hlsInstanceRef'.
    57 |   const combinedStreamRef = useRef<MediaStream | null>(null);  const [inSession, setInSession] = useState<boolean>(false);
    58 |
  > 59 |   const hlsInstanceRef = useRef<Hls | null>(null);  const [isTranslating, setIsTranslating] = useState<boolean>(false);
       |         ^^^^^^^^^^^^^^
    60 |
    61 |   const outputHlsRef = useRef<Hls | null>(null);  const [loading, setLoading] = useState<boolean>(true);
    62 |

ERROR in src/TranslationRoom.tsx:61:9
TS2451: Cannot redeclare block-scoped variable 'outputHlsRef'.
    59 |   const hlsInstanceRef = useRef<Hls | null>(null);  const [isTranslating, setIsTranslating] = useState<boolean>(false);
    60 |
  > 61 |   const outputHlsRef = useRef<Hls | null>(null);  const [loading, setLoading] = useState<boolean>(true);
       |         ^^^^^^^^^^^^
    62 |
    63 |   const wsRef = useRef<WebSocket | null>(null);  const [error, setError] = useState<string>('');
    64 |

ERROR in src/TranslationRoom.tsx:69:9
TS2451: Cannot redeclare block-scoped variable 'outputVideoRef'.
    67 |   const animationFrameRef = useRef<number | null>(null);  const sourceVideoRef = useRef<HTMLVideoElement>(null);
    68 |
  > 69 |   const outputVideoRef = useRef<HTMLVideoElement>(null);
       |         ^^^^^^^^^^^^^^
    70 |
    71 |   // Fetch languages on component mount  const mediaRecorderRef = useRef<MediaRecorder | null>(null);
    72 |

ERROR in src/TranslationRoom.tsx:77:18
TS2451: Cannot redeclare block-scoped variable 'hlsInstanceRef'.
    75 |     fetchLanguages();  const combinedStreamRef = useRef<MediaStream | null>(null);
    76 |
  > 77 |   }, []);  const hlsInstanceRef = useRef<Hls | null>(null);
       |                  ^^^^^^^^^^^^^^
    78 |
    79 |   const outputHlsRef = useRef<Hls | null>(null);
    80 |

ERROR in src/TranslationRoom.tsx:79:9
TS2451: Cannot redeclare block-scoped variable 'outputHlsRef'.
    77 |   }, []);  const hlsInstanceRef = useRef<Hls | null>(null);
    78 |
  > 79 |   const outputHlsRef = useRef<Hls | null>(null);
       |         ^^^^^^^^^^^^
    80 |
    81 |   const fetchLanguages = async () => {  const wsRef = useRef<WebSocket | null>(null);
    82 |

ERROR in src/TranslationRoom.tsx:95:70
TS1128: Declaration or statement expected.
    93 |       if (!response.ok) {    fetchLanguages();
    94 |
  > 95 |         throw new Error(`HTTP error! status: ${response.status}`);  }, []);
       |                                                                      ^
    96 |
    97 |       }
    98 |

ERROR in src/TranslationRoom.tsx:95:74
TS1005: ';' expected.
    93 |       if (!response.ok) {    fetchLanguages();
    94 |
  > 95 |         throw new Error(`HTTP error! status: ${response.status}`);  }, []);
       |                                                                          ^
    96 |
    97 |       }
    98 |

ERROR in src/TranslationRoom.tsx:99:9
TS1472: 'catch' or 'finally' expected.
     97 |       }
     98 |
  >  99 |         const fetchLanguages = async () => {
        |         ^^^^^
    100 |
    101 |       const result = await response.json();    try {
    102 |

ERROR in src/TranslationRoom.tsx:101:28
TS2304: Cannot find name 'response'.
     99 |         const fetchLanguages = async () => {
    100 |
  > 101 |       const result = await response.json();    try {
        |                            ^^^^^^^^
    102 |
    103 |             setLoading(true);
    104 |

ERROR in src/TranslationRoom.tsx:107:11
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |           ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:29
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                             ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:58
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                                                          ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:74
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                                                                          ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:109:22
TS2448: Block-scoped variable 'result' used before its declaration.
    107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
    108 |
  > 109 |         setLanguages(result.data);      
        |                      ^^^^^^
    110 |
    111 |         console.log(`Loaded ${result.data.length} languages from API`);      if (!response.ok) {
    112 |

ERROR in src/TranslationRoom.tsx:111:31
TS2448: Block-scoped variable 'result' used before its declaration.
    109 |         setLanguages(result.data);      
    110 |
  > 111 |         console.log(`Loaded ${result.data.length} languages from API`);      if (!response.ok) {
        |                               ^^^^^^
    112 |
    113 |       } else {        throw new Error(`HTTP error! status: ${response.status}`);
    114 |

ERROR in src/TranslationRoom.tsx:115:66
TS2448: Block-scoped variable 'result' used before its declaration.
    113 |       } else {        throw new Error(`HTTP error! status: ${response.status}`);
    114 |
  > 115 |         console.error('API did not return valid language data:', result);      }
        |                                                                  ^^^^^^
    116 |
    117 |         setError('Failed to load languages from API. Please try again.');      
    118 |

ERROR in src/TranslationRoom.tsx:119:35
TS2304: Cannot find name 'response'.
    117 |         setError('Failed to load languages from API. Please try again.');      
    118 |
  > 119 |       }      const result = await response.json();
        |                                   ^^^^^^^^
    120 |
    121 |             
    122 |

ERROR in src/TranslationRoom.tsx:133:14
TS1128: Declaration or statement expected.
    131 |       setLoading(false);        console.log(`Loaded ${result.data.length} languages from API`);
    132 |
  > 133 |     }      } else {
        |              ^^^^
    134 |
    135 |   };        console.error('API did not return valid language data:', result);
    136 |

ERROR in src/TranslationRoom.tsx:145:20
TS1005: 'try' expected.
    143 |       alert('Please select a language and enter your name');      setLoading(false);
    144 |
  > 145 |       return;    } catch (err) {
        |                    ^^^^^
    146 |
    147 |     }      console.error('Error fetching languages:', err);
    148 |

ERROR in src/TranslationRoom.tsx:147:55
TS2304: Cannot find name 'err'.
    145 |       return;    } catch (err) {
    146 |
  > 147 |     }      console.error('Error fetching languages:', err);
        |                                                       ^^^
    148 |
    149 |     setInSession(true);      setError('Failed to load languages from API. Please try again.')
    150 |

ERROR in src/TranslationRoom.tsx:161:10
TS1005: ',' expected.
    159 |       stopTranslation();  const handleJoinSession = () => {
    160 |
  > 161 |     }    if (!selectedLanguage || !translatorName.trim()) {
        |          ^^
    162 |
    163 |     setInSession(false);      alert('Please select a language and enter your name');
    164 |

ERROR in src/TranslationRoom.tsx:187:11
TS2304: Cannot find name 'hlsInstanceRef'.
    185 |     return () => {    setSelectedLanguage('');
    186 |
  > 187 |       if (hlsInstanceRef.current) {    setTranslatorName('');
        |           ^^^^^^^^^^^^^^
    188 |
    189 |         hlsInstanceRef.current.destroy();  };
    190 |

ERROR in src/TranslationRoom.tsx:189:9
TS2304: Cannot find name 'hlsInstanceRef'.
    187 |       if (hlsInstanceRef.current) {    setTranslatorName('');
    188 |
  > 189 |         hlsInstanceRef.current.destroy();  };
        |         ^^^^^^^^^^^^^^
    190 |
    191 |       }
    192 |

ERROR in src/TranslationRoom.tsx:193:11
TS2304: Cannot find name 'outputHlsRef'.
    191 |       }
    192 |
  > 193 |       if (outputHlsRef.current) {  // Initialize source video when entering session
        |           ^^^^^^^^^^^^
    194 |
    195 |         outputHlsRef.current.destroy();  useEffect(() => {
    196 |

ERROR in src/TranslationRoom.tsx:195:9
TS2304: Cannot find name 'outputHlsRef'.
    193 |       if (outputHlsRef.current) {  // Initialize source video when entering session
    194 |
  > 195 |         outputHlsRef.current.destroy();  useEffect(() => {
        |         ^^^^^^^^^^^^
    196 |
    197 |       }    if (inSession && sourceVideoRef.current) {
    198 |

ERROR in src/TranslationRoom.tsx:197:12
TS1005: ',' expected.
    195 |         outputHlsRef.current.destroy();  useEffect(() => {
    196 |
  > 197 |       }    if (inSession && sourceVideoRef.current) {
        |            ^^
    198 |
    199 |     };      initializeSourceVideo();
    200 |

ERROR in src/TranslationRoom.tsx:201:4
TS1128: Declaration or statement expected.
    199 |     };      initializeSourceVideo();
    200 |
  > 201 |   }, [inSession]);    }
        |    ^
    202 |
    203 |
    204 |

ERROR in src/TranslationRoom.tsx:201:17
TS1005: ';' expected.
    199 |     };      initializeSourceVideo();
    200 |
  > 201 |   }, [inSession]);    }
        |                 ^
    202 |
    203 |
    204 |

ERROR in src/TranslationRoom.tsx:205:51
TS2695: Left side of comma operator is unused and has no side effects.
    203 |
    204 |
  > 205 |   const initializeSourceVideo = () => {    return () => {
        |                                                   ^^^^^^^
    206 |
    207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
    208 |

ERROR in src/TranslationRoom.tsx:207:19
TS2304: Cannot find name 'sourceVideoRef'.
    205 |   const initializeSourceVideo = () => {    return () => {
    206 |
  > 207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
        |                   ^^^^^^^^^^^^^^
    208 |
    209 |     if (!video) return;        hlsInstanceRef.current.destroy();
    210 |

ERROR in src/TranslationRoom.tsx:207:52
TS2304: Cannot find name 'hlsInstanceRef'.
    205 |   const initializeSourceVideo = () => {    return () => {
    206 |
  > 207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
        |                                                    ^^^^^^^^^^^^^^
    208 |
    209 |     if (!video) return;        hlsInstanceRef.current.destroy();
    210 |

ERROR in src/TranslationRoom.tsx:209:32
TS2304: Cannot find name 'hlsInstanceRef'.
    207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
    208 |
  > 209 |     if (!video) return;        hlsInstanceRef.current.destroy();
        |                                ^^^^^^^^^^^^^^
    210 |
    211 |       }
    212 |

ERROR in src/TranslationRoom.tsx:213:39
TS2304: Cannot find name 'outputHlsRef'.
    211 |       }
    212 |
  > 213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
        |                                       ^^^^^^^^^^^^
    214 |
    215 |       const hls = new Hls({        outputHlsRef.current.destroy();
    216 |

ERROR in src/TranslationRoom.tsx:215:36
TS18004: No value exists in scope for the shorthand property 'outputHlsRef'. Either declare one or provide an initializer.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                    ^^^^^^^^^^^^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:215:48
TS1005: ',' expected.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                                ^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:215:66
TS1005: ',' expected.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                                                  ^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:219:9
TS1005: ',' expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:9
TS2304: Cannot find name 'lowLatencyMode'.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:9
TS2554: Expected 0-1 arguments, but got 3.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:23
TS1005: ',' expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |                       ^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:34
TS1135: Argument expression expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |                                  ^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:221:8
TS1128: Declaration or statement expected.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |        ^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:221:16
TS2304: Cannot find name 'inSession'.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |                ^^^^^^^^^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:221:26
TS1005: ';' expected.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |                          ^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:223:7
TS2304: Cannot find name 'hls'.
    221 |       });  }, [inSession]);
    222 |
  > 223 |       hls.loadSource(SOURCE_VIDEO_URL);
        |       ^^^
    224 |
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |

ERROR in src/TranslationRoom.tsx:225:7
TS2304: Cannot find name 'hls'.
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |
  > 225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
        |       ^^^
    226 |
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |

ERROR in src/TranslationRoom.tsx:225:23
TS2304: Cannot find name 'video'.
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |
  > 225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
        |                       ^^^^^
    226 |
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |

ERROR in src/TranslationRoom.tsx:227:7
TS2304: Cannot find name 'hls'.
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |
  > 227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
        |       ^^^
    228 |
    229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
    230 |

ERROR in src/TranslationRoom.tsx:227:67
TS2304: Cannot find name 'sourceVideoRef'.
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |
  > 227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
        |                                                                   ^^^^^^^^^^^^^^
    228 |
    229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
    230 |

ERROR in src/TranslationRoom.tsx:229:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |
  > 229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
        |                            ^
    230 |
    231 |       });
    232 |

ERROR in src/TranslationRoom.tsx:233:7
TS2304: Cannot find name 'hlsInstanceRef'.
    231 |       });
    232 |
  > 233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
        |       ^^^^^^^^^^^^^^
    234 |
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |

ERROR in src/TranslationRoom.tsx:233:32
TS2304: Cannot find name 'hls'.
    231 |       });
    232 |
  > 233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
        |                                ^^^
    234 |
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |

ERROR in src/TranslationRoom.tsx:235:16
TS2304: Cannot find name 'video'.
    233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
    234 |
  > 235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
        |                ^^^^^
    236 |
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |

ERROR in src/TranslationRoom.tsx:237:7
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |       ^^^^^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:7
TS2345: Argument of type '{ video: any; "": any; enableWorker: true; }' is not assignable to parameter of type 'Partial<HlsConfig>'.
  Object literal may only specify known properties, and 'video' does not exist in type 'Partial<HlsConfig>'.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |       ^^^^^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:12
TS1005: ',' expected.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |            ^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:35
TS1005: ',' expected.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |                                   ^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:239:7
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |       ^^^^^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:239:12
TS1005: ',' expected.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |            ^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:239:79
TS2695: Left side of comma operator is unused and has no side effects.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |                                                                               ^^^^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:241:9
TS2304: Cannot find name 'video'.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |         ^^^^^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:241:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |                            ^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:241:90
TS1005: ',' expected.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |                                                                                          ^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:245:12
TS2304: Cannot find name 'hls'.
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |
  > 245 |     }      hls.attachMedia(video);
        |            ^^^
    246 |
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |

ERROR in src/TranslationRoom.tsx:245:28
TS2304: Cannot find name 'video'.
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |
  > 245 |     }      hls.attachMedia(video);
        |                            ^^^^^
    246 |
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |

ERROR in src/TranslationRoom.tsx:247:11
TS2304: Cannot find name 'hls'.
    245 |     }      hls.attachMedia(video);
    246 |
  > 247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
        |           ^^^
    248 |
    249 |         video.play().catch(e => console.error('Error playing source video:', e));
    250 |

ERROR in src/TranslationRoom.tsx:249:9
TS2304: Cannot find name 'video'.
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |
  > 249 |         video.play().catch(e => console.error('Error playing source video:', e));
        |         ^^^^^
    250 |
    251 |   const startTranslation = async () => {      });
    252 |

ERROR in src/TranslationRoom.tsx:249:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |
  > 249 |         video.play().catch(e => console.error('Error playing source video:', e));
        |                            ^
    250 |
    251 |   const startTranslation = async () => {      });
    252 |

ERROR in src/TranslationRoom.tsx:251:48
TS1005: ',' expected.
    249 |         video.play().catch(e => console.error('Error playing source video:', e));
    250 |
  > 251 |   const startTranslation = async () => {      });
        |                                                ^
    252 |
    253 |     try {      hlsInstanceRef.current = hls;
    254 |

ERROR in src/TranslationRoom.tsx:253:16
TS2304: Cannot find name 'hlsInstanceRef'.
    251 |   const startTranslation = async () => {      });
    252 |
  > 253 |     try {      hlsInstanceRef.current = hls;
        |                ^^^^^^^^^^^^^^
    254 |
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |

ERROR in src/TranslationRoom.tsx:253:41
TS2304: Cannot find name 'hls'.
    251 |   const startTranslation = async () => {      });
    252 |
  > 253 |     try {      hlsInstanceRef.current = hls;
        |                                         ^^^
    254 |
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |

ERROR in src/TranslationRoom.tsx:255:7
TS2304: Cannot find name 'setStreamStatus'.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |       ^^^^^^^^^^^^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:255:48
TS1472: 'catch' or 'finally' expected.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |                                                ^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:255:57
TS2304: Cannot find name 'video'.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |                                                         ^^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:257:7
TS2304: Cannot find name 'video'.
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |
  > 257 |       video.src = SOURCE_VIDEO_URL;
        |       ^^^^^
    258 |
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |

ERROR in src/TranslationRoom.tsx:261:78
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                              ^^^^^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:83
TS1005: ',' expected.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                   ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:83
TS2345: Argument of type '{ video: any; "": any; audio: {}; }' is not assignable to parameter of type 'MediaStreamConstraints'.
  Object literal may only specify known properties, and '(Missing)' does not exist in type 'MediaStreamConstraints'.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:97
TS7006: Parameter 'e' implicitly has an 'any' type.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                                 ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:150
TS1005: ',' expected.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                                                                                      ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:263:24
TS1005: ',' expected.
    261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
    262 |
  > 263 |         audio: {      });
        |                        ^
    264 |
    265 |           echoCancellation: true,    }
    266 |

ERROR in src/TranslationRoom.tsx:265:29
TS2695: Left side of comma operator is unused and has no side effects.
    263 |         audio: {      });
    264 |
  > 265 |           echoCancellation: true,    }
        |                             ^^^^
    266 |
    267 |           noiseSuppression: true,  };
    268 |

ERROR in src/TranslationRoom.tsx:265:38
TS1109: Expression expected.
    263 |         audio: {      });
    264 |
  > 265 |           echoCancellation: true,    }
        |                                      ^
    266 |
    267 |           noiseSuppression: true,  };
    268 |

ERROR in src/TranslationRoom.tsx:267:29
TS2695: Left side of comma operator is unused and has no side effects.
    265 |           echoCancellation: true,    }
    266 |
  > 267 |           noiseSuppression: true,  };
        |                             ^^^^
    268 |
    269 |           autoGainControl: true,
    270 |

ERROR in src/TranslationRoom.tsx:267:36
TS1109: Expression expected.
    265 |           echoCancellation: true,    }
    266 |
  > 267 |           noiseSuppression: true,  };
        |                                    ^
    268 |
    269 |           autoGainControl: true,
    270 |

ERROR in src/TranslationRoom.tsx:269:28
TS2695: Left side of comma operator is unused and has no side effects.
    267 |           noiseSuppression: true,  };
    268 |
  > 269 |           autoGainControl: true,
        |                            ^^^^
    270 |
    271 |         },  const startTranslation = async () => {
    272 |

ERROR in src/TranslationRoom.tsx:271:9
TS1109: Expression expected.
    269 |           autoGainControl: true,
    270 |
  > 271 |         },  const startTranslation = async () => {
        |         ^
    272 |
    273 |         video: false,    try {
    274 |

ERROR in src/TranslationRoom.tsx:271:10
TS1128: Declaration or statement expected.
    269 |           autoGainControl: true,
    270 |
  > 271 |         },  const startTranslation = async () => {
        |          ^
    272 |
    273 |         video: false,    try {
    274 |

ERROR in src/TranslationRoom.tsx:273:16
TS2695: Left side of comma operator is unused and has no side effects.
    271 |         },  const startTranslation = async () => {
    272 |
  > 273 |         video: false,    try {
        |                ^^^^^
    274 |
    275 |       });      setIsTranslating(true);
    276 |

ERROR in src/TranslationRoom.tsx:273:26
TS1109: Expression expected.
    271 |         },  const startTranslation = async () => {
    272 |
  > 273 |         video: false,    try {
        |                          ^^^
    274 |
    275 |       });      setIsTranslating(true);
    276 |

ERROR in src/TranslationRoom.tsx:275:8
TS1472: 'catch' or 'finally' expected.
    273 |         video: false,    try {
    274 |
  > 275 |       });      setIsTranslating(true);
        |        ^
    276 |
    277 |
    278 |

ERROR in src/TranslationRoom.tsx:275:16
TS2304: Cannot find name 'setIsTranslating'.
    273 |         video: false,    try {
    274 |
  > 275 |       });      setIsTranslating(true);
        |                ^^^^^^^^^^^^^^^^
    276 |
    277 |
    278 |

ERROR in src/TranslationRoom.tsx:279:7
TS2304: Cannot find name 'audioStreamRef'.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |       ^^^^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:279:32
TS2448: Block-scoped variable 'audioStream' used before its declaration.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |                                ^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:279:32
TS2454: Variable 'audioStream' is used before being assigned.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |                                ^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:285:13
TS1005: ':' expected.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |             ^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:13
TS2588: Cannot assign to 'videoElement' because it is a constant.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |             ^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:28
TS2304: Cannot find name 'sourceVideoRef'.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |                            ^^^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:50
TS1005: ',' expected.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |                                                  ^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:287:11
TS1003: Identifier expected.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |           ^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:287:12
TS7006: Parameter 'videoElement' implicitly has an 'any' type.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |            ^^^^^^^^^^^^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:287:55
TS2695: Left side of comma operator is unused and has no side effects.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |                                                       ^^^^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:289:9
TS1109: Expression expected.
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |
  > 289 |         throw new Error('Source video not available');          autoGainControl: true,
        |         ^^^^^
    290 |
    291 |       }        },
    292 |

ERROR in src/TranslationRoom.tsx:289:82
TS2695: Left side of comma operator is unused and has no side effects.
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |
  > 289 |         throw new Error('Source video not available');          autoGainControl: true,
        |                                                                                  ^^^^
    290 |
    291 |       }        },
    292 |

ERROR in src/TranslationRoom.tsx:291:7
TS1109: Expression expected.
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |
  > 291 |       }        },
        |       ^
    292 |
    293 |         video: false,
    294 |

ERROR in src/TranslationRoom.tsx:293:9
TS2304: Cannot find name 'video'.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |         ^^^^^
    294 |
    295 |       setStreamStatus('Capturing video...');      });
    296 |

ERROR in src/TranslationRoom.tsx:293:9
TS2554: Expected 0-1 arguments, but got 4.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |         ^^^^^^^^^^^^^
  > 294 |
        | ^
  > 295 |       setStreamStatus('Capturing video...');      });
        | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:293:14
TS1005: ',' expected.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |              ^
    294 |
    295 |       setStreamStatus('Capturing video...');      });
    296 |

ERROR in src/TranslationRoom.tsx:295:7
TS2304: Cannot find name 'setStreamStatus'.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |       ^^^^^^^^^^^^^^^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:295:44
TS1005: ')' expected.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |                                            ^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:295:52
TS1005: ',' expected.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |                                                    ^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:301:13
TS2451: Cannot redeclare block-scoped variable 'canvas'.
    299 |       // Create canvas to capture video      audioStreamRef.current = audioStream;
    300 |
  > 301 |       const canvas = document.createElement('canvas');
        |             ^^^^^^
    302 |
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |

ERROR in src/TranslationRoom.tsx:303:22
TS2448: Block-scoped variable 'videoElement' used before its declaration.
    301 |       const canvas = document.createElement('canvas');
    302 |
  > 303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
        |                      ^^^^^^^^^^^^
    304 |
    305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
    306 |

ERROR in src/TranslationRoom.tsx:305:23
TS2448: Block-scoped variable 'videoElement' used before its declaration.
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |
  > 305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
        |                       ^^^^^^^^^^^^
    306 |
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |

ERROR in src/TranslationRoom.tsx:305:82
TS2304: Cannot find name 'sourceVideoRef'.
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |
  > 305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
        |                                                                                  ^^^^^^^^^^^^^^
    306 |
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |

ERROR in src/TranslationRoom.tsx:309:7
TS2552: Cannot find name 'canvasRef'. Did you mean 'canvas'?
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |
  > 309 |       canvasRef.current = canvas;        throw new Error('Source video not available');
        |       ^^^^^^^^^
    310 |
    311 |       }
    312 |

ERROR in src/TranslationRoom.tsx:315:13
TS2451: Cannot redeclare block-scoped variable 'videoStream'.
    313 |       // Capture video frames at 30fps
    314 |
  > 315 |       const videoStream = canvas.captureStream(30);      // Create canvas to capture video
        |             ^^^^^^^^^^^
    316 |
    317 |             const canvas = document.createElement('canvas');
    318 |

ERROR in src/TranslationRoom.tsx:317:19
TS2451: Cannot redeclare block-scoped variable 'canvas'.
    315 |       const videoStream = canvas.captureStream(30);      // Create canvas to capture video
    316 |
  > 317 |             const canvas = document.createElement('canvas');
        |                   ^^^^^^
    318 |
    319 |       // Draw video frames to canvas      canvas.width = videoElement.videoWidth || 1280;
    320 |

ERROR in src/TranslationRoom.tsx:321:13
TS2451: Cannot redeclare block-scoped variable 'drawFrame'.
    319 |       // Draw video frames to canvas      canvas.width = videoElement.videoWidth || 1280;
    320 |
  > 321 |       const drawFrame = () => {      canvas.height = videoElement.videoHeight || 720;
        |             ^^^^^^^^^
    322 |
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |

ERROR in src/TranslationRoom.tsx:323:36
TS2304: Cannot find name 'isTranslating'.
    321 |       const drawFrame = () => {      canvas.height = videoElement.videoHeight || 720;
    322 |
  > 323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
        |                                    ^^^^^^^^^^^^^
    324 |
    325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
    326 |

ERROR in src/TranslationRoom.tsx:325:11
TS18047: 'ctx' is possibly 'null'.
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |
  > 325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
        |           ^^^
    326 |
    327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
    328 |

ERROR in src/TranslationRoom.tsx:325:80
TS2304: Cannot find name 'canvasRef'.
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |
  > 325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
        |                                                                                ^^^^^^^^^
    326 |
    327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
    328 |

ERROR in src/TranslationRoom.tsx:327:11
TS2304: Cannot find name 'animationFrameRef'.
    325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
    326 |
  > 327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
        |           ^^^^^^^^^^^^^^^^^
    328 |
    329 |         }      // Capture video frames at 30fps
    330 |

ERROR in src/TranslationRoom.tsx:331:21
TS2451: Cannot redeclare block-scoped variable 'videoStream'.
    329 |         }      // Capture video frames at 30fps
    330 |
  > 331 |       };      const videoStream = canvas.captureStream(30);
        |                     ^^^^^^^^^^^
    332 |
    333 |             
    334 |

ERROR in src/TranslationRoom.tsx:335:7
TS2304: Cannot find name 'setIsTranslating'.
    333 |             
    334 |
  > 335 |       setIsTranslating(true);      // Draw video frames to canvas
        |       ^^^^^^^^^^^^^^^^
    336 |
    337 |       drawFrame();      const drawFrame = () => {
    338 |

ERROR in src/TranslationRoom.tsx:337:31
TS2451: Cannot redeclare block-scoped variable 'drawFrame'.
    335 |       setIsTranslating(true);      // Draw video frames to canvas
    336 |
  > 337 |       drawFrame();      const drawFrame = () => {
        |                               ^^^^^^^^^
    338 |
    339 |         if (ctx && videoElement && isTranslating) {
    340 |

ERROR in src/TranslationRoom.tsx:339:36
TS2304: Cannot find name 'isTranslating'.
    337 |       drawFrame();      const drawFrame = () => {
    338 |
  > 339 |         if (ctx && videoElement && isTranslating) {
        |                                    ^^^^^^^^^^^^^
    340 |
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |

ERROR in src/TranslationRoom.tsx:343:30
TS2769: No overload matches this call.
  Overload 1 of 3, '(stream: MediaStream): MediaStream', gave the following error.
    Argument of type 'number[]' is not assignable to parameter of type 'MediaStream'.
      Type 'number[]' is missing the following properties from type 'MediaStream': active, id, onaddtrack, onremovetrack, and 10 more.
  Overload 2 of 3, '(tracks: MediaStreamTrack[]): MediaStream', gave the following error.
    Type 'number' is not assignable to type 'MediaStreamTrack'.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:343:57
TS2304: Cannot find name 'animationFrameRef'.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                                                         ^^^^^^^^^^^^^^^^^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:343:117
TS1005: ',' expected.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                                                                                                                     ^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:345:9
TS1128: Declaration or statement expected.
    343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
    344 |
  > 345 |         ...videoStream.getVideoTracks(),        }
        |         ^^^
    346 |
    347 |         ...audioStream.getAudioTracks(),      };
    348 |

ERROR in src/TranslationRoom.tsx:345:49
TS1109: Expression expected.
    343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
    344 |
  > 345 |         ...videoStream.getVideoTracks(),        }
        |                                                 ^
    346 |
    347 |         ...audioStream.getAudioTracks(),      };
    348 |

ERROR in src/TranslationRoom.tsx:347:9
TS1128: Declaration or statement expected.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |         ^^^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:347:12
TS2304: Cannot find name 'audioStream'.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |            ^^^^^^^^^^^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:347:47
TS1109: Expression expected.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |                                               ^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:349:7
TS1128: Declaration or statement expected.
    347 |         ...audioStream.getAudioTracks(),      };
    348 |
  > 349 |       ]);      drawFrame();
        |       ^
    350 |
    351 |
    352 |

ERROR in src/TranslationRoom.tsx:349:8
TS1128: Declaration or statement expected.
    347 |         ...audioStream.getAudioTracks(),      };
    348 |
  > 349 |       ]);      drawFrame();
        |        ^
    350 |
    351 |
    352 |

ERROR in src/TranslationRoom.tsx:353:7
TS2552: Cannot find name 'combinedStreamRef'. Did you mean 'combinedStream'?
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |       ^^^^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:353:35
TS2448: Block-scoped variable 'combinedStream' used before its declaration.
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |                                   ^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:353:35
TS2454: Variable 'combinedStream' is used before being assigned.
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |                                   ^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:357:7
TS2304: Cannot find name 'setStreamStatus'.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |       ^^^^^^^^^^^^^^^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:357:59
TS1005: ',' expected.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |                                                           ^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:357:68
TS1128: Declaration or statement expected.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |                                                                    ^^^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:359:9
TS1109: Expression expected.
    357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
    358 |
  > 359 |         ...audioStream.getAudioTracks(),
        |         ^^^
    360 |
    361 |       // Connect to WebSocket bridge server      ]);
    362 |

ERROR in src/TranslationRoom.tsx:359:12
TS2304: Cannot find name 'audioStream'.
    357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
    358 |
  > 359 |         ...audioStream.getAudioTracks(),
        |            ^^^^^^^^^^^
    360 |
    361 |       // Connect to WebSocket bridge server      ]);
    362 |

ERROR in src/TranslationRoom.tsx:363:7
TS1109: Expression expected.
    361 |       // Connect to WebSocket bridge server      ]);
    362 |
  > 363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
        |       ^^^^^
    364 |
    365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
    366 |

ERROR in src/TranslationRoom.tsx:365:7
TS2304: Cannot find name 'wsRef'.
    363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
    364 |
  > 365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
        |       ^^^^^
    366 |
    367 |
    368 |

ERROR in src/TranslationRoom.tsx:365:32
TS2552: Cannot find name 'combinedStreamRef'. Did you mean 'combinedStream'?
    363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
    364 |
  > 365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
        |                                ^^^^^^^^^^^^^^^^^
    366 |
    367 |
    368 |

ERROR in src/TranslationRoom.tsx:373:9
TS2304: Cannot find name 'setStreamStatus'.
    371 |         console.log('Connected to RTMP bridge server');      const ws = new WebSocket(BRIDGE_SERVER_URL);
    372 |
  > 373 |         setStreamStatus('Connected. Starting stream...');      wsRef.current = ws;
        |         ^^^^^^^^^^^^^^^
    374 |
    375 |         
    376 |

ERROR in src/TranslationRoom.tsx:373:64
TS2304: Cannot find name 'wsRef'.
    371 |         console.log('Connected to RTMP bridge server');      const ws = new WebSocket(BRIDGE_SERVER_URL);
    372 |
  > 373 |         setStreamStatus('Connected. Starting stream...');      wsRef.current = ws;
        |                                                                ^^^^^
    374 |
    375 |         
    376 |

ERROR in src/TranslationRoom.tsx:379:48
TS1005: ',' expected.
    377 |         // Start streaming      ws.onopen = () => {
    378 |
  > 379 |         ws.send(JSON.stringify({        console.log('Connected to RTMP bridge server');
        |                                                ^
    380 |
    381 |           type: 'start',        
    382 |

ERROR in src/TranslationRoom.tsx:379:87
TS1005: ',' expected.
    377 |         // Start streaming      ws.onopen = () => {
    378 |
  > 379 |         ws.send(JSON.stringify({        console.log('Connected to RTMP bridge server');
        |                                                                                       ^
    380 |
    381 |           type: 'start',        
    382 |

ERROR in src/TranslationRoom.tsx:383:21
TS2304: Cannot find name 'selectedLanguage'.
    381 |           type: 'start',        
    382 |
  > 383 |           language: selectedLanguage        // Start streaming
        |                     ^^^^^^^^^^^^^^^^
    384 |
    385 |         }));        ws.send(JSON.stringify({
    386 |

ERROR in src/TranslationRoom.tsx:391:15
TS1005: ':' expected.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |               ^^^^^^^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:391:15
TS2588: Cannot assign to 'options' because it is a constant.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |               ^^^^^^^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:391:35
TS1005: ',' expected.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |                                   ^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:393:21
TS2695: Left side of comma operator is unused and has no side effects.
    391 |         const options = {        }));
    392 |
  > 393 |           mimeType: 'video/webm;codecs=vp8,opus',
        |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    394 |
    395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
    396 |

ERROR in src/TranslationRoom.tsx:395:11
TS2304: Cannot find name 'videoBitsPerSecond'.
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |
  > 395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
        |           ^^^^^^^^^^^^^^^^^^
    396 |
    397 |         };        const options = {
    398 |

ERROR in src/TranslationRoom.tsx:395:29
TS1005: ';' expected.
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |
  > 395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
        |                             ^
    396 |
    397 |         };        const options = {
    398 |

ERROR in src/TranslationRoom.tsx:397:25
TS7022: 'options' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
    395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
    396 |
  > 397 |         };        const options = {
        |                         ^^^^^^^
    398 |
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |

ERROR in src/TranslationRoom.tsx:401:15
TS1005: ':' expected.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |               ^^^^^^^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:15
TS2304: Cannot find name 'mediaRecorder'.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |               ^^^^^^^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:65
TS2448: Block-scoped variable 'options' used before its declaration.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |                                                                 ^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:73
TS1005: ',' expected.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |                                                                         ^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:403:9
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |         ^^^^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:9
TS18004: No value exists in scope for the shorthand property 'mediaRecorderRef'. Either declare one or provide an initializer.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |         ^^^^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:25
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                         ^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:36
TS2304: Cannot find name 'mediaRecorder'.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                                    ^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:49
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                                                 ^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:407:9
TS2304: Cannot find name 'mediaRecorder'.
    405 |
    406 |
  > 407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
        |         ^^^^^^^^^^^^^
    408 |
    409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
    410 |

ERROR in src/TranslationRoom.tsx:407:42
TS7006: Parameter 'event' implicitly has an 'any' type.
    405 |
    406 |
  > 407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
        |                                          ^^^^^
    408 |
    409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
    410 |

ERROR in src/TranslationRoom.tsx:409:81
TS2304: Cannot find name 'mediaRecorderRef'.
    407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
    408 |
  > 409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
        |                                                                                 ^^^^^^^^^^^^^^^^
    410 |
    411 |             ws.send(event.data);
    412 |

ERROR in src/TranslationRoom.tsx:419:78
TS2339: Property 'data' does not exist on type 'Event'.
    417 |             // Send binary data to bridge server
    418 |
  > 419 |         mediaRecorder.onerror = (event: Event) => {            ws.send(event.data);
        |                                                                              ^^^^
    420 |
    421 |           console.error('MediaRecorder error:', event);          }
    422 |

ERROR in src/TranslationRoom.tsx:423:11
TS2304: Cannot find name 'setStreamStatus'.
    421 |           console.error('MediaRecorder error:', event);          }
    422 |
  > 423 |           setStreamStatus('Error: MediaRecorder failed');        };
        |           ^^^^^^^^^^^^^^^
    424 |
    425 |         };
    426 |

ERROR in src/TranslationRoom.tsx:427:9
TS2304: Cannot find name 'mediaRecorder'.
    425 |         };
    426 |
  > 427 |         mediaRecorder.onerror = (event) => {
        |         ^^^^^^^^^^^^^
    428 |
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |

ERROR in src/TranslationRoom.tsx:427:34
TS7006: Parameter 'event' implicitly has an 'any' type.
    425 |         };
    426 |
  > 427 |         mediaRecorder.onerror = (event) => {
        |                                  ^^^^^
    428 |
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |

ERROR in src/TranslationRoom.tsx:431:9
TS2304: Cannot find name 'mediaRecorder'.
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |
  > 431 |         mediaRecorder.start(100);        };
        |         ^^^^^^^^^^^^^
    432 |
    433 |         
    434 |

ERROR in src/TranslationRoom.tsx:437:7
TS1128: Declaration or statement expected.
    435 |         console.log('Started streaming to RTMP via bridge server');        // Start recording in chunks
    436 |
  > 437 |       };        mediaRecorder.start(100); // Send data every 100ms
        |       ^
    438 |
    439 |         
    440 |

ERROR in src/TranslationRoom.tsx:437:17
TS2304: Cannot find name 'mediaRecorder'.
    435 |         console.log('Started streaming to RTMP via bridge server');        // Start recording in chunks
    436 |
  > 437 |       };        mediaRecorder.start(100); // Send data every 100ms
        |                 ^^^^^^^^^^^^^
    438 |
    439 |         
    440 |

ERROR in src/TranslationRoom.tsx:445:9
TS2304: Cannot find name 'setStreamStatus'.
    443 |         console.error('WebSocket error:', error);      };
    444 |
  > 445 |         setStreamStatus('Error: Cannot connect to bridge server');
        |         ^^^^^^^^^^^^^^^
    446 |
    447 |         alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');      ws.onerror = (error) => {
    448 |

ERROR in src/TranslationRoom.tsx:449:9
TS2304: Cannot find name 'setIsTranslating'.
    447 |         alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');      ws.onerror = (error) => {
    448 |
  > 449 |         setIsTranslating(false);        console.error('WebSocket error:', error);
        |         ^^^^^^^^^^^^^^^^
    450 |
    451 |       };        alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');
    452 |

ERROR in src/TranslationRoom.tsx:453:9
TS2304: Cannot find name 'setIsTranslating'.
    451 |       };        alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');
    452 |
  > 453 |         setIsTranslating(false);
        |         ^^^^^^^^^^^^^^^^
    454 |
    455 |       ws.onclose = () => {      };
    456 |

ERROR in src/TranslationRoom.tsx:459:9
TS2304: Cannot find name 'setStreamStatus'.
    457 |         console.log('Disconnected from bridge server');
    458 |
  > 459 |         setStreamStatus('Disconnected from bridge server');      ws.onclose = () => {
        |         ^^^^^^^^^^^^^^^
    460 |
    461 |       };        console.log('Disconnected from bridge server');
    462 |

ERROR in src/TranslationRoom.tsx:463:7
TS1128: Declaration or statement expected.
    461 |       };        console.log('Disconnected from bridge server');
    462 |
  > 463 |       };
        |       ^
    464 |
    465 |       ws.onmessage = (event) => {
    466 |

ERROR in src/TranslationRoom.tsx:475:13
TS2304: Cannot find name 'setStreamStatus'.
    473 |             console.log('RTMP streaming started for:', data.streamKey);          if (data.type === 'started') {
    474 |
  > 475 |             setStreamStatus(`Streaming live to ${data.streamKey}`);            console.log('RTMP streaming started for:', data.streamKey);
        |             ^^^^^^^^^^^^^^^
    476 |
    477 |             // Start monitoring the output stream after a delay            // Start monitoring the output stream
    478 |

ERROR in src/TranslationRoom.tsx:489:13
TS2304: Cannot find name 'setStreamStatus'.
    487 |             console.error('Bridge server error:', data.error);            console.error('Bridge server error:', data.error);
    488 |
  > 489 |             setStreamStatus(`Error: ${data.error}`);            alert(`Streaming error: ${data.error}`);
        |             ^^^^^^^^^^^^^^^
    490 |
    491 |           } else if (data.type === 'stopped') {          }
    492 |

ERROR in src/TranslationRoom.tsx:493:13
TS2304: Cannot find name 'setStreamStatus'.
    491 |           } else if (data.type === 'stopped') {          }
    492 |
  > 493 |             setStreamStatus('Stream stopped');        } catch (err) {
        |             ^^^^^^^^^^^^^^^
    494 |
    495 |           }          console.log('Non-JSON message from bridge:', event.data);
    496 |

ERROR in src/TranslationRoom.tsx:493:57
TS1005: 'try' expected.
    491 |           } else if (data.type === 'stopped') {          }
    492 |
  > 493 |             setStreamStatus('Stream stopped');        } catch (err) {
        |                                                         ^^^^^
    494 |
    495 |           }          console.log('Non-JSON message from bridge:', event.data);
    496 |

ERROR in src/TranslationRoom.tsx:503:8
TS1472: 'catch' or 'finally' expected.
    501 |         }
    502 |
  > 503 |       };    } catch (err) {
        |        ^
    504 |
    505 |       console.error('Error starting translation:', err);
    506 |

ERROR in src/TranslationRoom.tsx:503:15
TS1005: ';' expected.
    501 |         }
    502 |
  > 503 |       };    } catch (err) {
        |               ^^^^^
    504 |
    505 |       console.error('Error starting translation:', err);
    506 |

ERROR in src/TranslationRoom.tsx:507:7
TS1005: 'try' expected.
    505 |       console.error('Error starting translation:', err);
    506 |
  > 507 |     } catch (err) {      alert('Failed to start translation. Please check microphone permissions.');
        |       ^^^^^
    508 |
    509 |       console.error('Error starting translation:', err);      setIsTranslating(false);
    510 |

ERROR in src/TranslationRoom.tsx:509:63
TS2304: Cannot find name 'setIsTranslating'.
    507 |     } catch (err) {      alert('Failed to start translation. Please check microphone permissions.');
    508 |
  > 509 |       console.error('Error starting translation:', err);      setIsTranslating(false);
        |                                                               ^^^^^^^^^^^^^^^^
    510 |
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |

ERROR in src/TranslationRoom.tsx:513:7
TS2304: Cannot find name 'setIsTranslating'.
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |
  > 513 |       setIsTranslating(false);  };
        |       ^^^^^^^^^^^^^^^^
    514 |
    515 |       setStreamStatus('Failed to start');
    516 |

ERROR in src/TranslationRoom.tsx:513:33
TS1128: Declaration or statement expected.
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |
  > 513 |       setIsTranslating(false);  };
        |                                 ^
    514 |
    515 |       setStreamStatus('Failed to start');
    516 |

ERROR in src/TranslationRoom.tsx:515:7
TS2304: Cannot find name 'setStreamStatus'.
    513 |       setIsTranslating(false);  };
    514 |
  > 515 |       setStreamStatus('Failed to start');
        |       ^^^^^^^^^^^^^^^
    516 |
    517 |     }  const startOutputVideo = () => {
    518 |

ERROR in src/TranslationRoom.tsx:517:5
TS1128: Declaration or statement expected.
    515 |       setStreamStatus('Failed to start');
    516 |
  > 517 |     }  const startOutputVideo = () => {
        |     ^
    518 |
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |

ERROR in src/TranslationRoom.tsx:517:14
TS2451: Cannot redeclare block-scoped variable 'startOutputVideo'.
    515 |       setStreamStatus('Failed to start');
    516 |
  > 517 |     }  const startOutputVideo = () => {
        |              ^^^^^^^^^^^^^^^^
    518 |
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |

ERROR in src/TranslationRoom.tsx:519:72
TS2304: Cannot find name 'selectedLanguage'.
    517 |     }  const startOutputVideo = () => {
    518 |
  > 519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
        |                                                                        ^^^^^^^^^^^^^^^^
    520 |
    521 |     const outputVideo = outputVideoRef.current;
    522 |

ERROR in src/TranslationRoom.tsx:521:25
TS2304: Cannot find name 'outputVideoRef'.
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |
  > 521 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    522 |
    523 |   const startOutputVideo = () => {    
    524 |

ERROR in src/TranslationRoom.tsx:523:9
TS2451: Cannot redeclare block-scoped variable 'startOutputVideo'.
    521 |     const outputVideo = outputVideoRef.current;
    522 |
  > 523 |   const startOutputVideo = () => {    
        |         ^^^^^^^^^^^^^^^^
    524 |
    525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
    526 |

ERROR in src/TranslationRoom.tsx:525:68
TS2304: Cannot find name 'selectedLanguage'.
    523 |   const startOutputVideo = () => {    
    524 |
  > 525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
        |                                                                    ^^^^^^^^^^^^^^^^
    526 |
    527 |     const outputVideo = outputVideoRef.current;
    528 |

ERROR in src/TranslationRoom.tsx:525:110
TS2448: Block-scoped variable 'outputVideo' used before its declaration.
    523 |   const startOutputVideo = () => {    
    524 |
  > 525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
        |                                                                                                              ^^^^^^^^^^^
    526 |
    527 |     const outputVideo = outputVideoRef.current;
    528 |

ERROR in src/TranslationRoom.tsx:527:25
TS2304: Cannot find name 'outputVideoRef'.
    525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
    526 |
  > 527 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    528 |
    529 |         console.log('Loading translated output stream:', watchUrl);
    530 |

ERROR in src/TranslationRoom.tsx:535:76
TS2451: Cannot redeclare block-scoped variable 'hls'.
    533 |     if (Hls.isSupported()) {
    534 |
  > 535 |     console.log('Loading translated output stream:', watchUrl);      const hls = new Hls({
        |                                                                            ^^^
    536 |
    537 |         enableWorker: true,
    538 |

ERROR in src/TranslationRoom.tsx:539:5
TS2345: Argument of type '{ enableWorker: true; if(Hls: any): any; "": any; }' is not assignable to parameter of type 'Partial<HlsConfig>'.
  Object literal may only specify known properties, and 'if' does not exist in type 'Partial<HlsConfig>'.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |     ^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:9
TS7006: Parameter 'Hls' implicitly has an 'any' type.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |         ^^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:12
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |            ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:26
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                          ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:28
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                            ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:53
TS1359: Identifier expected. 'true' is a reserved word that cannot be used here.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                                                     ^^^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:57
TS1005: ':' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                                                         ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:541:13
TS1005: ':' expected.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |             ^^^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:541:13
TS2451: Cannot redeclare block-scoped variable 'hls'.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |             ^^^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:541:36
TS1005: ',' expected.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |                                    ^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:543:23
TS2695: Left side of comma operator is unused and has no side effects.
    541 |       const hls = new Hls({      });
    542 |
  > 543 |         enableWorker: true,      
        |                       ^^^^
    544 |
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |

ERROR in src/TranslationRoom.tsx:545:9
TS2304: Cannot find name 'lowLatencyMode'.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |         ^^^^^^^^^^^^^^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:545:23
TS1005: ';' expected.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |                       ^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:545:25
TS2695: Left side of comma operator is unused and has no side effects.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |                         ^^^^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:547:22
TS2304: Cannot find name 'data'.
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |
  > 547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
        |                      ^^^^
    548 |
    549 |                 console.log('HLS stream not available yet, will retry...');
    550 |

ERROR in src/TranslationRoom.tsx:547:36
TS2304: Cannot find name 'data'.
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |
  > 547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
        |                                    ^^^^
    548 |
    549 |                 console.log('HLS stream not available yet, will retry...');
    550 |

ERROR in src/TranslationRoom.tsx:561:18
TS1005: ',' expected.
    559 |           setTimeout(() => startOutputVideo(), 3000);      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    560 |
  > 561 |         }        console.log('Translation output stream is now available');
        |                  ^^^^^^^
    562 |
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |

ERROR in src/TranslationRoom.tsx:561:75
TS1005: ')' expected.
    559 |           setTimeout(() => startOutputVideo(), 3000);      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    560 |
  > 561 |         }        console.log('Translation output stream is now available');
        |                                                                           ^
    562 |
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |

ERROR in src/TranslationRoom.tsx:563:8
TS1128: Declaration or statement expected.
    561 |         }        console.log('Translation output stream is now available');
    562 |
  > 563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
        |        ^
    564 |
    565 |       });
    566 |

ERROR in src/TranslationRoom.tsx:565:8
TS1128: Declaration or statement expected.
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |
  > 565 |       });
        |        ^
    566 |
    567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
    568 |

ERROR in src/TranslationRoom.tsx:567:7
TS2304: Cannot find name 'hls'.
    565 |       });
    566 |
  > 567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
        |       ^^^
    568 |
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |

ERROR in src/TranslationRoom.tsx:569:73
TS2304: Cannot find name 'hls'.
    567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
    568 |
  > 569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
        |                                                                         ^^^
    570 |
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |

ERROR in src/TranslationRoom.tsx:571:9
TS2304: Cannot find name 'setStreamStatus'.
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |
  > 571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
        |         ^^^^^^^^^^^^^^^
    572 |
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |

ERROR in src/TranslationRoom.tsx:571:68
TS2304: Cannot find name 'hls'.
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |
  > 571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
        |                                                                    ^^^
    572 |
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |

ERROR in src/TranslationRoom.tsx:573:95
TS2304: Cannot find name 'outputHlsRef'.
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |
  > 573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
        |                                                                                               ^^^^^^^^^^^^
    574 |
    575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
    576 |

ERROR in src/TranslationRoom.tsx:573:118
TS2304: Cannot find name 'hls'.
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |
  > 573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
        |                                                                                                                      ^^^
    574 |
    575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
    576 |

ERROR in src/TranslationRoom.tsx:575:16
TS1005: ',' expected.
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |
  > 575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
        |                ^^^^
    576 |
    577 |       outputVideo.src = watchUrl;
    578 |

ERROR in src/TranslationRoom.tsx:575:21
TS1389: 'if' is not allowed as a variable declaration name.
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |
  > 575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
        |                     ^^
    576 |
    577 |       outputVideo.src = watchUrl;
    578 |

ERROR in src/TranslationRoom.tsx:579:7
TS2304: Cannot find name 'hls'.
    577 |       outputVideo.src = watchUrl;
    578 |
  > 579 |       hls.loadSource(watchUrl);      outputVideo.addEventListener('loadedmetadata', () => {
        |       ^^^
    580 |
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |

ERROR in src/TranslationRoom.tsx:581:7
TS2304: Cannot find name 'hls'.
    579 |       hls.loadSource(watchUrl);      outputVideo.addEventListener('loadedmetadata', () => {
    580 |
  > 581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
        |       ^^^
    582 |
    583 |       outputHlsRef.current = hls;      });
    584 |

ERROR in src/TranslationRoom.tsx:583:7
TS2304: Cannot find name 'outputHlsRef'.
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |
  > 583 |       outputHlsRef.current = hls;      });
        |       ^^^^^^^^^^^^
    584 |
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |

ERROR in src/TranslationRoom.tsx:583:30
TS2304: Cannot find name 'hls'.
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |
  > 583 |       outputHlsRef.current = hls;      });
        |                              ^^^
    584 |
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |

ERROR in src/TranslationRoom.tsx:587:36
TS1128: Declaration or statement expected.
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |
  > 587 |       outputVideo.src = watchUrl;  };
        |                                    ^
    588 |
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |

ERROR in src/TranslationRoom.tsx:591:9
TS2304: Cannot find name 'setStreamStatus'.
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |
  > 591 |         setStreamStatus('Streaming live - Output available');  };
        |         ^^^^^^^^^^^^^^^
    592 |
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |

ERROR in src/TranslationRoom.tsx:591:65
TS1005: ')' expected.
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |
  > 591 |         setStreamStatus('Streaming live - Output available');  };
        |                                                                 ^
    592 |
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |

ERROR in src/TranslationRoom.tsx:595:7
TS1128: Declaration or statement expected.
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |
  > 595 |       });  const stopTranslation = () => {
        |       ^
    596 |
    597 |     }    // Stop media recorder
    598 |

ERROR in src/TranslationRoom.tsx:595:8
TS1128: Declaration or statement expected.
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |
  > 595 |       });  const stopTranslation = () => {
        |        ^
    596 |
    597 |     }    // Stop media recorder
    598 |

ERROR in src/TranslationRoom.tsx:599:3
TS1128: Declaration or statement expected.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |   ^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:599:13
TS2304: Cannot find name 'mediaRecorderRef'.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |             ^^^^^^^^^^^^^^^^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:599:41
TS2304: Cannot find name 'mediaRecorderRef'.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                         ^^^^^^^^^^^^^^^^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:601:7
TS2304: Cannot find name 'mediaRecorderRef'.
    599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
    600 |
  > 601 |       mediaRecorderRef.current.stop();
        |       ^^^^^^^^^^^^^^^^
    602 |
    603 |   const stopTranslation = () => {      mediaRecorderRef.current = null;
    604 |

ERROR in src/TranslationRoom.tsx:603:40
TS2304: Cannot find name 'mediaRecorderRef'.
    601 |       mediaRecorderRef.current.stop();
    602 |
  > 603 |   const stopTranslation = () => {      mediaRecorderRef.current = null;
        |                                        ^^^^^^^^^^^^^^^^
    604 |
    605 |     // Stop media recorder    }
    606 |

ERROR in src/TranslationRoom.tsx:607:9
TS2304: Cannot find name 'mediaRecorderRef'.
    605 |     // Stop media recorder    }
    606 |
  > 607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |         ^^^^^^^^^^^^^^^^
    608 |
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |

ERROR in src/TranslationRoom.tsx:607:37
TS2304: Cannot find name 'mediaRecorderRef'.
    605 |     // Stop media recorder    }
    606 |
  > 607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                     ^^^^^^^^^^^^^^^^
    608 |
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |

ERROR in src/TranslationRoom.tsx:609:7
TS2304: Cannot find name 'mediaRecorderRef'.
    607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
    608 |
  > 609 |       mediaRecorderRef.current.stop();    // Stop animation frame
        |       ^^^^^^^^^^^^^^^^
    610 |
    611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
    612 |

ERROR in src/TranslationRoom.tsx:611:7
TS2304: Cannot find name 'mediaRecorderRef'.
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |
  > 611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
        |       ^^^^^^^^^^^^^^^^
    612 |
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |

ERROR in src/TranslationRoom.tsx:611:47
TS2304: Cannot find name 'animationFrameRef'.
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |
  > 611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
        |                                               ^^^^^^^^^^^^^^^^^
    612 |
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |

ERROR in src/TranslationRoom.tsx:613:33
TS2304: Cannot find name 'animationFrameRef'.
    611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
    612 |
  > 613 |     }      cancelAnimationFrame(animationFrameRef.current);
        |                                 ^^^^^^^^^^^^^^^^^
    614 |
    615 |       animationFrameRef.current = null;
    616 |

ERROR in src/TranslationRoom.tsx:615:7
TS2304: Cannot find name 'animationFrameRef'.
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |
  > 615 |       animationFrameRef.current = null;
        |       ^^^^^^^^^^^^^^^^^
    616 |
    617 |     // Stop animation frame    }
    618 |

ERROR in src/TranslationRoom.tsx:619:9
TS2304: Cannot find name 'animationFrameRef'.
    617 |     // Stop animation frame    }
    618 |
  > 619 |     if (animationFrameRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    620 |
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |

ERROR in src/TranslationRoom.tsx:621:28
TS2304: Cannot find name 'animationFrameRef'.
    619 |     if (animationFrameRef.current) {
    620 |
  > 621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
        |                            ^^^^^^^^^^^^^^^^^
    622 |
    623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
    624 |

ERROR in src/TranslationRoom.tsx:623:7
TS2304: Cannot find name 'animationFrameRef'.
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |
  > 623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
        |       ^^^^^^^^^^^^^^^^^
    624 |
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |

ERROR in src/TranslationRoom.tsx:623:48
TS2304: Cannot find name 'audioStreamRef'.
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |
  > 623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
        |                                                ^^^^^^^^^^^^^^
    624 |
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |

ERROR in src/TranslationRoom.tsx:625:12
TS2304: Cannot find name 'audioStreamRef'.
    623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
    624 |
  > 625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |            ^^^^^^^^^^^^^^
    626 |
    627 |       audioStreamRef.current = null;
    628 |

ERROR in src/TranslationRoom.tsx:627:7
TS2304: Cannot find name 'audioStreamRef'.
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |
  > 627 |       audioStreamRef.current = null;
        |       ^^^^^^^^^^^^^^
    628 |
    629 |     // Stop all tracks    }
    630 |

ERROR in src/TranslationRoom.tsx:631:9
TS2304: Cannot find name 'audioStreamRef'.
    629 |     // Stop all tracks    }
    630 |
  > 631 |     if (audioStreamRef.current) {
        |         ^^^^^^^^^^^^^^
    632 |
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |

ERROR in src/TranslationRoom.tsx:633:7
TS2304: Cannot find name 'audioStreamRef'.
    631 |     if (audioStreamRef.current) {
    632 |
  > 633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
        |       ^^^^^^^^^^^^^^
    634 |
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |

ERROR in src/TranslationRoom.tsx:633:101
TS2304: Cannot find name 'combinedStreamRef'.
    631 |     if (audioStreamRef.current) {
    632 |
  > 633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
        |                                                                                                     ^^^^^^^^^^^^^^^^^
    634 |
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |

ERROR in src/TranslationRoom.tsx:635:7
TS2304: Cannot find name 'audioStreamRef'.
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |
  > 635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |       ^^^^^^^^^^^^^^
    636 |
    637 |     }      combinedStreamRef.current = null;
    638 |

ERROR in src/TranslationRoom.tsx:635:43
TS2304: Cannot find name 'combinedStreamRef'.
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |
  > 635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |                                           ^^^^^^^^^^^^^^^^^
    636 |
    637 |     }      combinedStreamRef.current = null;
    638 |

ERROR in src/TranslationRoom.tsx:637:12
TS2304: Cannot find name 'combinedStreamRef'.
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |
  > 637 |     }      combinedStreamRef.current = null;
        |            ^^^^^^^^^^^^^^^^^
    638 |
    639 |     }
    640 |

ERROR in src/TranslationRoom.tsx:641:9
TS2304: Cannot find name 'combinedStreamRef'.
    639 |     }
    640 |
  > 641 |     if (combinedStreamRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    642 |
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |

ERROR in src/TranslationRoom.tsx:643:7
TS2304: Cannot find name 'combinedStreamRef'.
    641 |     if (combinedStreamRef.current) {
    642 |
  > 643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
        |       ^^^^^^^^^^^^^^^^^
    644 |
    645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
    646 |

ERROR in src/TranslationRoom.tsx:645:7
TS2304: Cannot find name 'combinedStreamRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |       ^^^^^^^^^^^^^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:645:48
TS2304: Cannot find name 'wsRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |                                                ^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:645:65
TS2304: Cannot find name 'wsRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |                                                                 ^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:647:12
TS2304: Cannot find name 'wsRef'.
    645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
    646 |
  > 647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
        |            ^^^^^
    648 |
    649 |       wsRef.current.close();
    650 |

ERROR in src/TranslationRoom.tsx:649:7
TS2304: Cannot find name 'wsRef'.
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |
  > 649 |       wsRef.current.close();
        |       ^^^^^
    650 |
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |

ERROR in src/TranslationRoom.tsx:653:9
TS2304: Cannot find name 'wsRef'.
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |
  > 653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
        |         ^^^^^
    654 |
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |

ERROR in src/TranslationRoom.tsx:653:26
TS2304: Cannot find name 'wsRef'.
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |
  > 653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
        |                          ^^^^^
    654 |
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |

ERROR in src/TranslationRoom.tsx:655:7
TS2304: Cannot find name 'wsRef'.
    653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
    654 |
  > 655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
        |       ^^^^^
    656 |
    657 |       wsRef.current.close();    // Clear output video
    658 |

ERROR in src/TranslationRoom.tsx:657:7
TS2304: Cannot find name 'wsRef'.
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |
  > 657 |       wsRef.current.close();    // Clear output video
        |       ^^^^^
    658 |
    659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
    660 |

ERROR in src/TranslationRoom.tsx:659:7
TS2304: Cannot find name 'wsRef'.
    657 |       wsRef.current.close();    // Clear output video
    658 |
  > 659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
        |       ^^^^^
    660 |
    661 |     }    if (outputVideo) {
    662 |

ERROR in src/TranslationRoom.tsx:659:52
TS2304: Cannot find name 'outputVideoRef'.
    657 |       wsRef.current.close();    // Clear output video
    658 |
  > 659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
        |                                                    ^^^^^^^^^^^^^^
    660 |
    661 |     }    if (outputVideo) {
    662 |

ERROR in src/TranslationRoom.tsx:663:7
TS2448: Block-scoped variable 'outputVideo' used before its declaration.
    661 |     }    if (outputVideo) {
    662 |
  > 663 |       outputVideo.pause();
        |       ^^^^^^^^^^^
    664 |
    665 |     // Clear output video      outputVideo.src = '';
    666 |

ERROR in src/TranslationRoom.tsx:667:25
TS2304: Cannot find name 'outputVideoRef'.
    665 |     // Clear output video      outputVideo.src = '';
    666 |
  > 667 |     const outputVideo = outputVideoRef.current;    }
        |                         ^^^^^^^^^^^^^^
    668 |
    669 |     if (outputVideo) {
    670 |

ERROR in src/TranslationRoom.tsx:673:36
TS2304: Cannot find name 'outputHlsRef'.
    671 |       outputVideo.pause();    // Stop HLS if it's running
    672 |
  > 673 |       outputVideo.src = '';    if (outputHlsRef.current) {
        |                                    ^^^^^^^^^^^^
    674 |
    675 |     }      outputHlsRef.current.destroy();
    676 |

ERROR in src/TranslationRoom.tsx:675:12
TS2304: Cannot find name 'outputHlsRef'.
    673 |       outputVideo.src = '';    if (outputHlsRef.current) {
    674 |
  > 675 |     }      outputHlsRef.current.destroy();
        |            ^^^^^^^^^^^^
    676 |
    677 |       outputHlsRef.current = null;
    678 |

ERROR in src/TranslationRoom.tsx:677:7
TS2304: Cannot find name 'outputHlsRef'.
    675 |     }      outputHlsRef.current.destroy();
    676 |
  > 677 |       outputHlsRef.current = null;
        |       ^^^^^^^^^^^^
    678 |
    679 |     // Stop HLS if it's running    }
    680 |

ERROR in src/TranslationRoom.tsx:681:9
TS2304: Cannot find name 'outputHlsRef'.
    679 |     // Stop HLS if it's running    }
    680 |
  > 681 |     if (outputHlsRef.current) {
        |         ^^^^^^^^^^^^
    682 |
    683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
    684 |

ERROR in src/TranslationRoom.tsx:683:7
TS2304: Cannot find name 'outputHlsRef'.
    681 |     if (outputHlsRef.current) {
    682 |
  > 683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
        |       ^^^^^^^^^^^^
    684 |
    685 |       outputHlsRef.current = null;  };
    686 |

ERROR in src/TranslationRoom.tsx:683:42
TS2304: Cannot find name 'setIsTranslating'.
    681 |     if (outputHlsRef.current) {
    682 |
  > 683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
        |                                          ^^^^^^^^^^^^^^^^
    684 |
    685 |       outputHlsRef.current = null;  };
    686 |

ERROR in src/TranslationRoom.tsx:685:7
TS2304: Cannot find name 'outputHlsRef'.
    683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
    684 |
  > 685 |       outputHlsRef.current = null;  };
        |       ^^^^^^^^^^^^
    686 |
    687 |     }
    688 |

ERROR in src/TranslationRoom.tsx:689:41
TS2304: Cannot find name 'languages'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                         ^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:54
TS2304: Cannot find name 'languages'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                      ^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:69
TS7006: Parameter 'l' implicitly has an 'any' type.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                     ^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:86
TS2304: Cannot find name 'selectedLanguage'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                                      ^^^^^^^^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:691:5
TS2304: Cannot find name 'setIsTranslating'.
    689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
    690 |
  > 691 |     setIsTranslating(false);
        |     ^^^^^^^^^^^^^^^^
    692 |
    693 |     setStreamStatus('Stopped');  if (!inSession) {
    694 |

ERROR in src/TranslationRoom.tsx:693:5
TS2304: Cannot find name 'setStreamStatus'.
    691 |     setIsTranslating(false);
    692 |
  > 693 |     setStreamStatus('Stopped');  if (!inSession) {
        |     ^^^^^^^^^^^^^^^
    694 |
    695 |   };    return (
    696 |

ERROR in src/TranslationRoom.tsx:693:39
TS2304: Cannot find name 'inSession'.
    691 |     setIsTranslating(false);
    692 |
  > 693 |     setStreamStatus('Stopped');  if (!inSession) {
        |                                       ^^^^^^^^^
    694 |
    695 |   };    return (
    696 |

ERROR in src/TranslationRoom.tsx:699:72
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    697 |       <div className="translation-container">
    698 |
  > 699 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;        <div className="translation-setup">
        |                                                                        ^
    700 |
    701 |           <h1>🌐 Translation Room</h1>
    702 |

ERROR in src/TranslationRoom.tsx:705:5
TS1005: '}' expected.
    703 |   if (!inSession) {          <p className="subtitle">Select a language and start translating live video content</p>
    704 |
  > 705 |     return (
        |     ^^^^^^
    706 |
    707 |       <div className="translation-container">          {loading ? (
    708 |

ERROR in src/TranslationRoom.tsx:707:57
TS2304: Cannot find name 'loading'.
    705 |     return (
    706 |
  > 707 |       <div className="translation-container">          {loading ? (
        |                                                         ^^^^^^^
    708 |
    709 |         <div className="translation-setup">            <div className="loading">Loading languages...</div>
    710 |

ERROR in src/TranslationRoom.tsx:713:133
TS2304: Cannot find name 'error'.
    711 |           <h1>🌐 Translation Room</h1>          ) : error ? (
    712 |
  > 713 |           <p className="subtitle">Select a language and start translating live video content</p>            <div className="error">{error}</div>
        |                                                                                                                                     ^^^^^
    714 |
    715 |           ) : (
    716 |

ERROR in src/TranslationRoom.tsx:717:12
TS2304: Cannot find name 'loading'.
    715 |           ) : (
    716 |
  > 717 |           {loading ? (            <div className="setup-form">
        |            ^^^^^^^
    718 |
    719 |             <div className="loading">Loading languages...</div>              <div className="form-group">
    720 |

ERROR in src/TranslationRoom.tsx:723:37
TS2304: Cannot find name 'error'.
    721 |           ) : error ? (                <label htmlFor="translatorName">Your Name</label>
    722 |
  > 723 |             <div className="error">{error}</div>                <input
        |                                     ^^^^^
    724 |
    725 |           ) : (                  id="translatorName"
    726 |

ERROR in src/TranslationRoom.tsx:725:11
TS1003: Identifier expected.
    723 |             <div className="error">{error}</div>                <input
    724 |
  > 725 |           ) : (                  id="translatorName"
        |           ^
    726 |
    727 |             <div className="setup-form">                  type="text"
    728 |

ERROR in src/TranslationRoom.tsx:731:91
TS2304: Cannot find name 'translatorName'.
    729 |               <div className="form-group">                  placeholder="Enter your name"
    730 |
  > 731 |                 <label htmlFor="translatorName">Your Name</label>                  value={translatorName}
        |                                                                                           ^^^^^^^^^^^^^^
    732 |
    733 |                 <input                  onChange={(e) => setTranslatorName(e.target.value)}
    734 |

ERROR in src/TranslationRoom.tsx:733:58
TS2304: Cannot find name 'setTranslatorName'.
    731 |                 <label htmlFor="translatorName">Your Name</label>                  value={translatorName}
    732 |
  > 733 |                 <input                  onChange={(e) => setTranslatorName(e.target.value)}
        |                                                          ^^^^^^^^^^^^^^^^^
    734 |
    735 |                   id="translatorName"                  className="translator-input"
    736 |

ERROR in src/TranslationRoom.tsx:741:26
TS2304: Cannot find name 'translatorName'.
    739 |                   placeholder="Enter your name"              </div>
    740 |
  > 741 |                   value={translatorName}
        |                          ^^^^^^^^^^^^^^
    742 |
    743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
    744 |

ERROR in src/TranslationRoom.tsx:743:30
TS7006: Parameter 'e' implicitly has an 'any' type.
    741 |                   value={translatorName}
    742 |
  > 743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
        |                              ^
    744 |
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |

ERROR in src/TranslationRoom.tsx:743:36
TS2304: Cannot find name 'setTranslatorName'.
    741 |                   value={translatorName}
    742 |
  > 743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
        |                                    ^^^^^^^^^^^^^^^^^
    744 |
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |

ERROR in src/TranslationRoom.tsx:747:18
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |
  > 747 |                 />                <select
        |                  ^
    748 |
    749 |               </div>                  id="language"
    750 |

ERROR in src/TranslationRoom.tsx:749:15
TS1003: Identifier expected.
    747 |                 />                <select
    748 |
  > 749 |               </div>                  id="language"
        |               ^^
    750 |
    751 |                   value={selectedLanguage}
    752 |

ERROR in src/TranslationRoom.tsx:751:26
TS2304: Cannot find name 'selectedLanguage'.
    749 |               </div>                  id="language"
    750 |
  > 751 |                   value={selectedLanguage}
        |                          ^^^^^^^^^^^^^^^^
    752 |
    753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
    754 |

ERROR in src/TranslationRoom.tsx:753:16
TS2746: This JSX tag's 'children' prop expects a single child of type 'ReactNode', but multiple children were provided.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                ^^^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:753:72
TS7006: Parameter 'e' implicitly has an 'any' type.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                                                                        ^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:753:78
TS2304: Cannot find name 'setSelectedLanguage'.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                                                                              ^^^^^^^^^^^^^^^^^^^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:761:26
TS2304: Cannot find name 'selectedLanguage'.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                          ^^^^^^^^^^^^^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:761:62
TS2304: Cannot find name 'languages'.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                                                              ^^^^^^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:761:77
TS7006: Parameter 'lang' implicitly has an 'any' type.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                                                                             ^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:763:19
TS2304: Cannot find name 'onChange'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                   ^^^^^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:28
TS2349: This expression is not callable.
  Type '{}' has no call signatures.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                            ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:29
TS1136: Property assignment expected.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                             ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:30
TS2304: Cannot find name 'e'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                              ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:33
TS1005: ')' expected.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                 ^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:34
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                  ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:71
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                       ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:105
TS2304: Cannot find name 'lang'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                                                         ^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:124
TS2304: Cannot find name 'lang'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                                                                            ^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:765:69
TS2304: Cannot find name 'lang'.
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |
  > 765 |                   className="language-select"                      {lang.label}
        |                                                                     ^^^^
    766 |
    767 |                 >                    </option>
    768 |

ERROR in src/TranslationRoom.tsx:767:17
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    765 |                   className="language-select"                      {lang.label}
    766 |
  > 767 |                 >                    </option>
        |                 ^
    768 |
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |

ERROR in src/TranslationRoom.tsx:769:88
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    767 |                 >                    </option>
    768 |
  > 769 |                   <option value="">-- Select a language --</option>                  ))}
        |                                                                                        ^
    770 |
    771 |                   {languages.map((lang) => (                </select>
    772 |

ERROR in src/TranslationRoom.tsx:771:20
TS2304: Cannot find name 'languages'.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                    ^^^^^^^^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:771:35
TS7006: Parameter 'lang' implicitly has an 'any' type.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                                   ^^^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:771:61
TS1109: Expression expected.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                                                             ^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:773:22
TS17008: JSX element 'option' has no corresponding closing tag.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                      ^^^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:773:34
TS2304: Cannot find name 'lang'.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                                  ^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:773:53
TS2304: Cannot find name 'lang'.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                                                     ^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:775:24
TS2304: Cannot find name 'lang'.
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |
  > 775 |                       {lang.label}
        |                        ^^^^
    776 |
    777 |                     </option>              <button
    778 |

ERROR in src/TranslationRoom.tsx:777:23
TS17002: Expected corresponding JSX closing tag for 'div'.
    775 |                       {lang.label}
    776 |
  > 777 |                     </option>              <button
        |                       ^^^^^^
    778 |
    779 |                   ))}                className="join-translation-btn"
    780 |

ERROR in src/TranslationRoom.tsx:779:19
TS1003: Identifier expected.
    777 |                     </option>              <button
    778 |
  > 779 |                   ))}                className="join-translation-btn"
        |                   ^
    780 |
    781 |                 </select>                onClick={handleJoinSession}
    782 |

ERROR in src/TranslationRoom.tsx:779:21
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    777 |                     </option>              <button
    778 |
  > 779 |                   ))}                className="join-translation-btn"
        |                     ^
    780 |
    781 |                 </select>                onClick={handleJoinSession}
    782 |

ERROR in src/TranslationRoom.tsx:781:19
TS17002: Expected corresponding JSX closing tag for 'div'.
    779 |                   ))}                className="join-translation-btn"
    780 |
  > 781 |                 </select>                onClick={handleJoinSession}
        |                   ^^^^^^
    782 |
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |

ERROR in src/TranslationRoom.tsx:781:51
TS2304: Cannot find name 'handleJoinSession'.
    779 |                   ))}                className="join-translation-btn"
    780 |
  > 781 |                 </select>                onClick={handleJoinSession}
        |                                                   ^^^^^^^^^^^^^^^^^
    782 |
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |

ERROR in src/TranslationRoom.tsx:783:37
TS1005: ')' expected.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                     ^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:783:48
TS2304: Cannot find name 'selectedLanguage'.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                                ^^^^^^^^^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:783:69
TS2304: Cannot find name 'translatorName'.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                                                     ^^^^^^^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:785:15
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |
  > 785 |               >
        |               ^
    786 |
    787 |               <button                Join Translation Room
    788 |

ERROR in src/TranslationRoom.tsx:787:38
TS2322: Type '{ Join: true; Translation: true; Room: true; className: string; }' is not assignable to type 'DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>'.
  Property 'Join' does not exist on type 'DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>'.
    785 |               >
    786 |
  > 787 |               <button                Join Translation Room
        |                                      ^^^^
    788 |
    789 |                 className="join-translation-btn"              </button>
    790 |

ERROR in src/TranslationRoom.tsx:789:63
TS1003: Identifier expected.
    787 |               <button                Join Translation Room
    788 |
  > 789 |                 className="join-translation-btn"              </button>
        |                                                               ^^
    790 |
    791 |                 onClick={handleJoinSession}            </div>
    792 |

ERROR in src/TranslationRoom.tsx:789:65
TS17002: Expected corresponding JSX closing tag for 'div'.
    787 |               <button                Join Translation Room
    788 |
  > 789 |                 className="join-translation-btn"              </button>
        |                                                                 ^^^^^^
    790 |
    791 |                 onClick={handleJoinSession}            </div>
    792 |

ERROR in src/TranslationRoom.tsx:791:17
TS1005: ')' expected.
    789 |                 className="join-translation-btn"              </button>
    790 |
  > 791 |                 onClick={handleJoinSession}            </div>
        |                 ^^^^^^^
    792 |
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |

ERROR in src/TranslationRoom.tsx:791:26
TS2304: Cannot find name 'handleJoinSession'.
    789 |                 className="join-translation-btn"              </button>
    790 |
  > 791 |                 onClick={handleJoinSession}            </div>
        |                          ^^^^^^^^^^^^^^^^^
    792 |
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |

ERROR in src/TranslationRoom.tsx:793:28
TS2304: Cannot find name 'selectedLanguage'.
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                            ^^^^^^^^^^^^^^^^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:793:49
TS2304: Cannot find name 'translatorName'.
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                                                 ^^^^^^^^^^^^^^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:793:82
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                                                                                  ^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:795:15
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |
  > 795 |               >        </div>
        |               ^
    796 |
    797 |                 Join Translation Room      </div>
    798 |

ERROR in src/TranslationRoom.tsx:799:15
TS1005: ')' expected.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |               ^^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:799:17
TS2304: Cannot find name 'button'.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |                 ^^^^^^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:799:28
TS1109: Expression expected.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |                            ^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:801:13
TS1128: Declaration or statement expected.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |             ^^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:801:15
TS2304: Cannot find name 'div'.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |               ^^^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:801:21
TS1109: Expression expected.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |                     ^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:803:11
TS1128: Declaration or statement expected.
    801 |             </div>  }
    802 |
  > 803 |           )}
        |           ^
    804 |
    805 |         </div>  return (
    806 |

ERROR in src/TranslationRoom.tsx:803:12
TS1128: Declaration or statement expected.
    801 |             </div>  }
    802 |
  > 803 |           )}
        |            ^
    804 |
    805 |         </div>  return (
    806 |

ERROR in src/TranslationRoom.tsx:805:9
TS1128: Declaration or statement expected.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |         ^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:805:11
TS2304: Cannot find name 'div'.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |           ^^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:805:17
TS1109: Expression expected.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |                 ^^^^^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:807:7
TS1109: Expression expected.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |       ^^
    808 |
    809 |     );      <header className="session-header">
    810 |

ERROR in src/TranslationRoom.tsx:807:9
TS2304: Cannot find name 'div'.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |         ^^^
    808 |
    809 |     );      <header className="session-header">
    810 |

ERROR in src/TranslationRoom.tsx:807:17
TS2657: JSX expressions must have one parent element.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  > 808 |
        | ^
  > 809 |     );      <header className="session-header">
        | ^
  > 810 |
        | ^
  > 811 |   }        <div className="header-info">
        | ^
  > 812 |
        | ^
  > 813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
        | ^
  > 814 |
        | ^
  > 815 |   return (          <span className="translator-badge">{translatorName}</span>
        | ^
  > 816 |
        | ^
  > 817 |     <div className="translation-session">        </div>
        | ^
  > 818 |
        | ^
  > 819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
        | ^
  > 820 |
        | ^
  > 821 |         <div className="header-info">          ← Leave Session
        | ^
  > 822 |
        | ^
  > 823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
        | ^
  > 824 |
        | ^
  > 825 |           <span className="translator-badge">{translatorName}</span>      </header>
        | ^
  > 826 |
        | ^
  > 827 |         </div>
        | ^
  > 828 |
        | ^
  > 829 |         <button className="leave-session-btn" onClick={handleLeaveSession}>      <div className="video-grid">
        | ^
  > 830 |
        | ^
  > 831 |           ← Leave Session        <div className="video-panel">
        | ^
  > 832 |
        | ^
  > 833 |         </button>          <div className="panel-header">
        | ^
  > 834 |
        | ^
  > 835 |       </header>            <h3>📺 Source Video</h3>
        | ^
  > 836 |
        | ^
  > 837 |             <span className="status-badge source">Live</span>
        | ^
  > 838 |
        | ^
  > 839 |       <div className="video-grid">          </div>
        | ^
  > 840 |
        | ^
  > 841 |         <div className="video-panel">          <div className="video-wrapper">
        | ^
  > 842 |
        | ^
  > 843 |           <div className="panel-header">            <video
        | ^
  > 844 |
        | ^
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        | ^
  > 846 |
        | ^
  > 847 |             <span className="status-badge source">Live</span>              className="translation-video"
        | ^
  > 848 |
        | ^
  > 849 |           </div>              controls
        | ^
  > 850 |
        | ^
  > 851 |           <div className="video-wrapper">              muted
        | ^
  > 852 |
        | ^
  > 853 |             <video              playsInline
        | ^
  > 854 |
        | ^
  > 855 |               ref={sourceVideoRef}            />
        | ^
  > 856 |
        | ^
  > 857 |               className="translation-video"          </div>
        | ^
  > 858 |
        | ^
  > 859 |               controls        </div>
        | ^
  > 860 |
        | ^
  > 861 |               muted
        | ^
  > 862 |
        | ^
  > 863 |               playsInline        <div className="video-panel">
        | ^
  > 864 |
        | ^
  > 865 |             />          <div className="panel-header">
        | ^
  > 866 |
        | ^
  > 867 |           </div>            <h3>🎙️ Translation Output</h3>
        | ^
  > 868 |
        | ^
  > 869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
        | ^
  > 870 |
        | ^
  > 871 |               {isTranslating ? 'Streaming' : 'Waiting'}
        | ^
  > 872 |
        | ^
  > 873 |         <div className="video-panel">            </span>
        | ^
  > 874 |
        | ^
  > 875 |           <div className="panel-header">          </div>
        | ^
  > 876 |
        | ^
  > 877 |             <h3>🎙️ Translation Output</h3>          <div className="video-wrapper">
        | ^
  > 878 |
        | ^
  > 879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
        | ^
  > 880 |
        | ^
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        | ^
  > 882 |
        | ^
  > 883 |             </span>              className="translation-video"
        | ^
  > 884 |
        | ^
  > 885 |           </div>              controls
        | ^
  > 886 |
        | ^
  > 887 |           <div className="video-wrapper">              playsInline
        | ^
  > 888 |
        | ^
  > 889 |             <video            />
        | ^
  > 890 |
        | ^
  > 891 |               ref={outputVideoRef}          </div>
        | ^
  > 892 |
        | ^
  > 893 |               className="translation-video"        </div>
        | ^
  > 894 |
        | ^
  > 895 |               controls      </div>
        | ^
  > 896 |
        | ^
  > 897 |               playsInline
        | ^
  > 898 |
        | ^
  > 899 |             />      <div className="control-panel">
        | ^
  > 900 |
        | ^
  > 901 |           </div>        <div className="stream-info">
        | ^
  > 902 |
        | ^
  > 903 |         </div>          <div className="info-item">
        | ^
  > 904 |
        | ^
  > 905 |       </div>            <strong>RTMP Server:</strong> {RTMP_SERVER}
        | ^
  > 906 |
        | ^
  > 907 |           </div>
        | ^
  > 908 |
        | ^
  > 909 |       <div className="control-panel">          <div className="info-item">
        | ^
  > 910 |
        | ^
  > 911 |         <div className="stream-info">            <strong>Stream Key:</strong> {selectedLanguage}
        | ^
  > 912 |
        | ^
  > 913 |           <div className="info-item">          </div>
        | ^
  > 914 |
        | ^
  > 915 |             <strong>RTMP Server:</strong> {RTMP_SERVER}          <div className="info-item">
        | ^
  > 916 |
        | ^
  > 917 |           </div>            <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8
        | ^
  > 918 |
        | ^
  > 919 |           <div className="info-item">          </div>
        | ^
  > 920 |
        | ^
  > 921 |             <strong>Stream Key:</strong> {selectedLanguage}        </div>
        | ^
  > 922 |
        | ^
  > 923 |           </div>
        | ^
  > 924 |
        | ^
  > 925 |           <div className="info-item">        <div className="control-buttons">
        | ^
  > 926 |
        | ^
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        | ^
  > 928 |
        | ^
  > 929 |           </div>            <button className="start-btn" onClick={startTranslation}>
        | ^
  > 930 |
        | ^
  > 931 |           {streamStatus && (              🎙️ Start Translating
        | ^
  > 932 |
        | ^
  > 933 |             <div className="info-item status-info">            </button>
        | ^
  > 934 |
        | ^
  > 935 |               <strong>Status:</strong> {streamStatus}          ) : (
        | ^
  > 936 |
        | ^
  > 937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
        | ^
  > 938 |
        | ^
  > 939 |           )}              ⏹️ Stop Streaming
        | ^
  > 940 |
        | ^
  > 941 |         </div>            </button>
        | ^^^^^^^^^^^^^^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:809:14
TS17008: JSX element 'header' has no corresponding closing tag.
    807 |       </div>    <div className="translation-session">
    808 |
  > 809 |     );      <header className="session-header">
        |              ^^^^^^
    810 |
    811 |   }        <div className="header-info">
    812 |

ERROR in src/TranslationRoom.tsx:811:3
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    809 |     );      <header className="session-header">
    810 |
  > 811 |   }        <div className="header-info">
        |   ^
    812 |
    813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
    814 |

ERROR in src/TranslationRoom.tsx:813:38
TS2304: Cannot find name 'selectedLangObj'.
    811 |   }        <div className="header-info">
    812 |
  > 813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
        |                                      ^^^^^^^^^^^^^^^
    814 |
    815 |   return (          <span className="translator-badge">{translatorName}</span>
    816 |

ERROR in src/TranslationRoom.tsx:815:57
TS2304: Cannot find name 'translatorName'.
    813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
    814 |
  > 815 |   return (          <span className="translator-badge">{translatorName}</span>
        |                                                         ^^^^^^^^^^^^^^
    816 |
    817 |     <div className="translation-session">        </div>
    818 |

ERROR in src/TranslationRoom.tsx:819:97
TS2304: Cannot find name 'handleLeaveSession'.
    817 |     <div className="translation-session">        </div>
    818 |
  > 819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
        |                                                                                                 ^^^^^^^^^^^^^^^^^^
    820 |
    821 |         <div className="header-info">          ← Leave Session
    822 |

ERROR in src/TranslationRoom.tsx:821:10
TS17008: JSX element 'div' has no corresponding closing tag.
    819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
    820 |
  > 821 |         <div className="header-info">          ← Leave Session
        |          ^^^
    822 |
    823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
    824 |

ERROR in src/TranslationRoom.tsx:823:38
TS2304: Cannot find name 'selectedLangObj'.
    821 |         <div className="header-info">          ← Leave Session
    822 |
  > 823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
        |                                      ^^^^^^^^^^^^^^^
    824 |
    825 |           <span className="translator-badge">{translatorName}</span>      </header>
    826 |

ERROR in src/TranslationRoom.tsx:825:47
TS2304: Cannot find name 'translatorName'.
    823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
    824 |
  > 825 |           <span className="translator-badge">{translatorName}</span>      </header>
        |                                               ^^^^^^^^^^^^^^
    826 |
    827 |         </div>
    828 |

ERROR in src/TranslationRoom.tsx:829:56
TS2304: Cannot find name 'handleLeaveSession'.
    827 |         </div>
    828 |
  > 829 |         <button className="leave-session-btn" onClick={handleLeaveSession}>      <div className="video-grid">
        |                                                        ^^^^^^^^^^^^^^^^^^
    830 |
    831 |           ← Leave Session        <div className="video-panel">
    832 |

ERROR in src/TranslationRoom.tsx:833:11
TS17002: Expected corresponding JSX closing tag for 'div'.
    831 |           ← Leave Session        <div className="video-panel">
    832 |
  > 833 |         </button>          <div className="panel-header">
        |           ^^^^^^
    834 |
    835 |       </header>            <h3>📺 Source Video</h3>
    836 |

ERROR in src/TranslationRoom.tsx:835:9
TS17002: Expected corresponding JSX closing tag for 'div'.
    833 |         </button>          <div className="panel-header">
    834 |
  > 835 |       </header>            <h3>📺 Source Video</h3>
        |         ^^^^^^
    836 |
    837 |             <span className="status-badge source">Live</span>
    838 |

ERROR in src/TranslationRoom.tsx:845:14
TS2304: Cannot find name 'h3'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |              ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:14
TS2558: Expected 0 type arguments, but got 1.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |              ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:17
TS1127: Invalid character.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                 ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:34
TS17002: Expected corresponding JSX closing tag for 'div'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                                  ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:56
TS2304: Cannot find name 'sourceVideoRef'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                                                        ^^^^^^^^^^^^^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:855:20
TS2304: Cannot find name 'sourceVideoRef'.
    853 |             <video              playsInline
    854 |
  > 855 |               ref={sourceVideoRef}            />
        |                    ^^^^^^^^^^^^^^
    856 |
    857 |               className="translation-video"          </div>
    858 |

ERROR in src/TranslationRoom.tsx:865:14
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    863 |               playsInline        <div className="video-panel">
    864 |
  > 865 |             />          <div className="panel-header">
        |              ^
    866 |
    867 |           </div>            <h3>🎙️ Translation Output</h3>
    868 |

ERROR in src/TranslationRoom.tsx:869:60
TS2304: Cannot find name 'isTranslating'.
    867 |           </div>            <h3>🎙️ Translation Output</h3>
    868 |
  > 869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
        |                                                            ^^^^^^^^^^^^^
    870 |
    871 |               {isTranslating ? 'Streaming' : 'Waiting'}
    872 |

ERROR in src/TranslationRoom.tsx:871:16
TS2304: Cannot find name 'isTranslating'.
    869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
    870 |
  > 871 |               {isTranslating ? 'Streaming' : 'Waiting'}
        |                ^^^^^^^^^^^^^
    872 |
    873 |         <div className="video-panel">            </span>
    874 |

ERROR in src/TranslationRoom.tsx:873:10
TS17008: JSX element 'div' has no corresponding closing tag.
    871 |               {isTranslating ? 'Streaming' : 'Waiting'}
    872 |
  > 873 |         <div className="video-panel">            </span>
        |          ^^^
    874 |
    875 |           <div className="panel-header">          </div>
    876 |

ERROR in src/TranslationRoom.tsx:879:46
TS2304: Cannot find name 'isTranslating'.
    877 |             <h3>🎙️ Translation Output</h3>          <div className="video-wrapper">
    878 |
  > 879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
        |                                              ^^^^^^^^^^^^^
    880 |
    881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
    882 |

ERROR in src/TranslationRoom.tsx:881:16
TS1005: '...' expected.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:16
TS2304: Cannot find name 'isTranslating'.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:16
TS2698: Spread types may only be created from object types.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:75
TS2304: Cannot find name 'outputVideoRef'.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                                                                           ^^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:883:13
TS1003: Identifier expected.
    881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
    882 |
  > 883 |             </span>              className="translation-video"
        |             ^^
    884 |
    885 |           </div>              controls
    886 |

ERROR in src/TranslationRoom.tsx:891:20
TS2304: Cannot find name 'outputVideoRef'.
    889 |             <video            />
    890 |
  > 891 |               ref={outputVideoRef}          </div>
        |                    ^^^^^^^^^^^^^^
    892 |
    893 |               className="translation-video"        </div>
    894 |

ERROR in src/TranslationRoom.tsx:895:31
TS17002: Expected corresponding JSX closing tag for 'button'.
    893 |               className="translation-video"        </div>
    894 |
  > 895 |               controls      </div>
        |                               ^^^
    896 |
    897 |               playsInline
    898 |

ERROR in src/TranslationRoom.tsx:899:14
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    897 |               playsInline
    898 |
  > 899 |             />      <div className="control-panel">
        |              ^
    900 |
    901 |           </div>        <div className="stream-info">
    902 |

ERROR in src/TranslationRoom.tsx:911:80
TS2304: Cannot find name 'selectedLanguage'.
    909 |       <div className="control-panel">          <div className="info-item">
    910 |
  > 911 |         <div className="stream-info">            <strong>Stream Key:</strong> {selectedLanguage}
        |                                                                                ^^^^^^^^^^^^^^^^
    912 |
    913 |           <div className="info-item">          </div>
    914 |

ERROR in src/TranslationRoom.tsx:917:101
TS2304: Cannot find name 'selectedLanguage'.
    915 |             <strong>RTMP Server:</strong> {RTMP_SERVER}          <div className="info-item">
    916 |
  > 917 |           </div>            <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8
        |                                                                                                     ^^^^^^^^^^^^^^^^
    918 |
    919 |           <div className="info-item">          </div>
    920 |

ERROR in src/TranslationRoom.tsx:921:43
TS2304: Cannot find name 'selectedLanguage'.
    919 |           <div className="info-item">          </div>
    920 |
  > 921 |             <strong>Stream Key:</strong> {selectedLanguage}        </div>
        |                                           ^^^^^^^^^^^^^^^^
    922 |
    923 |           </div>
    924 |

ERROR in src/TranslationRoom.tsx:927:85
TS2304: Cannot find name 'selectedLanguage'.
    925 |           <div className="info-item">        <div className="control-buttons">
    926 |
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        |                                                                                     ^^^^^^^^^^^^^^^^
    928 |
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |

ERROR in src/TranslationRoom.tsx:927:128
TS2304: Cannot find name 'isTranslating'.
    925 |           <div className="info-item">        <div className="control-buttons">
    926 |
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        |                                                                                                                                ^^^^^^^^^^^^^
    928 |
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |

ERROR in src/TranslationRoom.tsx:929:11
TS1109: Expression expected.
    927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
    928 |
  > 929 |           </div>            <button className="start-btn" onClick={startTranslation}>
        |           ^^
    930 |
    931 |           {streamStatus && (              🎙️ Start Translating
    932 |

ERROR in src/TranslationRoom.tsx:931:12
TS2304: Cannot find name 'streamStatus'.
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |
  > 931 |           {streamStatus && (              🎙️ Start Translating
        |            ^^^^^^^^^^^^
    932 |
    933 |             <div className="info-item status-info">            </button>
    934 |

ERROR in src/TranslationRoom.tsx:931:43
TS1127: Invalid character.
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |
  > 931 |           {streamStatus && (              🎙️ Start Translating
        |                                           ^^
    932 |
    933 |             <div className="info-item status-info">            </button>
    934 |

ERROR in src/TranslationRoom.tsx:933:14
TS17008: JSX element 'div' has no corresponding closing tag.
    931 |           {streamStatus && (              🎙️ Start Translating
    932 |
  > 933 |             <div className="info-item status-info">            </button>
        |              ^^^
    934 |
    935 |               <strong>Status:</strong> {streamStatus}          ) : (
    936 |

ERROR in src/TranslationRoom.tsx:935:41
TS2304: Cannot find name 'streamStatus'.
    933 |             <div className="info-item status-info">            </button>
    934 |
  > 935 |               <strong>Status:</strong> {streamStatus}          ) : (
        |                                         ^^^^^^^^^^^^
    936 |
    937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
    938 |

ERROR in src/TranslationRoom.tsx:937:32
TS17008: JSX element 'button' has no corresponding closing tag.
    935 |               <strong>Status:</strong> {streamStatus}          ) : (
    936 |
  > 937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
        |                                ^^^^^^
    938 |
    939 |           )}              ⏹️ Stop Streaming
    940 |

ERROR in src/TranslationRoom.tsx:939:12
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
    938 |
  > 939 |           )}              ⏹️ Stop Streaming
        |            ^
    940 |
    941 |         </div>            </button>
    942 |

ERROR in src/TranslationRoom.tsx:941:27
TS1005: ';' expected.
    939 |           )}              ⏹️ Stop Streaming
    940 |
  > 941 |         </div>            </button>
        |                           ^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:941:29
TS2304: Cannot find name 'button'.
    939 |           )}              ⏹️ Stop Streaming
    940 |
  > 941 |         </div>            </button>
        |                             ^^^^^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:943:11
TS1109: Expression expected.
    941 |         </div>            </button>
    942 |
  > 943 |           )}
        |           ^
    944 |
    945 |         <div className="control-buttons">        </div>
    946 |

ERROR in src/TranslationRoom.tsx:943:12
TS1128: Declaration or statement expected.
    941 |         </div>            </button>
    942 |
  > 943 |           )}
        |            ^
    944 |
    945 |         <div className="control-buttons">        </div>
    946 |

ERROR in src/TranslationRoom.tsx:947:13
TS2304: Cannot find name 'isTranslating'.
    945 |         <div className="control-buttons">        </div>
    946 |
  > 947 |           {!isTranslating ? (
        |             ^^^^^^^^^^^^^
    948 |
    949 |             <button className="start-btn" onClick={startTranslation}>        <div className="rtmp-note">
    950 |

ERROR in src/TranslationRoom.tsx:949:79
TS17008: JSX element 'div' has no corresponding closing tag.
    947 |           {!isTranslating ? (
    948 |
  > 949 |             <button className="start-btn" onClick={startTranslation}>        <div className="rtmp-note">
        |                                                                               ^^^
    950 |
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |

ERROR in src/TranslationRoom.tsx:953:32
TS1005: ')' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                ^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:32
TS2304: Cannot find name 'Consider'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                ^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:41
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                         ^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:41
TS2304: Cannot find name 'using'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                         ^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:47
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                               ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:47
TS2304: Cannot find name 'OBS'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                               ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:51
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                   ^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:51
TS2304: Cannot find name 'Browser'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                   ^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:59
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                           ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:59
TS2304: Cannot find name 'Source'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                           ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:66
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                  ^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:66
TS2304: Cannot find name 'or'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                  ^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:69
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                     ^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:69
TS2304: Cannot find name 'a'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                     ^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:71
TS1435: Unknown keyword or identifier. Did you mean 'string'?
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                       ^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:71
TS2304: Cannot find name 'streaming'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                       ^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:81
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                 ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:81
TS2304: Cannot find name 'server'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                 ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:92
TS1005: '(' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                            ^^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:92
TS2304: Cannot find name 'production'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                            ^^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:103
TS1005: ';' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                                       ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:103
TS2304: Cannot find name 'use'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                                       ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:955:11
TS1003: Identifier expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |           ^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:13
TS1109: Expression expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |             ^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:24
TS1109: Expression expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |                        ^^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:26
TS2304: Cannot find name 'div'.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |                          ^^^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:957:76
TS17002: Expected corresponding JSX closing tag for 'button'.
    955 |           ) : (        </div>
    956 |
  > 957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
        |                                                                            ^^^
    958 |
    959 |               ⏹️ Stop Streaming    </div>
    960 |

ERROR in src/TranslationRoom.tsx:959:15
TS1127: Invalid character.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |               ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:15
TS1128: Declaration or statement expected.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |               ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:16
TS1127: Invalid character.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:18
TS1434: Unexpected keyword or identifier.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                  ^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:18
TS2304: Cannot find name 'Stop'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                  ^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:23
TS1435: Unknown keyword or identifier. Did you mean 'string'?
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                       ^^^^^^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:23
TS2304: Cannot find name 'Streaming'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                       ^^^^^^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:36
TS1128: Declaration or statement expected.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                                    ^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:38
TS2304: Cannot find name 'div'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                                      ^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:961:13
TS1109: Expression expected.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |             ^^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:961:15
TS2304: Cannot find name 'button'.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |               ^^^^^^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:961:24
TS1109: Expression expected.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |                        ^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:963:11
TS1128: Declaration or statement expected.
    961 |             </button>  );
    962 |
  > 963 |           )}};
        |           ^
    964 |
    965 |         </div>
    966 |

ERROR in src/TranslationRoom.tsx:963:13
TS1128: Declaration or statement expected.
    961 |             </button>  );
    962 |
  > 963 |           )}};
        |             ^
    964 |
    965 |         </div>
    966 |

ERROR in src/TranslationRoom.tsx:965:9
TS1128: Declaration or statement expected.
    963 |           )}};
    964 |
  > 965 |         </div>
        |         ^^
    966 |
    967 | export default TranslationRoom;
    968 |

ERROR in src/TranslationRoom.tsx:965:11
TS2304: Cannot find name 'div'.
    963 |           )}};
    964 |
  > 965 |         </div>
        |           ^^^
    966 |
    967 | export default TranslationRoom;
    968 |

ERROR in src/TranslationRoom.tsx:967:1
TS1109: Expression expected.
    965 |         </div>
    966 |
  > 967 | export default TranslationRoom;
        | ^^^^^^
    968 |
    969 |         <div className="rtmp-note">
    970 |           <strong>How it works:</strong> Your microphone audio is combined with the source video and streamed to the RTMP server via a WebSocket bridge. 

ERROR in src/TranslationRoom.tsx:967:16
TS2528: A module cannot have multiple default exports.
    965 |         </div>
    966 |
  > 967 | export default TranslationRoom;
        |                ^^^^^^^^^^^^^^^
    968 |
    969 |         <div className="rtmp-note">
    970 |           <strong>How it works:</strong> Your microphone audio is combined with the source video and streamed to the RTMP server via a WebSocket bridge. 

ERROR in src/TranslationRoom.tsx:973:7
TS1128: Declaration or statement expected.
    971 |           Viewers can watch at the output URL above.
    972 |         </div>
  > 973 |       </div>
        |       ^^
    974 |     </div>
    975 |   );
    976 | };

ERROR in src/TranslationRoom.tsx:973:9
TS2304: Cannot find name 'div'.
    971 |           Viewers can watch at the output URL above.
    972 |         </div>
  > 973 |       </div>
        |         ^^^
    974 |     </div>
    975 |   );
    976 | };

ERROR in src/TranslationRoom.tsx:974:5
TS1109: Expression expected.
    972 |         </div>
    973 |       </div>
  > 974 |     </div>
        |     ^^
    975 |   );
    976 | };
    977 |

ERROR in src/TranslationRoom.tsx:974:7
TS2304: Cannot find name 'div'.
    972 |         </div>
    973 |       </div>
  > 974 |     </div>
        |       ^^^
    975 |   );
    976 | };
    977 |

ERROR in src/TranslationRoom.tsx:975:3
TS1109: Expression expected.
    973 |       </div>
    974 |     </div>
  > 975 |   );
        |   ^
    976 | };
    977 |
    978 | export default TranslationRoom;

ERROR in src/TranslationRoom.tsx:976:1
TS1128: Declaration or statement expected.
    974 |     </div>
    975 |   );
  > 976 | };
        | ^
    977 |
    978 | export default TranslationRoom;
    979 |

ERROR in src/TranslationRoom.tsx:978:16
TS2528: A module cannot have multiple default exports.
    976 | };
    977 |
  > 978 | export default TranslationRoom;
        |                ^^^^^^^^^^^^^^^
    979 |

Compiling...
Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: Property or signature expected (9:20)
ERROR in ./src/TranslationRoom.tsx
Module build failed (from ./node_modules/babel-loader/lib/index.js):
SyntaxError: /home/tniglobal/public_html/live/server/video-conferencing-frontend/src/TranslationRoom.tsx: Identifier 'React' has already been declared. (1:66)

> 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    |                                                                   ^
  2 |
  3 | import Hls from 'hls.js';import Hls from 'hls.js';
  4 |
    at constructor (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:367:19)
    at TypeScriptParserMixin.raise (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:6624:19)
    at TypeScriptScopeHandler.checkRedeclarationInScope (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:1646:19)
    at TypeScriptScopeHandler.declareName (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:1612:12)
    at TypeScriptScopeHandler.declareName (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:4909:11)
    at TypeScriptParserMixin.declareNameFromIdentifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7594:16)
    at TypeScriptParserMixin.checkIdentifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7590:12)
    at TypeScriptParserMixin.checkLVal (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:7527:12)
    at TypeScriptParserMixin.finishImportSpecifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14342:10)
    at TypeScriptParserMixin.parseImportSpecifierLocal (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14339:31)
    at TypeScriptParserMixin.maybeParseDefaultImportSpecifier (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14446:12)
    at TypeScriptParserMixin.parseImportSpecifiersAndAfter (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14315:29)
    at TypeScriptParserMixin.parseImport (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14311:17)
    at TypeScriptParserMixin.parseImport (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9412:26)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12952:27)
    at TypeScriptParserMixin.parseStatementContent (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:9569:18)
    at TypeScriptParserMixin.parseStatementLike (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12843:17)
    at TypeScriptParserMixin.parseModuleItem (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12820:17)
    at TypeScriptParserMixin.parseBlockOrModuleBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13392:36)
    at TypeScriptParserMixin.parseBlockBody (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:13385:10)
    at TypeScriptParserMixin.parseProgram (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12698:10)
    at TypeScriptParserMixin.parseTopLevel (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:12688:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14568:25)
    at TypeScriptParserMixin.parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:10183:18)
    at parse (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/parser/lib/index.js:14602:38)
    at parser (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/parser/index.js:41:34)
    at parser.next (<anonymous>)
    at normalizeFile (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/normalize-file.js:64:37)
    at normalizeFile.next (<anonymous>)
    at run (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transformation/index.js:22:50)
    at run.next (<anonymous>)
    at transform (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/@babel/core/lib/transform.js:22:33)
    at transform.next (<anonymous>)
    at step (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:261:32)
    at /home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:273:13
    at async.call.result.err.err (/home/tniglobal/public_html/live/server/video-conferencing-frontend/node_modules/gensync/index.js:223:11)

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 9:20:  Parsing error: Property or signature expected

webpack compiled with 2 errors
ERROR in src/TranslationRoom.tsx
TS2451: Cannot redeclare block-scoped variable '(Missing)'.

ERROR in src/TranslationRoom.tsx
TS7006: Parameter '(Missing)' implicitly has an 'any' type.

ERROR in src/TranslationRoom.tsx
TS7031: Binding element '(Missing)' implicitly has an 'any' type.

ERROR in src/TranslationRoom.tsx:1:8
TS2300: Duplicate identifier 'React'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |        ^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:17
TS2300: Duplicate identifier 'useState'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                 ^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:27
TS2300: Duplicate identifier 'useEffect'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                           ^^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:38
TS2300: Duplicate identifier 'useRef'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                      ^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:67
TS2300: Duplicate identifier 'React'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                   ^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:76
TS2300: Duplicate identifier 'useState'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                            ^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:86
TS2300: Duplicate identifier 'useEffect'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                                      ^^^^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:1:97
TS2300: Duplicate identifier 'useRef'.
  > 1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
      |                                                                                                 ^^^^^^
    2 |
    3 | import Hls from 'hls.js';import Hls from 'hls.js';
    4 |

ERROR in src/TranslationRoom.tsx:3:8
TS2300: Duplicate identifier 'Hls'.
    1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    2 |
  > 3 | import Hls from 'hls.js';import Hls from 'hls.js';
      |        ^^^
    4 |
    5 | import './TranslationRoom.css';import './TranslationRoom.css';
    6 |

ERROR in src/TranslationRoom.tsx:3:33
TS2300: Duplicate identifier 'Hls'.
    1 | import React, { useState, useEffect, useRef } from 'react';import React, { useState, useEffect, useRef } from 'react';
    2 |
  > 3 | import Hls from 'hls.js';import Hls from 'hls.js';
      |                                 ^^^
    4 |
    5 | import './TranslationRoom.css';import './TranslationRoom.css';
    6 |

ERROR in src/TranslationRoom.tsx:9:21
TS1131: Property or signature expected.
     7 |
     8 |
  >  9 | interface Language {interface Language {
       |                     ^^^^^^^^^
    10 |
    11 |   label: string;  label: string;
    12 |

ERROR in src/TranslationRoom.tsx:11:3
TS2300: Duplicate identifier 'label'.
     9 | interface Language {interface Language {
    10 |
  > 11 |   label: string;  label: string;
       |   ^^^^^
    12 |
    13 |   value: string;  value: string;
    14 |

ERROR in src/TranslationRoom.tsx:11:19
TS2300: Duplicate identifier 'label'.
     9 | interface Language {interface Language {
    10 |
  > 11 |   label: string;  label: string;
       |                   ^^^^^
    12 |
    13 |   value: string;  value: string;
    14 |

ERROR in src/TranslationRoom.tsx:13:3
TS2300: Duplicate identifier 'value'.
    11 |   label: string;  label: string;
    12 |
  > 13 |   value: string;  value: string;
       |   ^^^^^
    14 |
    15 |   code: string;}
    16 |

ERROR in src/TranslationRoom.tsx:13:19
TS2300: Duplicate identifier 'value'.
    11 |   label: string;  label: string;
    12 |
  > 13 |   value: string;  value: string;
       |                   ^^^^^
    14 |
    15 |   code: string;}
    16 |

ERROR in src/TranslationRoom.tsx:17:1
TS1128: Declaration or statement expected.
    15 |   code: string;}
    16 |
  > 17 | }
       | ^
    18 |
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |

ERROR in src/TranslationRoom.tsx:19:7
TS2451: Cannot redeclare block-scoped variable 'SOURCE_VIDEO_URL'.
    17 | }
    18 |
  > 19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
       |       ^^^^^^^^^^^^^^^^
    20 |
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |

ERROR in src/TranslationRoom.tsx:21:7
TS2451: Cannot redeclare block-scoped variable 'SOURCE_VIDEO_URL'.
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |
  > 21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
       |       ^^^^^^^^^^^^^^^^
    22 |
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |

ERROR in src/TranslationRoom.tsx:21:133
TS2451: Cannot redeclare block-scoped variable 'RTMP_SERVER'.
    19 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';
    20 |
  > 21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
       |                                                                                                                                     ^^^^^^^^^^^
    22 |
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |

ERROR in src/TranslationRoom.tsx:23:7
TS2451: Cannot redeclare block-scoped variable 'RTMP_SERVER'.
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |
  > 23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
       |       ^^^^^^^^^^^
    24 |
    25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
    26 |

ERROR in src/TranslationRoom.tsx:23:78
TS2451: Cannot redeclare block-scoped variable 'BRIDGE_SERVER_URL'.
    21 | const SOURCE_VIDEO_URL = 'https://2nbyjxnbl53k-hls-live.5centscdn.com/RTV/59a49be6dc0f146c57cd9ee54da323b1.sdp/playlist.m3u8';const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';
    22 |
  > 23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
       |                                                                              ^^^^^^^^^^^^^^^^^
    24 |
    25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
    26 |

ERROR in src/TranslationRoom.tsx:25:7
TS2451: Cannot redeclare block-scoped variable 'BRIDGE_SERVER_URL'.
    23 | const RTMP_SERVER = 'rtmp://tni-ingest.cdn.cscloudws.com/translations';const BRIDGE_SERVER_URL = 'ws://localhost:3030'; // WebSocket bridge server
    24 |
  > 25 | const BRIDGE_SERVER_URL = 'ws://localhost:3030';// const RTMP_USERNAME = 'trans1'; // Will be used when implementing RTMP streaming
       |       ^^^^^^^^^^^^^^^^^
    26 |
    27 | // const RTMP_PASSWORD = '244PLK'; // Will be used when implementing RTMP streaming
    28 |

ERROR in src/TranslationRoom.tsx:29:7
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    27 | // const RTMP_PASSWORD = '244PLK'; // Will be used when implementing RTMP streaming
    28 |
  > 29 | const TranslationRoom: React.FC = () => {
       |       ^^^^^^^^^^^^^^^
    30 |
    31 |   const [languages, setLanguages] = useState<Language[]>([]);// Default fallback languages in case API fails
    32 |

ERROR in src/TranslationRoom.tsx:35:3
TS1137: Expression or comma expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |   ^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:79
TS2695: Left side of comma operator is unused and has no side effects.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                               ^^^^^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:90
TS2304: Cannot find name 'value'.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                          ^^^^^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:95
TS1005: ';' expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                               ^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:35:103
TS1128: Declaration or statement expected.
    33 |   const [selectedLanguage, setSelectedLanguage] = useState<string>('');const DEFAULT_LANGUAGES: Language[] = [
    34 |
  > 35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
       |                                                                                                       ^
    36 |
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |

ERROR in src/TranslationRoom.tsx:37:73
TS2695: Left side of comma operator is unused and has no side effects.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                         ^^^^^^^^^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:84
TS2304: Cannot find name 'value'.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                    ^^^^^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:89
TS1005: ';' expected.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                         ^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:37:97
TS1128: Declaration or statement expected.
    35 |   const [translatorName, setTranslatorName] = useState<string>('');  { label: 'English', value: 'en' },
    36 |
  > 37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
       |                                                                                                 ^
    38 |
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |

ERROR in src/TranslationRoom.tsx:39:81
TS2695: Left side of comma operator is unused and has no side effects.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                 ^^^^^^^^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:91
TS2304: Cannot find name 'value'.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                           ^^^^^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:96
TS1005: ';' expected.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                                ^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:39:104
TS1128: Declaration or statement expected.
    37 |   const [inSession, setInSession] = useState<boolean>(false);  { label: 'Spanish', value: 'es' },
    38 |
  > 39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
       |                                                                                                        ^
    40 |
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |

ERROR in src/TranslationRoom.tsx:41:68
TS2695: Left side of comma operator is unused and has no side effects.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                    ^^^^^^^^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:78
TS2304: Cannot find name 'value'.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                              ^^^^^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:83
TS1005: ';' expected.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                                   ^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:41:91
TS1128: Declaration or statement expected.
    39 |   const [isTranslating, setIsTranslating] = useState<boolean>(false);  { label: 'French', value: 'fr' },
    40 |
  > 41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
       |                                                                                           ^
    42 |
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |

ERROR in src/TranslationRoom.tsx:43:61
TS2695: Left side of comma operator is unused and has no side effects.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                             ^^^^^^^^^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:43:72
TS2304: Cannot find name 'value'.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                                        ^^^^^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:43:77
TS1005: ';' expected.
    41 |   const [loading, setLoading] = useState<boolean>(true);  { label: 'German', value: 'de' },
    42 |
  > 43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
       |                                                                             ^
    44 |
    45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
    46 |

ERROR in src/TranslationRoom.tsx:45:64
TS1128: Declaration or statement expected.
    43 |   const [error, setError] = useState<string>('');  { label: 'Italian', value: 'it' }
    44 |
  > 45 |   const [streamStatus, setStreamStatus] = useState<string>('');];
       |                                                                ^
    46 |
    47 |
    48 |

ERROR in src/TranslationRoom.tsx:49:63
TS2322: Type '() => void' is not assignable to type 'FC<{}>'.
  Type 'void' is not assignable to type 'ReactElement<any, any> | null'.
    47 |
    48 |
  > 49 |   const sourceVideoRef = useRef<HTMLVideoElement>(null);const TranslationRoom: React.FC = () => {
       |                                                               ^^^^^^^^^^^^^^^
    50 |
    51 |   const outputVideoRef = useRef<HTMLVideoElement>(null);  const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
    52 |

ERROR in src/TranslationRoom.tsx:51:9
TS2451: Cannot redeclare block-scoped variable 'outputVideoRef'.
    49 |   const sourceVideoRef = useRef<HTMLVideoElement>(null);const TranslationRoom: React.FC = () => {
    50 |
  > 51 |   const outputVideoRef = useRef<HTMLVideoElement>(null);  const [languages, setLanguages] = useState<Language[]>(DEFAULT_LANGUAGES);
       |         ^^^^^^^^^^^^^^
    52 |
    53 |   const mediaRecorderRef = useRef<MediaRecorder | null>(null);  const [selectedLanguage, setSelectedLanguage] = useState<string>('');
    54 |

ERROR in src/TranslationRoom.tsx:59:9
TS2451: Cannot redeclare block-scoped variable 'hlsInstanceRef'.
    57 |   const combinedStreamRef = useRef<MediaStream | null>(null);  const [inSession, setInSession] = useState<boolean>(false);
    58 |
  > 59 |   const hlsInstanceRef = useRef<Hls | null>(null);  const [isTranslating, setIsTranslating] = useState<boolean>(false);
       |         ^^^^^^^^^^^^^^
    60 |
    61 |   const outputHlsRef = useRef<Hls | null>(null);  const [loading, setLoading] = useState<boolean>(true);
    62 |

ERROR in src/TranslationRoom.tsx:61:9
TS2451: Cannot redeclare block-scoped variable 'outputHlsRef'.
    59 |   const hlsInstanceRef = useRef<Hls | null>(null);  const [isTranslating, setIsTranslating] = useState<boolean>(false);
    60 |
  > 61 |   const outputHlsRef = useRef<Hls | null>(null);  const [loading, setLoading] = useState<boolean>(true);
       |         ^^^^^^^^^^^^
    62 |
    63 |   const wsRef = useRef<WebSocket | null>(null);  const [error, setError] = useState<string>('');
    64 |

ERROR in src/TranslationRoom.tsx:69:9
TS2451: Cannot redeclare block-scoped variable 'outputVideoRef'.
    67 |   const animationFrameRef = useRef<number | null>(null);  const sourceVideoRef = useRef<HTMLVideoElement>(null);
    68 |
  > 69 |   const outputVideoRef = useRef<HTMLVideoElement>(null);
       |         ^^^^^^^^^^^^^^
    70 |
    71 |   // Fetch languages on component mount  const mediaRecorderRef = useRef<MediaRecorder | null>(null);
    72 |

ERROR in src/TranslationRoom.tsx:77:18
TS2451: Cannot redeclare block-scoped variable 'hlsInstanceRef'.
    75 |     fetchLanguages();  const combinedStreamRef = useRef<MediaStream | null>(null);
    76 |
  > 77 |   }, []);  const hlsInstanceRef = useRef<Hls | null>(null);
       |                  ^^^^^^^^^^^^^^
    78 |
    79 |   const outputHlsRef = useRef<Hls | null>(null);
    80 |

ERROR in src/TranslationRoom.tsx:79:9
TS2451: Cannot redeclare block-scoped variable 'outputHlsRef'.
    77 |   }, []);  const hlsInstanceRef = useRef<Hls | null>(null);
    78 |
  > 79 |   const outputHlsRef = useRef<Hls | null>(null);
       |         ^^^^^^^^^^^^
    80 |
    81 |   const fetchLanguages = async () => {  const wsRef = useRef<WebSocket | null>(null);
    82 |

ERROR in src/TranslationRoom.tsx:95:70
TS1128: Declaration or statement expected.
    93 |       if (!response.ok) {    fetchLanguages();
    94 |
  > 95 |         throw new Error(`HTTP error! status: ${response.status}`);  }, []);
       |                                                                      ^
    96 |
    97 |       }
    98 |

ERROR in src/TranslationRoom.tsx:95:74
TS1005: ';' expected.
    93 |       if (!response.ok) {    fetchLanguages();
    94 |
  > 95 |         throw new Error(`HTTP error! status: ${response.status}`);  }, []);
       |                                                                          ^
    96 |
    97 |       }
    98 |

ERROR in src/TranslationRoom.tsx:99:9
TS1472: 'catch' or 'finally' expected.
     97 |       }
     98 |
  >  99 |         const fetchLanguages = async () => {
        |         ^^^^^
    100 |
    101 |       const result = await response.json();    try {
    102 |

ERROR in src/TranslationRoom.tsx:101:28
TS2304: Cannot find name 'response'.
     99 |         const fetchLanguages = async () => {
    100 |
  > 101 |       const result = await response.json();    try {
        |                            ^^^^^^^^
    102 |
    103 |             setLoading(true);
    104 |

ERROR in src/TranslationRoom.tsx:107:11
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |           ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:29
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                             ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:58
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                                                          ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:107:74
TS2448: Block-scoped variable 'result' used before its declaration.
    105 |       // API returns: {success: boolean, message: object, data: array}      setError('');
    106 |
  > 107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
        |                                                                          ^^^^^^
    108 |
    109 |         setLanguages(result.data);      
    110 |

ERROR in src/TranslationRoom.tsx:109:22
TS2448: Block-scoped variable 'result' used before its declaration.
    107 |       if (result.success && result.data && Array.isArray(result.data) && result.data.length > 0) {      const response = await fetch('https://mediathek.tniglobal.org/api/rorlanguagesDropdown');
    108 |
  > 109 |         setLanguages(result.data);      
        |                      ^^^^^^
    110 |
    111 |         console.log(`Loaded ${result.data.length} languages from API`);      if (!response.ok) {
    112 |

ERROR in src/TranslationRoom.tsx:111:31
TS2448: Block-scoped variable 'result' used before its declaration.
    109 |         setLanguages(result.data);      
    110 |
  > 111 |         console.log(`Loaded ${result.data.length} languages from API`);      if (!response.ok) {
        |                               ^^^^^^
    112 |
    113 |       } else {        throw new Error(`HTTP error! status: ${response.status}`);
    114 |

ERROR in src/TranslationRoom.tsx:115:66
TS2448: Block-scoped variable 'result' used before its declaration.
    113 |       } else {        throw new Error(`HTTP error! status: ${response.status}`);
    114 |
  > 115 |         console.error('API did not return valid language data:', result);      }
        |                                                                  ^^^^^^
    116 |
    117 |         setError('Failed to load languages from API. Please try again.');      
    118 |

ERROR in src/TranslationRoom.tsx:119:35
TS2304: Cannot find name 'response'.
    117 |         setError('Failed to load languages from API. Please try again.');      
    118 |
  > 119 |       }      const result = await response.json();
        |                                   ^^^^^^^^
    120 |
    121 |             
    122 |

ERROR in src/TranslationRoom.tsx:133:14
TS1128: Declaration or statement expected.
    131 |       setLoading(false);        console.log(`Loaded ${result.data.length} languages from API`);
    132 |
  > 133 |     }      } else {
        |              ^^^^
    134 |
    135 |   };        console.error('API did not return valid language data:', result);
    136 |

ERROR in src/TranslationRoom.tsx:145:20
TS1005: 'try' expected.
    143 |       alert('Please select a language and enter your name');      setLoading(false);
    144 |
  > 145 |       return;    } catch (err) {
        |                    ^^^^^
    146 |
    147 |     }      console.error('Error fetching languages:', err);
    148 |

ERROR in src/TranslationRoom.tsx:147:55
TS2304: Cannot find name 'err'.
    145 |       return;    } catch (err) {
    146 |
  > 147 |     }      console.error('Error fetching languages:', err);
        |                                                       ^^^
    148 |
    149 |     setInSession(true);      setError('Failed to load languages from API. Please try again.')
    150 |

ERROR in src/TranslationRoom.tsx:161:10
TS1005: ',' expected.
    159 |       stopTranslation();  const handleJoinSession = () => {
    160 |
  > 161 |     }    if (!selectedLanguage || !translatorName.trim()) {
        |          ^^
    162 |
    163 |     setInSession(false);      alert('Please select a language and enter your name');
    164 |

ERROR in src/TranslationRoom.tsx:187:11
TS2304: Cannot find name 'hlsInstanceRef'.
    185 |     return () => {    setSelectedLanguage('');
    186 |
  > 187 |       if (hlsInstanceRef.current) {    setTranslatorName('');
        |           ^^^^^^^^^^^^^^
    188 |
    189 |         hlsInstanceRef.current.destroy();  };
    190 |

ERROR in src/TranslationRoom.tsx:189:9
TS2304: Cannot find name 'hlsInstanceRef'.
    187 |       if (hlsInstanceRef.current) {    setTranslatorName('');
    188 |
  > 189 |         hlsInstanceRef.current.destroy();  };
        |         ^^^^^^^^^^^^^^
    190 |
    191 |       }
    192 |

ERROR in src/TranslationRoom.tsx:193:11
TS2304: Cannot find name 'outputHlsRef'.
    191 |       }
    192 |
  > 193 |       if (outputHlsRef.current) {  // Initialize source video when entering session
        |           ^^^^^^^^^^^^
    194 |
    195 |         outputHlsRef.current.destroy();  useEffect(() => {
    196 |

ERROR in src/TranslationRoom.tsx:195:9
TS2304: Cannot find name 'outputHlsRef'.
    193 |       if (outputHlsRef.current) {  // Initialize source video when entering session
    194 |
  > 195 |         outputHlsRef.current.destroy();  useEffect(() => {
        |         ^^^^^^^^^^^^
    196 |
    197 |       }    if (inSession && sourceVideoRef.current) {
    198 |

ERROR in src/TranslationRoom.tsx:197:12
TS1005: ',' expected.
    195 |         outputHlsRef.current.destroy();  useEffect(() => {
    196 |
  > 197 |       }    if (inSession && sourceVideoRef.current) {
        |            ^^
    198 |
    199 |     };      initializeSourceVideo();
    200 |

ERROR in src/TranslationRoom.tsx:201:4
TS1128: Declaration or statement expected.
    199 |     };      initializeSourceVideo();
    200 |
  > 201 |   }, [inSession]);    }
        |    ^
    202 |
    203 |
    204 |

ERROR in src/TranslationRoom.tsx:201:17
TS1005: ';' expected.
    199 |     };      initializeSourceVideo();
    200 |
  > 201 |   }, [inSession]);    }
        |                 ^
    202 |
    203 |
    204 |

ERROR in src/TranslationRoom.tsx:205:51
TS2695: Left side of comma operator is unused and has no side effects.
    203 |
    204 |
  > 205 |   const initializeSourceVideo = () => {    return () => {
        |                                                   ^^^^^^^
    206 |
    207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
    208 |

ERROR in src/TranslationRoom.tsx:207:19
TS2304: Cannot find name 'sourceVideoRef'.
    205 |   const initializeSourceVideo = () => {    return () => {
    206 |
  > 207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
        |                   ^^^^^^^^^^^^^^
    208 |
    209 |     if (!video) return;        hlsInstanceRef.current.destroy();
    210 |

ERROR in src/TranslationRoom.tsx:207:52
TS2304: Cannot find name 'hlsInstanceRef'.
    205 |   const initializeSourceVideo = () => {    return () => {
    206 |
  > 207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
        |                                                    ^^^^^^^^^^^^^^
    208 |
    209 |     if (!video) return;        hlsInstanceRef.current.destroy();
    210 |

ERROR in src/TranslationRoom.tsx:209:32
TS2304: Cannot find name 'hlsInstanceRef'.
    207 |     const video = sourceVideoRef.current;      if (hlsInstanceRef.current) {
    208 |
  > 209 |     if (!video) return;        hlsInstanceRef.current.destroy();
        |                                ^^^^^^^^^^^^^^
    210 |
    211 |       }
    212 |

ERROR in src/TranslationRoom.tsx:213:39
TS2304: Cannot find name 'outputHlsRef'.
    211 |       }
    212 |
  > 213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
        |                                       ^^^^^^^^^^^^
    214 |
    215 |       const hls = new Hls({        outputHlsRef.current.destroy();
    216 |

ERROR in src/TranslationRoom.tsx:215:36
TS18004: No value exists in scope for the shorthand property 'outputHlsRef'. Either declare one or provide an initializer.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                    ^^^^^^^^^^^^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:215:48
TS1005: ',' expected.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                                ^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:215:66
TS1005: ',' expected.
    213 |     if (Hls.isSupported()) {      if (outputHlsRef.current) {
    214 |
  > 215 |       const hls = new Hls({        outputHlsRef.current.destroy();
        |                                                                  ^
    216 |
    217 |         enableWorker: true,      }
    218 |

ERROR in src/TranslationRoom.tsx:219:9
TS1005: ',' expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:9
TS2304: Cannot find name 'lowLatencyMode'.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:9
TS2554: Expected 0-1 arguments, but got 3.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |         ^^^^^^^^^^^^^^^^^^^^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:23
TS1005: ',' expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |                       ^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:219:34
TS1135: Argument expression expected.
    217 |         enableWorker: true,      }
    218 |
  > 219 |         lowLatencyMode: true,    };
        |                                  ^
    220 |
    221 |       });  }, [inSession]);
    222 |

ERROR in src/TranslationRoom.tsx:221:8
TS1128: Declaration or statement expected.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |        ^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:221:16
TS2304: Cannot find name 'inSession'.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |                ^^^^^^^^^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:221:26
TS1005: ';' expected.
    219 |         lowLatencyMode: true,    };
    220 |
  > 221 |       });  }, [inSession]);
        |                          ^
    222 |
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |

ERROR in src/TranslationRoom.tsx:223:7
TS2304: Cannot find name 'hls'.
    221 |       });  }, [inSession]);
    222 |
  > 223 |       hls.loadSource(SOURCE_VIDEO_URL);
        |       ^^^
    224 |
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |

ERROR in src/TranslationRoom.tsx:225:7
TS2304: Cannot find name 'hls'.
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |
  > 225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
        |       ^^^
    226 |
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |

ERROR in src/TranslationRoom.tsx:225:23
TS2304: Cannot find name 'video'.
    223 |       hls.loadSource(SOURCE_VIDEO_URL);
    224 |
  > 225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
        |                       ^^^^^
    226 |
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |

ERROR in src/TranslationRoom.tsx:227:7
TS2304: Cannot find name 'hls'.
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |
  > 227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
        |       ^^^
    228 |
    229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
    230 |

ERROR in src/TranslationRoom.tsx:227:67
TS2304: Cannot find name 'sourceVideoRef'.
    225 |       hls.attachMedia(video);  const initializeSourceVideo = () => {
    226 |
  > 227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
        |                                                                   ^^^^^^^^^^^^^^
    228 |
    229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
    230 |

ERROR in src/TranslationRoom.tsx:229:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    227 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {    const video = sourceVideoRef.current;
    228 |
  > 229 |         video.play().catch(e => console.error('Error playing source video:', e));    if (!video) return;
        |                            ^
    230 |
    231 |       });
    232 |

ERROR in src/TranslationRoom.tsx:233:7
TS2304: Cannot find name 'hlsInstanceRef'.
    231 |       });
    232 |
  > 233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
        |       ^^^^^^^^^^^^^^
    234 |
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |

ERROR in src/TranslationRoom.tsx:233:32
TS2304: Cannot find name 'hls'.
    231 |       });
    232 |
  > 233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
        |                                ^^^
    234 |
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |

ERROR in src/TranslationRoom.tsx:235:16
TS2304: Cannot find name 'video'.
    233 |       hlsInstanceRef.current = hls;    if (Hls.isSupported()) {
    234 |
  > 235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
        |                ^^^^^
    236 |
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |

ERROR in src/TranslationRoom.tsx:237:7
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |       ^^^^^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:7
TS2345: Argument of type '{ video: any; "": any; enableWorker: true; }' is not assignable to parameter of type 'Partial<HlsConfig>'.
  Object literal may only specify known properties, and 'video' does not exist in type 'Partial<HlsConfig>'.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |       ^^^^^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:12
TS1005: ',' expected.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |            ^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:237:35
TS1005: ',' expected.
    235 |     } else if (video.canPlayType('application/vnd.apple.mpegurl')) {      const hls = new Hls({
    236 |
  > 237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
        |                                   ^
    238 |
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |

ERROR in src/TranslationRoom.tsx:239:7
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |       ^^^^^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:239:12
TS1005: ',' expected.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |            ^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:239:79
TS2695: Left side of comma operator is unused and has no side effects.
    237 |       video.src = SOURCE_VIDEO_URL;        enableWorker: true,
    238 |
  > 239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
        |                                                                               ^^^^
    240 |
    241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
    242 |

ERROR in src/TranslationRoom.tsx:241:9
TS2304: Cannot find name 'video'.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |         ^^^^^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:241:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |                            ^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:241:90
TS1005: ',' expected.
    239 |       video.addEventListener('loadedmetadata', () => {        lowLatencyMode: true,
    240 |
  > 241 |         video.play().catch(e => console.error('Error playing source video:', e));      });
        |                                                                                          ^
    242 |
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |

ERROR in src/TranslationRoom.tsx:245:12
TS2304: Cannot find name 'hls'.
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |
  > 245 |     }      hls.attachMedia(video);
        |            ^^^
    246 |
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |

ERROR in src/TranslationRoom.tsx:245:28
TS2304: Cannot find name 'video'.
    243 |       });      hls.loadSource(SOURCE_VIDEO_URL);
    244 |
  > 245 |     }      hls.attachMedia(video);
        |                            ^^^^^
    246 |
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |

ERROR in src/TranslationRoom.tsx:247:11
TS2304: Cannot find name 'hls'.
    245 |     }      hls.attachMedia(video);
    246 |
  > 247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
        |           ^^^
    248 |
    249 |         video.play().catch(e => console.error('Error playing source video:', e));
    250 |

ERROR in src/TranslationRoom.tsx:249:9
TS2304: Cannot find name 'video'.
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |
  > 249 |         video.play().catch(e => console.error('Error playing source video:', e));
        |         ^^^^^
    250 |
    251 |   const startTranslation = async () => {      });
    252 |

ERROR in src/TranslationRoom.tsx:249:28
TS7006: Parameter 'e' implicitly has an 'any' type.
    247 |   };      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    248 |
  > 249 |         video.play().catch(e => console.error('Error playing source video:', e));
        |                            ^
    250 |
    251 |   const startTranslation = async () => {      });
    252 |

ERROR in src/TranslationRoom.tsx:251:48
TS1005: ',' expected.
    249 |         video.play().catch(e => console.error('Error playing source video:', e));
    250 |
  > 251 |   const startTranslation = async () => {      });
        |                                                ^
    252 |
    253 |     try {      hlsInstanceRef.current = hls;
    254 |

ERROR in src/TranslationRoom.tsx:253:16
TS2304: Cannot find name 'hlsInstanceRef'.
    251 |   const startTranslation = async () => {      });
    252 |
  > 253 |     try {      hlsInstanceRef.current = hls;
        |                ^^^^^^^^^^^^^^
    254 |
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |

ERROR in src/TranslationRoom.tsx:253:41
TS2304: Cannot find name 'hls'.
    251 |   const startTranslation = async () => {      });
    252 |
  > 253 |     try {      hlsInstanceRef.current = hls;
        |                                         ^^^
    254 |
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |

ERROR in src/TranslationRoom.tsx:255:7
TS2304: Cannot find name 'setStreamStatus'.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |       ^^^^^^^^^^^^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:255:48
TS1472: 'catch' or 'finally' expected.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |                                                ^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:255:57
TS2304: Cannot find name 'video'.
    253 |     try {      hlsInstanceRef.current = hls;
    254 |
  > 255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
        |                                                         ^^^^^
    256 |
    257 |       video.src = SOURCE_VIDEO_URL;
    258 |

ERROR in src/TranslationRoom.tsx:257:7
TS2304: Cannot find name 'video'.
    255 |       setStreamStatus('Initializing...');    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
    256 |
  > 257 |       video.src = SOURCE_VIDEO_URL;
        |       ^^^^^
    258 |
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |

ERROR in src/TranslationRoom.tsx:261:78
TS18004: No value exists in scope for the shorthand property 'video'. Either declare one or provide an initializer.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                              ^^^^^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:83
TS1005: ',' expected.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                   ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:83
TS2345: Argument of type '{ video: any; "": any; audio: {}; }' is not assignable to parameter of type 'MediaStreamConstraints'.
  Object literal may only specify known properties, and '(Missing)' does not exist in type 'MediaStreamConstraints'.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:97
TS7006: Parameter 'e' implicitly has an 'any' type.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                                 ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:261:150
TS1005: ',' expected.
    259 |       // Get microphone audio      video.addEventListener('loadedmetadata', () => {
    260 |
  > 261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
        |                                                                                                                                                      ^
    262 |
    263 |         audio: {      });
    264 |

ERROR in src/TranslationRoom.tsx:263:24
TS1005: ',' expected.
    261 |       const audioStream = await navigator.mediaDevices.getUserMedia({        video.play().catch(e => console.error('Error playing source video:', e));
    262 |
  > 263 |         audio: {      });
        |                        ^
    264 |
    265 |           echoCancellation: true,    }
    266 |

ERROR in src/TranslationRoom.tsx:265:29
TS2695: Left side of comma operator is unused and has no side effects.
    263 |         audio: {      });
    264 |
  > 265 |           echoCancellation: true,    }
        |                             ^^^^
    266 |
    267 |           noiseSuppression: true,  };
    268 |

ERROR in src/TranslationRoom.tsx:265:38
TS1109: Expression expected.
    263 |         audio: {      });
    264 |
  > 265 |           echoCancellation: true,    }
        |                                      ^
    266 |
    267 |           noiseSuppression: true,  };
    268 |

ERROR in src/TranslationRoom.tsx:267:29
TS2695: Left side of comma operator is unused and has no side effects.
    265 |           echoCancellation: true,    }
    266 |
  > 267 |           noiseSuppression: true,  };
        |                             ^^^^
    268 |
    269 |           autoGainControl: true,
    270 |

ERROR in src/TranslationRoom.tsx:267:36
TS1109: Expression expected.
    265 |           echoCancellation: true,    }
    266 |
  > 267 |           noiseSuppression: true,  };
        |                                    ^
    268 |
    269 |           autoGainControl: true,
    270 |

ERROR in src/TranslationRoom.tsx:269:28
TS2695: Left side of comma operator is unused and has no side effects.
    267 |           noiseSuppression: true,  };
    268 |
  > 269 |           autoGainControl: true,
        |                            ^^^^
    270 |
    271 |         },  const startTranslation = async () => {
    272 |

ERROR in src/TranslationRoom.tsx:271:9
TS1109: Expression expected.
    269 |           autoGainControl: true,
    270 |
  > 271 |         },  const startTranslation = async () => {
        |         ^
    272 |
    273 |         video: false,    try {
    274 |

ERROR in src/TranslationRoom.tsx:271:10
TS1128: Declaration or statement expected.
    269 |           autoGainControl: true,
    270 |
  > 271 |         },  const startTranslation = async () => {
        |          ^
    272 |
    273 |         video: false,    try {
    274 |

ERROR in src/TranslationRoom.tsx:273:16
TS2695: Left side of comma operator is unused and has no side effects.
    271 |         },  const startTranslation = async () => {
    272 |
  > 273 |         video: false,    try {
        |                ^^^^^
    274 |
    275 |       });      setIsTranslating(true);
    276 |

ERROR in src/TranslationRoom.tsx:273:26
TS1109: Expression expected.
    271 |         },  const startTranslation = async () => {
    272 |
  > 273 |         video: false,    try {
        |                          ^^^
    274 |
    275 |       });      setIsTranslating(true);
    276 |

ERROR in src/TranslationRoom.tsx:275:8
TS1472: 'catch' or 'finally' expected.
    273 |         video: false,    try {
    274 |
  > 275 |       });      setIsTranslating(true);
        |        ^
    276 |
    277 |
    278 |

ERROR in src/TranslationRoom.tsx:275:16
TS2304: Cannot find name 'setIsTranslating'.
    273 |         video: false,    try {
    274 |
  > 275 |       });      setIsTranslating(true);
        |                ^^^^^^^^^^^^^^^^
    276 |
    277 |
    278 |

ERROR in src/TranslationRoom.tsx:279:7
TS2304: Cannot find name 'audioStreamRef'.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |       ^^^^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:279:32
TS2448: Block-scoped variable 'audioStream' used before its declaration.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |                                ^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:279:32
TS2454: Variable 'audioStream' is used before being assigned.
    277 |
    278 |
  > 279 |       audioStreamRef.current = audioStream;      // Get microphone audio
        |                                ^^^^^^^^^^^
    280 |
    281 |       const audioStream = await navigator.mediaDevices.getUserMedia({
    282 |

ERROR in src/TranslationRoom.tsx:285:13
TS1005: ':' expected.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |             ^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:13
TS2588: Cannot assign to 'videoElement' because it is a constant.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |             ^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:28
TS2304: Cannot find name 'sourceVideoRef'.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |                            ^^^^^^^^^^^^^^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:285:50
TS1005: ',' expected.
    283 |       // Capture video from source video element        audio: {
    284 |
  > 285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
        |                                                  ^
    286 |
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |

ERROR in src/TranslationRoom.tsx:287:11
TS1003: Identifier expected.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |           ^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:287:12
TS7006: Parameter 'videoElement' implicitly has an 'any' type.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |            ^^^^^^^^^^^^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:287:55
TS2695: Left side of comma operator is unused and has no side effects.
    285 |       const videoElement = sourceVideoRef.current;          echoCancellation: true,
    286 |
  > 287 |       if (!videoElement) {          noiseSuppression: true,
        |                                                       ^^^^
    288 |
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |

ERROR in src/TranslationRoom.tsx:289:9
TS1109: Expression expected.
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |
  > 289 |         throw new Error('Source video not available');          autoGainControl: true,
        |         ^^^^^
    290 |
    291 |       }        },
    292 |

ERROR in src/TranslationRoom.tsx:289:82
TS2695: Left side of comma operator is unused and has no side effects.
    287 |       if (!videoElement) {          noiseSuppression: true,
    288 |
  > 289 |         throw new Error('Source video not available');          autoGainControl: true,
        |                                                                                  ^^^^
    290 |
    291 |       }        },
    292 |

ERROR in src/TranslationRoom.tsx:291:7
TS1109: Expression expected.
    289 |         throw new Error('Source video not available');          autoGainControl: true,
    290 |
  > 291 |       }        },
        |       ^
    292 |
    293 |         video: false,
    294 |

ERROR in src/TranslationRoom.tsx:293:9
TS2304: Cannot find name 'video'.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |         ^^^^^
    294 |
    295 |       setStreamStatus('Capturing video...');      });
    296 |

ERROR in src/TranslationRoom.tsx:293:9
TS2554: Expected 0-1 arguments, but got 4.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |         ^^^^^^^^^^^^^
  > 294 |
        | ^
  > 295 |       setStreamStatus('Capturing video...');      });
        | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:293:14
TS1005: ',' expected.
    291 |       }        },
    292 |
  > 293 |         video: false,
        |              ^
    294 |
    295 |       setStreamStatus('Capturing video...');      });
    296 |

ERROR in src/TranslationRoom.tsx:295:7
TS2304: Cannot find name 'setStreamStatus'.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |       ^^^^^^^^^^^^^^^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:295:44
TS1005: ')' expected.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |                                            ^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:295:52
TS1005: ',' expected.
    293 |         video: false,
    294 |
  > 295 |       setStreamStatus('Capturing video...');      });
        |                                                    ^
    296 |
    297 |
    298 |

ERROR in src/TranslationRoom.tsx:301:13
TS2451: Cannot redeclare block-scoped variable 'canvas'.
    299 |       // Create canvas to capture video      audioStreamRef.current = audioStream;
    300 |
  > 301 |       const canvas = document.createElement('canvas');
        |             ^^^^^^
    302 |
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |

ERROR in src/TranslationRoom.tsx:303:22
TS2448: Block-scoped variable 'videoElement' used before its declaration.
    301 |       const canvas = document.createElement('canvas');
    302 |
  > 303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
        |                      ^^^^^^^^^^^^
    304 |
    305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
    306 |

ERROR in src/TranslationRoom.tsx:305:23
TS2448: Block-scoped variable 'videoElement' used before its declaration.
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |
  > 305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
        |                       ^^^^^^^^^^^^
    306 |
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |

ERROR in src/TranslationRoom.tsx:305:82
TS2304: Cannot find name 'sourceVideoRef'.
    303 |       canvas.width = videoElement.videoWidth || 1280;      // Capture video from source video element
    304 |
  > 305 |       canvas.height = videoElement.videoHeight || 720;      const videoElement = sourceVideoRef.current;
        |                                                                                  ^^^^^^^^^^^^^^
    306 |
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |

ERROR in src/TranslationRoom.tsx:309:7
TS2552: Cannot find name 'canvasRef'. Did you mean 'canvas'?
    307 |       const ctx = canvas.getContext('2d');      if (!videoElement) {
    308 |
  > 309 |       canvasRef.current = canvas;        throw new Error('Source video not available');
        |       ^^^^^^^^^
    310 |
    311 |       }
    312 |

ERROR in src/TranslationRoom.tsx:315:13
TS2451: Cannot redeclare block-scoped variable 'videoStream'.
    313 |       // Capture video frames at 30fps
    314 |
  > 315 |       const videoStream = canvas.captureStream(30);      // Create canvas to capture video
        |             ^^^^^^^^^^^
    316 |
    317 |             const canvas = document.createElement('canvas');
    318 |

ERROR in src/TranslationRoom.tsx:317:19
TS2451: Cannot redeclare block-scoped variable 'canvas'.
    315 |       const videoStream = canvas.captureStream(30);      // Create canvas to capture video
    316 |
  > 317 |             const canvas = document.createElement('canvas');
        |                   ^^^^^^
    318 |
    319 |       // Draw video frames to canvas      canvas.width = videoElement.videoWidth || 1280;
    320 |

ERROR in src/TranslationRoom.tsx:321:13
TS2451: Cannot redeclare block-scoped variable 'drawFrame'.
    319 |       // Draw video frames to canvas      canvas.width = videoElement.videoWidth || 1280;
    320 |
  > 321 |       const drawFrame = () => {      canvas.height = videoElement.videoHeight || 720;
        |             ^^^^^^^^^
    322 |
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |

ERROR in src/TranslationRoom.tsx:323:36
TS2304: Cannot find name 'isTranslating'.
    321 |       const drawFrame = () => {      canvas.height = videoElement.videoHeight || 720;
    322 |
  > 323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
        |                                    ^^^^^^^^^^^^^
    324 |
    325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
    326 |

ERROR in src/TranslationRoom.tsx:325:11
TS18047: 'ctx' is possibly 'null'.
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |
  > 325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
        |           ^^^
    326 |
    327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
    328 |

ERROR in src/TranslationRoom.tsx:325:80
TS2304: Cannot find name 'canvasRef'.
    323 |         if (ctx && videoElement && isTranslating) {      const ctx = canvas.getContext('2d');
    324 |
  > 325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
        |                                                                                ^^^^^^^^^
    326 |
    327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
    328 |

ERROR in src/TranslationRoom.tsx:327:11
TS2304: Cannot find name 'animationFrameRef'.
    325 |           ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);      canvasRef.current = canvas;
    326 |
  > 327 |           animationFrameRef.current = requestAnimationFrame(drawFrame);
        |           ^^^^^^^^^^^^^^^^^
    328 |
    329 |         }      // Capture video frames at 30fps
    330 |

ERROR in src/TranslationRoom.tsx:331:21
TS2451: Cannot redeclare block-scoped variable 'videoStream'.
    329 |         }      // Capture video frames at 30fps
    330 |
  > 331 |       };      const videoStream = canvas.captureStream(30);
        |                     ^^^^^^^^^^^
    332 |
    333 |             
    334 |

ERROR in src/TranslationRoom.tsx:335:7
TS2304: Cannot find name 'setIsTranslating'.
    333 |             
    334 |
  > 335 |       setIsTranslating(true);      // Draw video frames to canvas
        |       ^^^^^^^^^^^^^^^^
    336 |
    337 |       drawFrame();      const drawFrame = () => {
    338 |

ERROR in src/TranslationRoom.tsx:337:31
TS2451: Cannot redeclare block-scoped variable 'drawFrame'.
    335 |       setIsTranslating(true);      // Draw video frames to canvas
    336 |
  > 337 |       drawFrame();      const drawFrame = () => {
        |                               ^^^^^^^^^
    338 |
    339 |         if (ctx && videoElement && isTranslating) {
    340 |

ERROR in src/TranslationRoom.tsx:339:36
TS2304: Cannot find name 'isTranslating'.
    337 |       drawFrame();      const drawFrame = () => {
    338 |
  > 339 |         if (ctx && videoElement && isTranslating) {
        |                                    ^^^^^^^^^^^^^
    340 |
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |

ERROR in src/TranslationRoom.tsx:343:30
TS2769: No overload matches this call.
  Overload 1 of 3, '(stream: MediaStream): MediaStream', gave the following error.
    Argument of type 'number[]' is not assignable to parameter of type 'MediaStream'.
      Type 'number[]' is missing the following properties from type 'MediaStream': active, id, onaddtrack, onremovetrack, and 10 more.
  Overload 2 of 3, '(tracks: MediaStreamTrack[]): MediaStream', gave the following error.
    Type 'number' is not assignable to type 'MediaStreamTrack'.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:343:57
TS2304: Cannot find name 'animationFrameRef'.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                                                         ^^^^^^^^^^^^^^^^^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:343:117
TS1005: ',' expected.
    341 |       // Combine video and audio          ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);
    342 |
  > 343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
        |                                                                                                                     ^
    344 |
    345 |         ...videoStream.getVideoTracks(),        }
    346 |

ERROR in src/TranslationRoom.tsx:345:9
TS1128: Declaration or statement expected.
    343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
    344 |
  > 345 |         ...videoStream.getVideoTracks(),        }
        |         ^^^
    346 |
    347 |         ...audioStream.getAudioTracks(),      };
    348 |

ERROR in src/TranslationRoom.tsx:345:49
TS1109: Expression expected.
    343 |       const combinedStream = new MediaStream([          animationFrameRef.current = requestAnimationFrame(drawFrame);
    344 |
  > 345 |         ...videoStream.getVideoTracks(),        }
        |                                                 ^
    346 |
    347 |         ...audioStream.getAudioTracks(),      };
    348 |

ERROR in src/TranslationRoom.tsx:347:9
TS1128: Declaration or statement expected.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |         ^^^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:347:12
TS2304: Cannot find name 'audioStream'.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |            ^^^^^^^^^^^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:347:47
TS1109: Expression expected.
    345 |         ...videoStream.getVideoTracks(),        }
    346 |
  > 347 |         ...audioStream.getAudioTracks(),      };
        |                                               ^
    348 |
    349 |       ]);      drawFrame();
    350 |

ERROR in src/TranslationRoom.tsx:349:7
TS1128: Declaration or statement expected.
    347 |         ...audioStream.getAudioTracks(),      };
    348 |
  > 349 |       ]);      drawFrame();
        |       ^
    350 |
    351 |
    352 |

ERROR in src/TranslationRoom.tsx:349:8
TS1128: Declaration or statement expected.
    347 |         ...audioStream.getAudioTracks(),      };
    348 |
  > 349 |       ]);      drawFrame();
        |        ^
    350 |
    351 |
    352 |

ERROR in src/TranslationRoom.tsx:353:7
TS2552: Cannot find name 'combinedStreamRef'. Did you mean 'combinedStream'?
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |       ^^^^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:353:35
TS2448: Block-scoped variable 'combinedStream' used before its declaration.
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |                                   ^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:353:35
TS2454: Variable 'combinedStream' is used before being assigned.
    351 |
    352 |
  > 353 |       combinedStreamRef.current = combinedStream;      // Combine video and audio
        |                                   ^^^^^^^^^^^^^^
    354 |
    355 |       const combinedStream = new MediaStream([
    356 |

ERROR in src/TranslationRoom.tsx:357:7
TS2304: Cannot find name 'setStreamStatus'.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |       ^^^^^^^^^^^^^^^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:357:59
TS1005: ',' expected.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |                                                           ^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:357:68
TS1128: Declaration or statement expected.
    355 |       const combinedStream = new MediaStream([
    356 |
  > 357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
        |                                                                    ^^^
    358 |
    359 |         ...audioStream.getAudioTracks(),
    360 |

ERROR in src/TranslationRoom.tsx:359:9
TS1109: Expression expected.
    357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
    358 |
  > 359 |         ...audioStream.getAudioTracks(),
        |         ^^^
    360 |
    361 |       // Connect to WebSocket bridge server      ]);
    362 |

ERROR in src/TranslationRoom.tsx:359:12
TS2304: Cannot find name 'audioStream'.
    357 |       setStreamStatus('Connecting to streaming server...');        ...videoStream.getVideoTracks(),
    358 |
  > 359 |         ...audioStream.getAudioTracks(),
        |            ^^^^^^^^^^^
    360 |
    361 |       // Connect to WebSocket bridge server      ]);
    362 |

ERROR in src/TranslationRoom.tsx:363:7
TS1109: Expression expected.
    361 |       // Connect to WebSocket bridge server      ]);
    362 |
  > 363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
        |       ^^^^^
    364 |
    365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
    366 |

ERROR in src/TranslationRoom.tsx:365:7
TS2304: Cannot find name 'wsRef'.
    363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
    364 |
  > 365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
        |       ^^^^^
    366 |
    367 |
    368 |

ERROR in src/TranslationRoom.tsx:365:32
TS2552: Cannot find name 'combinedStreamRef'. Did you mean 'combinedStream'?
    363 |       const ws = new WebSocket(BRIDGE_SERVER_URL);
    364 |
  > 365 |       wsRef.current = ws;      combinedStreamRef.current = combinedStream;
        |                                ^^^^^^^^^^^^^^^^^
    366 |
    367 |
    368 |

ERROR in src/TranslationRoom.tsx:373:9
TS2304: Cannot find name 'setStreamStatus'.
    371 |         console.log('Connected to RTMP bridge server');      const ws = new WebSocket(BRIDGE_SERVER_URL);
    372 |
  > 373 |         setStreamStatus('Connected. Starting stream...');      wsRef.current = ws;
        |         ^^^^^^^^^^^^^^^
    374 |
    375 |         
    376 |

ERROR in src/TranslationRoom.tsx:373:64
TS2304: Cannot find name 'wsRef'.
    371 |         console.log('Connected to RTMP bridge server');      const ws = new WebSocket(BRIDGE_SERVER_URL);
    372 |
  > 373 |         setStreamStatus('Connected. Starting stream...');      wsRef.current = ws;
        |                                                                ^^^^^
    374 |
    375 |         
    376 |

ERROR in src/TranslationRoom.tsx:379:48
TS1005: ',' expected.
    377 |         // Start streaming      ws.onopen = () => {
    378 |
  > 379 |         ws.send(JSON.stringify({        console.log('Connected to RTMP bridge server');
        |                                                ^
    380 |
    381 |           type: 'start',        
    382 |

ERROR in src/TranslationRoom.tsx:379:87
TS1005: ',' expected.
    377 |         // Start streaming      ws.onopen = () => {
    378 |
  > 379 |         ws.send(JSON.stringify({        console.log('Connected to RTMP bridge server');
        |                                                                                       ^
    380 |
    381 |           type: 'start',        
    382 |

ERROR in src/TranslationRoom.tsx:383:21
TS2304: Cannot find name 'selectedLanguage'.
    381 |           type: 'start',        
    382 |
  > 383 |           language: selectedLanguage        // Start streaming
        |                     ^^^^^^^^^^^^^^^^
    384 |
    385 |         }));        ws.send(JSON.stringify({
    386 |

ERROR in src/TranslationRoom.tsx:391:15
TS1005: ':' expected.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |               ^^^^^^^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:391:15
TS2588: Cannot assign to 'options' because it is a constant.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |               ^^^^^^^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:391:35
TS1005: ',' expected.
    389 |         // Use MediaRecorder to capture and send data to bridge          language: selectedLanguage
    390 |
  > 391 |         const options = {        }));
        |                                   ^
    392 |
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |

ERROR in src/TranslationRoom.tsx:393:21
TS2695: Left side of comma operator is unused and has no side effects.
    391 |         const options = {        }));
    392 |
  > 393 |           mimeType: 'video/webm;codecs=vp8,opus',
        |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    394 |
    395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
    396 |

ERROR in src/TranslationRoom.tsx:395:11
TS2304: Cannot find name 'videoBitsPerSecond'.
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |
  > 395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
        |           ^^^^^^^^^^^^^^^^^^
    396 |
    397 |         };        const options = {
    398 |

ERROR in src/TranslationRoom.tsx:395:29
TS1005: ';' expected.
    393 |           mimeType: 'video/webm;codecs=vp8,opus',
    394 |
  > 395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
        |                             ^
    396 |
    397 |         };        const options = {
    398 |

ERROR in src/TranslationRoom.tsx:397:25
TS7022: 'options' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.
    395 |           videoBitsPerSecond: 2500000        // Use MediaRecorder to capture and send data to bridge
    396 |
  > 397 |         };        const options = {
        |                         ^^^^^^^
    398 |
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |

ERROR in src/TranslationRoom.tsx:401:15
TS1005: ':' expected.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |               ^^^^^^^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:15
TS2304: Cannot find name 'mediaRecorder'.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |               ^^^^^^^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:65
TS2448: Block-scoped variable 'options' used before its declaration.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |                                                                 ^^^^^^^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:401:73
TS1005: ',' expected.
    399 |           mimeType: 'video/webm;codecs=vp8,opus',
    400 |
  > 401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
        |                                                                         ^
    402 |
    403 |         mediaRecorderRef.current = mediaRecorder;        };
    404 |

ERROR in src/TranslationRoom.tsx:403:9
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |         ^^^^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:9
TS18004: No value exists in scope for the shorthand property 'mediaRecorderRef'. Either declare one or provide an initializer.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |         ^^^^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:25
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                         ^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:36
TS2304: Cannot find name 'mediaRecorder'.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                                    ^^^^^^^^^^^^^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:403:49
TS1005: ',' expected.
    401 |         const mediaRecorder = new MediaRecorder(combinedStream, options);          videoBitsPerSecond: 2500000
    402 |
  > 403 |         mediaRecorderRef.current = mediaRecorder;        };
        |                                                 ^
    404 |
    405 |
    406 |

ERROR in src/TranslationRoom.tsx:407:9
TS2304: Cannot find name 'mediaRecorder'.
    405 |
    406 |
  > 407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
        |         ^^^^^^^^^^^^^
    408 |
    409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
    410 |

ERROR in src/TranslationRoom.tsx:407:42
TS7006: Parameter 'event' implicitly has an 'any' type.
    405 |
    406 |
  > 407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
        |                                          ^^^^^
    408 |
    409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
    410 |

ERROR in src/TranslationRoom.tsx:409:81
TS2304: Cannot find name 'mediaRecorderRef'.
    407 |         mediaRecorder.ondataavailable = (event) => {        const mediaRecorder = new MediaRecorder(combinedStream, options);
    408 |
  > 409 |           if (event.data.size > 0 && ws.readyState === WebSocket.OPEN) {        mediaRecorderRef.current = mediaRecorder;
        |                                                                                 ^^^^^^^^^^^^^^^^
    410 |
    411 |             ws.send(event.data);
    412 |

ERROR in src/TranslationRoom.tsx:419:78
TS2339: Property 'data' does not exist on type 'Event'.
    417 |             // Send binary data to bridge server
    418 |
  > 419 |         mediaRecorder.onerror = (event: Event) => {            ws.send(event.data);
        |                                                                              ^^^^
    420 |
    421 |           console.error('MediaRecorder error:', event);          }
    422 |

ERROR in src/TranslationRoom.tsx:423:11
TS2304: Cannot find name 'setStreamStatus'.
    421 |           console.error('MediaRecorder error:', event);          }
    422 |
  > 423 |           setStreamStatus('Error: MediaRecorder failed');        };
        |           ^^^^^^^^^^^^^^^
    424 |
    425 |         };
    426 |

ERROR in src/TranslationRoom.tsx:427:9
TS2304: Cannot find name 'mediaRecorder'.
    425 |         };
    426 |
  > 427 |         mediaRecorder.onerror = (event) => {
        |         ^^^^^^^^^^^^^
    428 |
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |

ERROR in src/TranslationRoom.tsx:427:34
TS7006: Parameter 'event' implicitly has an 'any' type.
    425 |         };
    426 |
  > 427 |         mediaRecorder.onerror = (event) => {
        |                                  ^^^^^
    428 |
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |

ERROR in src/TranslationRoom.tsx:431:9
TS2304: Cannot find name 'mediaRecorder'.
    429 |         // Start recording in chunks          console.error('MediaRecorder error:', event);
    430 |
  > 431 |         mediaRecorder.start(100);        };
        |         ^^^^^^^^^^^^^
    432 |
    433 |         
    434 |

ERROR in src/TranslationRoom.tsx:437:7
TS1128: Declaration or statement expected.
    435 |         console.log('Started streaming to RTMP via bridge server');        // Start recording in chunks
    436 |
  > 437 |       };        mediaRecorder.start(100); // Send data every 100ms
        |       ^
    438 |
    439 |         
    440 |

ERROR in src/TranslationRoom.tsx:437:17
TS2304: Cannot find name 'mediaRecorder'.
    435 |         console.log('Started streaming to RTMP via bridge server');        // Start recording in chunks
    436 |
  > 437 |       };        mediaRecorder.start(100); // Send data every 100ms
        |                 ^^^^^^^^^^^^^
    438 |
    439 |         
    440 |

ERROR in src/TranslationRoom.tsx:445:9
TS2304: Cannot find name 'setStreamStatus'.
    443 |         console.error('WebSocket error:', error);      };
    444 |
  > 445 |         setStreamStatus('Error: Cannot connect to bridge server');
        |         ^^^^^^^^^^^^^^^
    446 |
    447 |         alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');      ws.onerror = (error) => {
    448 |

ERROR in src/TranslationRoom.tsx:449:9
TS2304: Cannot find name 'setIsTranslating'.
    447 |         alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');      ws.onerror = (error) => {
    448 |
  > 449 |         setIsTranslating(false);        console.error('WebSocket error:', error);
        |         ^^^^^^^^^^^^^^^^
    450 |
    451 |       };        alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');
    452 |

ERROR in src/TranslationRoom.tsx:453:9
TS2304: Cannot find name 'setIsTranslating'.
    451 |       };        alert('Failed to connect to RTMP bridge server. Please ensure it\'s running on port 3030.');
    452 |
  > 453 |         setIsTranslating(false);
        |         ^^^^^^^^^^^^^^^^
    454 |
    455 |       ws.onclose = () => {      };
    456 |

ERROR in src/TranslationRoom.tsx:459:9
TS2304: Cannot find name 'setStreamStatus'.
    457 |         console.log('Disconnected from bridge server');
    458 |
  > 459 |         setStreamStatus('Disconnected from bridge server');      ws.onclose = () => {
        |         ^^^^^^^^^^^^^^^
    460 |
    461 |       };        console.log('Disconnected from bridge server');
    462 |

ERROR in src/TranslationRoom.tsx:463:7
TS1128: Declaration or statement expected.
    461 |       };        console.log('Disconnected from bridge server');
    462 |
  > 463 |       };
        |       ^
    464 |
    465 |       ws.onmessage = (event) => {
    466 |

ERROR in src/TranslationRoom.tsx:475:13
TS2304: Cannot find name 'setStreamStatus'.
    473 |             console.log('RTMP streaming started for:', data.streamKey);          if (data.type === 'started') {
    474 |
  > 475 |             setStreamStatus(`Streaming live to ${data.streamKey}`);            console.log('RTMP streaming started for:', data.streamKey);
        |             ^^^^^^^^^^^^^^^
    476 |
    477 |             // Start monitoring the output stream after a delay            // Start monitoring the output stream
    478 |

ERROR in src/TranslationRoom.tsx:489:13
TS2304: Cannot find name 'setStreamStatus'.
    487 |             console.error('Bridge server error:', data.error);            console.error('Bridge server error:', data.error);
    488 |
  > 489 |             setStreamStatus(`Error: ${data.error}`);            alert(`Streaming error: ${data.error}`);
        |             ^^^^^^^^^^^^^^^
    490 |
    491 |           } else if (data.type === 'stopped') {          }
    492 |

ERROR in src/TranslationRoom.tsx:493:13
TS2304: Cannot find name 'setStreamStatus'.
    491 |           } else if (data.type === 'stopped') {          }
    492 |
  > 493 |             setStreamStatus('Stream stopped');        } catch (err) {
        |             ^^^^^^^^^^^^^^^
    494 |
    495 |           }          console.log('Non-JSON message from bridge:', event.data);
    496 |

ERROR in src/TranslationRoom.tsx:493:57
TS1005: 'try' expected.
    491 |           } else if (data.type === 'stopped') {          }
    492 |
  > 493 |             setStreamStatus('Stream stopped');        } catch (err) {
        |                                                         ^^^^^
    494 |
    495 |           }          console.log('Non-JSON message from bridge:', event.data);
    496 |

ERROR in src/TranslationRoom.tsx:503:8
TS1472: 'catch' or 'finally' expected.
    501 |         }
    502 |
  > 503 |       };    } catch (err) {
        |        ^
    504 |
    505 |       console.error('Error starting translation:', err);
    506 |

ERROR in src/TranslationRoom.tsx:503:15
TS1005: ';' expected.
    501 |         }
    502 |
  > 503 |       };    } catch (err) {
        |               ^^^^^
    504 |
    505 |       console.error('Error starting translation:', err);
    506 |

ERROR in src/TranslationRoom.tsx:507:7
TS1005: 'try' expected.
    505 |       console.error('Error starting translation:', err);
    506 |
  > 507 |     } catch (err) {      alert('Failed to start translation. Please check microphone permissions.');
        |       ^^^^^
    508 |
    509 |       console.error('Error starting translation:', err);      setIsTranslating(false);
    510 |

ERROR in src/TranslationRoom.tsx:509:63
TS2304: Cannot find name 'setIsTranslating'.
    507 |     } catch (err) {      alert('Failed to start translation. Please check microphone permissions.');
    508 |
  > 509 |       console.error('Error starting translation:', err);      setIsTranslating(false);
        |                                                               ^^^^^^^^^^^^^^^^
    510 |
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |

ERROR in src/TranslationRoom.tsx:513:7
TS2304: Cannot find name 'setIsTranslating'.
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |
  > 513 |       setIsTranslating(false);  };
        |       ^^^^^^^^^^^^^^^^
    514 |
    515 |       setStreamStatus('Failed to start');
    516 |

ERROR in src/TranslationRoom.tsx:513:33
TS1128: Declaration or statement expected.
    511 |       alert('Failed to start translation. Please check microphone permissions.');    }
    512 |
  > 513 |       setIsTranslating(false);  };
        |                                 ^
    514 |
    515 |       setStreamStatus('Failed to start');
    516 |

ERROR in src/TranslationRoom.tsx:515:7
TS2304: Cannot find name 'setStreamStatus'.
    513 |       setIsTranslating(false);  };
    514 |
  > 515 |       setStreamStatus('Failed to start');
        |       ^^^^^^^^^^^^^^^
    516 |
    517 |     }  const startOutputVideo = () => {
    518 |

ERROR in src/TranslationRoom.tsx:517:5
TS1128: Declaration or statement expected.
    515 |       setStreamStatus('Failed to start');
    516 |
  > 517 |     }  const startOutputVideo = () => {
        |     ^
    518 |
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |

ERROR in src/TranslationRoom.tsx:517:14
TS2451: Cannot redeclare block-scoped variable 'startOutputVideo'.
    515 |       setStreamStatus('Failed to start');
    516 |
  > 517 |     }  const startOutputVideo = () => {
        |              ^^^^^^^^^^^^^^^^
    518 |
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |

ERROR in src/TranslationRoom.tsx:519:72
TS2304: Cannot find name 'selectedLanguage'.
    517 |     }  const startOutputVideo = () => {
    518 |
  > 519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
        |                                                                        ^^^^^^^^^^^^^^^^
    520 |
    521 |     const outputVideo = outputVideoRef.current;
    522 |

ERROR in src/TranslationRoom.tsx:521:25
TS2304: Cannot find name 'outputVideoRef'.
    519 |   };    const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;
    520 |
  > 521 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    522 |
    523 |   const startOutputVideo = () => {    
    524 |

ERROR in src/TranslationRoom.tsx:523:9
TS2451: Cannot redeclare block-scoped variable 'startOutputVideo'.
    521 |     const outputVideo = outputVideoRef.current;
    522 |
  > 523 |   const startOutputVideo = () => {    
        |         ^^^^^^^^^^^^^^^^
    524 |
    525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
    526 |

ERROR in src/TranslationRoom.tsx:525:68
TS2304: Cannot find name 'selectedLanguage'.
    523 |   const startOutputVideo = () => {    
    524 |
  > 525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
        |                                                                    ^^^^^^^^^^^^^^^^
    526 |
    527 |     const outputVideo = outputVideoRef.current;
    528 |

ERROR in src/TranslationRoom.tsx:525:110
TS2448: Block-scoped variable 'outputVideo' used before its declaration.
    523 |   const startOutputVideo = () => {    
    524 |
  > 525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
        |                                                                                                              ^^^^^^^^^^^
    526 |
    527 |     const outputVideo = outputVideoRef.current;
    528 |

ERROR in src/TranslationRoom.tsx:527:25
TS2304: Cannot find name 'outputVideoRef'.
    525 |     const watchUrl = `https://tni-out.ceflixcdn.com/translations/${selectedLanguage}/playlist.m3u8`;    if (!outputVideo) return;
    526 |
  > 527 |     const outputVideo = outputVideoRef.current;
        |                         ^^^^^^^^^^^^^^
    528 |
    529 |         console.log('Loading translated output stream:', watchUrl);
    530 |

ERROR in src/TranslationRoom.tsx:535:76
TS2451: Cannot redeclare block-scoped variable 'hls'.
    533 |     if (Hls.isSupported()) {
    534 |
  > 535 |     console.log('Loading translated output stream:', watchUrl);      const hls = new Hls({
        |                                                                            ^^^
    536 |
    537 |         enableWorker: true,
    538 |

ERROR in src/TranslationRoom.tsx:539:5
TS2345: Argument of type '{ enableWorker: true; if(Hls: any): any; "": any; }' is not assignable to parameter of type 'Partial<HlsConfig>'.
  Object literal may only specify known properties, and 'if' does not exist in type 'Partial<HlsConfig>'.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |     ^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:9
TS7006: Parameter 'Hls' implicitly has an 'any' type.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |         ^^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:12
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |            ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:26
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                          ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:28
TS1005: ',' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                            ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:53
TS1359: Identifier expected. 'true' is a reserved word that cannot be used here.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                                                     ^^^^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:539:57
TS1005: ':' expected.
    537 |         enableWorker: true,
    538 |
  > 539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
        |                                                         ^
    540 |
    541 |       const hls = new Hls({      });
    542 |

ERROR in src/TranslationRoom.tsx:541:13
TS1005: ':' expected.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |             ^^^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:541:13
TS2451: Cannot redeclare block-scoped variable 'hls'.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |             ^^^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:541:36
TS1005: ',' expected.
    539 |     if (Hls.isSupported()) {        lowLatencyMode: true,
    540 |
  > 541 |       const hls = new Hls({      });
        |                                    ^
    542 |
    543 |         enableWorker: true,      
    544 |

ERROR in src/TranslationRoom.tsx:543:23
TS2695: Left side of comma operator is unused and has no side effects.
    541 |       const hls = new Hls({      });
    542 |
  > 543 |         enableWorker: true,      
        |                       ^^^^
    544 |
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |

ERROR in src/TranslationRoom.tsx:545:9
TS2304: Cannot find name 'lowLatencyMode'.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |         ^^^^^^^^^^^^^^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:545:23
TS1005: ';' expected.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |                       ^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:545:25
TS2695: Left side of comma operator is unused and has no side effects.
    543 |         enableWorker: true,      
    544 |
  > 545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
        |                         ^^^^
    546 |
    547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
    548 |

ERROR in src/TranslationRoom.tsx:547:22
TS2304: Cannot find name 'data'.
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |
  > 547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
        |                      ^^^^
    548 |
    549 |                 console.log('HLS stream not available yet, will retry...');
    550 |

ERROR in src/TranslationRoom.tsx:547:36
TS2304: Cannot find name 'data'.
    545 |         lowLatencyMode: true,      hls.on(Hls.Events.ERROR, (event, data) => {
    546 |
  > 547 |       });        if (data.fatal && data.type === Hls.ErrorTypes.NETWORK_ERROR) {
        |                                    ^^^^
    548 |
    549 |                 console.log('HLS stream not available yet, will retry...');
    550 |

ERROR in src/TranslationRoom.tsx:561:18
TS1005: ',' expected.
    559 |           setTimeout(() => startOutputVideo(), 3000);      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    560 |
  > 561 |         }        console.log('Translation output stream is now available');
        |                  ^^^^^^^
    562 |
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |

ERROR in src/TranslationRoom.tsx:561:75
TS1005: ')' expected.
    559 |           setTimeout(() => startOutputVideo(), 3000);      hls.on(Hls.Events.MANIFEST_PARSED, () => {
    560 |
  > 561 |         }        console.log('Translation output stream is now available');
        |                                                                           ^
    562 |
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |

ERROR in src/TranslationRoom.tsx:563:8
TS1128: Declaration or statement expected.
    561 |         }        console.log('Translation output stream is now available');
    562 |
  > 563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
        |        ^
    564 |
    565 |       });
    566 |

ERROR in src/TranslationRoom.tsx:565:8
TS1128: Declaration or statement expected.
    563 |       });        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    564 |
  > 565 |       });
        |        ^
    566 |
    567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
    568 |

ERROR in src/TranslationRoom.tsx:567:7
TS2304: Cannot find name 'hls'.
    565 |       });
    566 |
  > 567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
        |       ^^^
    568 |
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |

ERROR in src/TranslationRoom.tsx:569:73
TS2304: Cannot find name 'hls'.
    567 |       hls.on(Hls.Events.MANIFEST_PARSED, () => {
    568 |
  > 569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
        |                                                                         ^^^
    570 |
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |

ERROR in src/TranslationRoom.tsx:571:9
TS2304: Cannot find name 'setStreamStatus'.
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |
  > 571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
        |         ^^^^^^^^^^^^^^^
    572 |
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |

ERROR in src/TranslationRoom.tsx:571:68
TS2304: Cannot find name 'hls'.
    569 |         console.log('Translation output stream is now available');      hls.loadSource(watchUrl);
    570 |
  > 571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
        |                                                                    ^^^
    572 |
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |

ERROR in src/TranslationRoom.tsx:573:95
TS2304: Cannot find name 'outputHlsRef'.
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |
  > 573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
        |                                                                                               ^^^^^^^^^^^^
    574 |
    575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
    576 |

ERROR in src/TranslationRoom.tsx:573:118
TS2304: Cannot find name 'hls'.
    571 |         setStreamStatus('Streaming live - Output available');      hls.attachMedia(outputVideo);
    572 |
  > 573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
        |                                                                                                                      ^^^
    574 |
    575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
    576 |

ERROR in src/TranslationRoom.tsx:575:16
TS1005: ',' expected.
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |
  > 575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
        |                ^^^^
    576 |
    577 |       outputVideo.src = watchUrl;
    578 |

ERROR in src/TranslationRoom.tsx:575:21
TS1389: 'if' is not allowed as a variable declaration name.
    573 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));      outputHlsRef.current = hls;
    574 |
  > 575 |       });    } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {
        |                     ^^
    576 |
    577 |       outputVideo.src = watchUrl;
    578 |

ERROR in src/TranslationRoom.tsx:579:7
TS2304: Cannot find name 'hls'.
    577 |       outputVideo.src = watchUrl;
    578 |
  > 579 |       hls.loadSource(watchUrl);      outputVideo.addEventListener('loadedmetadata', () => {
        |       ^^^
    580 |
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |

ERROR in src/TranslationRoom.tsx:581:7
TS2304: Cannot find name 'hls'.
    579 |       hls.loadSource(watchUrl);      outputVideo.addEventListener('loadedmetadata', () => {
    580 |
  > 581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
        |       ^^^
    582 |
    583 |       outputHlsRef.current = hls;      });
    584 |

ERROR in src/TranslationRoom.tsx:583:7
TS2304: Cannot find name 'outputHlsRef'.
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |
  > 583 |       outputHlsRef.current = hls;      });
        |       ^^^^^^^^^^^^
    584 |
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |

ERROR in src/TranslationRoom.tsx:583:30
TS2304: Cannot find name 'hls'.
    581 |       hls.attachMedia(outputVideo);        outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    582 |
  > 583 |       outputHlsRef.current = hls;      });
        |                              ^^^
    584 |
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |

ERROR in src/TranslationRoom.tsx:587:36
TS1128: Declaration or statement expected.
    585 |     } else if (outputVideo.canPlayType('application/vnd.apple.mpegurl')) {    }
    586 |
  > 587 |       outputVideo.src = watchUrl;  };
        |                                    ^
    588 |
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |

ERROR in src/TranslationRoom.tsx:591:9
TS2304: Cannot find name 'setStreamStatus'.
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |
  > 591 |         setStreamStatus('Streaming live - Output available');  };
        |         ^^^^^^^^^^^^^^^
    592 |
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |

ERROR in src/TranslationRoom.tsx:591:65
TS1005: ')' expected.
    589 |       outputVideo.addEventListener('loadedmetadata', () => {
    590 |
  > 591 |         setStreamStatus('Streaming live - Output available');  };
        |                                                                 ^
    592 |
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |

ERROR in src/TranslationRoom.tsx:595:7
TS1128: Declaration or statement expected.
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |
  > 595 |       });  const stopTranslation = () => {
        |       ^
    596 |
    597 |     }    // Stop media recorder
    598 |

ERROR in src/TranslationRoom.tsx:595:8
TS1128: Declaration or statement expected.
    593 |         outputVideo.play().catch((e: any) => console.error('Error playing output:', e));
    594 |
  > 595 |       });  const stopTranslation = () => {
        |        ^
    596 |
    597 |     }    // Stop media recorder
    598 |

ERROR in src/TranslationRoom.tsx:599:3
TS1128: Declaration or statement expected.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |   ^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:599:13
TS2304: Cannot find name 'mediaRecorderRef'.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |             ^^^^^^^^^^^^^^^^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:599:41
TS2304: Cannot find name 'mediaRecorderRef'.
    597 |     }    // Stop media recorder
    598 |
  > 599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                         ^^^^^^^^^^^^^^^^
    600 |
    601 |       mediaRecorderRef.current.stop();
    602 |

ERROR in src/TranslationRoom.tsx:601:7
TS2304: Cannot find name 'mediaRecorderRef'.
    599 |   };    if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
    600 |
  > 601 |       mediaRecorderRef.current.stop();
        |       ^^^^^^^^^^^^^^^^
    602 |
    603 |   const stopTranslation = () => {      mediaRecorderRef.current = null;
    604 |

ERROR in src/TranslationRoom.tsx:603:40
TS2304: Cannot find name 'mediaRecorderRef'.
    601 |       mediaRecorderRef.current.stop();
    602 |
  > 603 |   const stopTranslation = () => {      mediaRecorderRef.current = null;
        |                                        ^^^^^^^^^^^^^^^^
    604 |
    605 |     // Stop media recorder    }
    606 |

ERROR in src/TranslationRoom.tsx:607:9
TS2304: Cannot find name 'mediaRecorderRef'.
    605 |     // Stop media recorder    }
    606 |
  > 607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |         ^^^^^^^^^^^^^^^^
    608 |
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |

ERROR in src/TranslationRoom.tsx:607:37
TS2304: Cannot find name 'mediaRecorderRef'.
    605 |     // Stop media recorder    }
    606 |
  > 607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
        |                                     ^^^^^^^^^^^^^^^^
    608 |
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |

ERROR in src/TranslationRoom.tsx:609:7
TS2304: Cannot find name 'mediaRecorderRef'.
    607 |     if (mediaRecorderRef.current && mediaRecorderRef.current.state !== 'inactive') {
    608 |
  > 609 |       mediaRecorderRef.current.stop();    // Stop animation frame
        |       ^^^^^^^^^^^^^^^^
    610 |
    611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
    612 |

ERROR in src/TranslationRoom.tsx:611:7
TS2304: Cannot find name 'mediaRecorderRef'.
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |
  > 611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
        |       ^^^^^^^^^^^^^^^^
    612 |
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |

ERROR in src/TranslationRoom.tsx:611:47
TS2304: Cannot find name 'animationFrameRef'.
    609 |       mediaRecorderRef.current.stop();    // Stop animation frame
    610 |
  > 611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
        |                                               ^^^^^^^^^^^^^^^^^
    612 |
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |

ERROR in src/TranslationRoom.tsx:613:33
TS2304: Cannot find name 'animationFrameRef'.
    611 |       mediaRecorderRef.current = null;    if (animationFrameRef.current) {
    612 |
  > 613 |     }      cancelAnimationFrame(animationFrameRef.current);
        |                                 ^^^^^^^^^^^^^^^^^
    614 |
    615 |       animationFrameRef.current = null;
    616 |

ERROR in src/TranslationRoom.tsx:615:7
TS2304: Cannot find name 'animationFrameRef'.
    613 |     }      cancelAnimationFrame(animationFrameRef.current);
    614 |
  > 615 |       animationFrameRef.current = null;
        |       ^^^^^^^^^^^^^^^^^
    616 |
    617 |     // Stop animation frame    }
    618 |

ERROR in src/TranslationRoom.tsx:619:9
TS2304: Cannot find name 'animationFrameRef'.
    617 |     // Stop animation frame    }
    618 |
  > 619 |     if (animationFrameRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    620 |
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |

ERROR in src/TranslationRoom.tsx:621:28
TS2304: Cannot find name 'animationFrameRef'.
    619 |     if (animationFrameRef.current) {
    620 |
  > 621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
        |                            ^^^^^^^^^^^^^^^^^
    622 |
    623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
    624 |

ERROR in src/TranslationRoom.tsx:623:7
TS2304: Cannot find name 'animationFrameRef'.
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |
  > 623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
        |       ^^^^^^^^^^^^^^^^^
    624 |
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |

ERROR in src/TranslationRoom.tsx:623:48
TS2304: Cannot find name 'audioStreamRef'.
    621 |       cancelAnimationFrame(animationFrameRef.current);    // Stop all tracks
    622 |
  > 623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
        |                                                ^^^^^^^^^^^^^^
    624 |
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |

ERROR in src/TranslationRoom.tsx:625:12
TS2304: Cannot find name 'audioStreamRef'.
    623 |       animationFrameRef.current = null;    if (audioStreamRef.current) {
    624 |
  > 625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |            ^^^^^^^^^^^^^^
    626 |
    627 |       audioStreamRef.current = null;
    628 |

ERROR in src/TranslationRoom.tsx:627:7
TS2304: Cannot find name 'audioStreamRef'.
    625 |     }      audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    626 |
  > 627 |       audioStreamRef.current = null;
        |       ^^^^^^^^^^^^^^
    628 |
    629 |     // Stop all tracks    }
    630 |

ERROR in src/TranslationRoom.tsx:631:9
TS2304: Cannot find name 'audioStreamRef'.
    629 |     // Stop all tracks    }
    630 |
  > 631 |     if (audioStreamRef.current) {
        |         ^^^^^^^^^^^^^^
    632 |
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |

ERROR in src/TranslationRoom.tsx:633:7
TS2304: Cannot find name 'audioStreamRef'.
    631 |     if (audioStreamRef.current) {
    632 |
  > 633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
        |       ^^^^^^^^^^^^^^
    634 |
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |

ERROR in src/TranslationRoom.tsx:633:101
TS2304: Cannot find name 'combinedStreamRef'.
    631 |     if (audioStreamRef.current) {
    632 |
  > 633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
        |                                                                                                     ^^^^^^^^^^^^^^^^^
    634 |
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |

ERROR in src/TranslationRoom.tsx:635:7
TS2304: Cannot find name 'audioStreamRef'.
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |
  > 635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |       ^^^^^^^^^^^^^^
    636 |
    637 |     }      combinedStreamRef.current = null;
    638 |

ERROR in src/TranslationRoom.tsx:635:43
TS2304: Cannot find name 'combinedStreamRef'.
    633 |       audioStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    if (combinedStreamRef.current) {
    634 |
  > 635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
        |                                           ^^^^^^^^^^^^^^^^^
    636 |
    637 |     }      combinedStreamRef.current = null;
    638 |

ERROR in src/TranslationRoom.tsx:637:12
TS2304: Cannot find name 'combinedStreamRef'.
    635 |       audioStreamRef.current = null;      combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());
    636 |
  > 637 |     }      combinedStreamRef.current = null;
        |            ^^^^^^^^^^^^^^^^^
    638 |
    639 |     }
    640 |

ERROR in src/TranslationRoom.tsx:641:9
TS2304: Cannot find name 'combinedStreamRef'.
    639 |     }
    640 |
  > 641 |     if (combinedStreamRef.current) {
        |         ^^^^^^^^^^^^^^^^^
    642 |
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |

ERROR in src/TranslationRoom.tsx:643:7
TS2304: Cannot find name 'combinedStreamRef'.
    641 |     if (combinedStreamRef.current) {
    642 |
  > 643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
        |       ^^^^^^^^^^^^^^^^^
    644 |
    645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
    646 |

ERROR in src/TranslationRoom.tsx:645:7
TS2304: Cannot find name 'combinedStreamRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |       ^^^^^^^^^^^^^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:645:48
TS2304: Cannot find name 'wsRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |                                                ^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:645:65
TS2304: Cannot find name 'wsRef'.
    643 |       combinedStreamRef.current.getTracks().forEach((track: MediaStreamTrack) => track.stop());    // Close WebSocket connection
    644 |
  > 645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
        |                                                                 ^^^^^
    646 |
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |

ERROR in src/TranslationRoom.tsx:647:12
TS2304: Cannot find name 'wsRef'.
    645 |       combinedStreamRef.current = null;    if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
    646 |
  > 647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
        |            ^^^^^
    648 |
    649 |       wsRef.current.close();
    650 |

ERROR in src/TranslationRoom.tsx:649:7
TS2304: Cannot find name 'wsRef'.
    647 |     }      wsRef.current.send(JSON.stringify({ type: 'stop' }));
    648 |
  > 649 |       wsRef.current.close();
        |       ^^^^^
    650 |
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |

ERROR in src/TranslationRoom.tsx:653:9
TS2304: Cannot find name 'wsRef'.
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |
  > 653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
        |         ^^^^^
    654 |
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |

ERROR in src/TranslationRoom.tsx:653:26
TS2304: Cannot find name 'wsRef'.
    651 |     // Close WebSocket connection      wsRef.current = null;
    652 |
  > 653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
        |                          ^^^^^
    654 |
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |

ERROR in src/TranslationRoom.tsx:655:7
TS2304: Cannot find name 'wsRef'.
    653 |     if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {    }
    654 |
  > 655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
        |       ^^^^^
    656 |
    657 |       wsRef.current.close();    // Clear output video
    658 |

ERROR in src/TranslationRoom.tsx:657:7
TS2304: Cannot find name 'wsRef'.
    655 |       wsRef.current.send(JSON.stringify({ type: 'stop' }));
    656 |
  > 657 |       wsRef.current.close();    // Clear output video
        |       ^^^^^
    658 |
    659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
    660 |

ERROR in src/TranslationRoom.tsx:659:7
TS2304: Cannot find name 'wsRef'.
    657 |       wsRef.current.close();    // Clear output video
    658 |
  > 659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
        |       ^^^^^
    660 |
    661 |     }    if (outputVideo) {
    662 |

ERROR in src/TranslationRoom.tsx:659:52
TS2304: Cannot find name 'outputVideoRef'.
    657 |       wsRef.current.close();    // Clear output video
    658 |
  > 659 |       wsRef.current = null;    const outputVideo = outputVideoRef.current;
        |                                                    ^^^^^^^^^^^^^^
    660 |
    661 |     }    if (outputVideo) {
    662 |

ERROR in src/TranslationRoom.tsx:663:7
TS2448: Block-scoped variable 'outputVideo' used before its declaration.
    661 |     }    if (outputVideo) {
    662 |
  > 663 |       outputVideo.pause();
        |       ^^^^^^^^^^^
    664 |
    665 |     // Clear output video      outputVideo.src = '';
    666 |

ERROR in src/TranslationRoom.tsx:667:25
TS2304: Cannot find name 'outputVideoRef'.
    665 |     // Clear output video      outputVideo.src = '';
    666 |
  > 667 |     const outputVideo = outputVideoRef.current;    }
        |                         ^^^^^^^^^^^^^^
    668 |
    669 |     if (outputVideo) {
    670 |

ERROR in src/TranslationRoom.tsx:673:36
TS2304: Cannot find name 'outputHlsRef'.
    671 |       outputVideo.pause();    // Stop HLS if it's running
    672 |
  > 673 |       outputVideo.src = '';    if (outputHlsRef.current) {
        |                                    ^^^^^^^^^^^^
    674 |
    675 |     }      outputHlsRef.current.destroy();
    676 |

ERROR in src/TranslationRoom.tsx:675:12
TS2304: Cannot find name 'outputHlsRef'.
    673 |       outputVideo.src = '';    if (outputHlsRef.current) {
    674 |
  > 675 |     }      outputHlsRef.current.destroy();
        |            ^^^^^^^^^^^^
    676 |
    677 |       outputHlsRef.current = null;
    678 |

ERROR in src/TranslationRoom.tsx:677:7
TS2304: Cannot find name 'outputHlsRef'.
    675 |     }      outputHlsRef.current.destroy();
    676 |
  > 677 |       outputHlsRef.current = null;
        |       ^^^^^^^^^^^^
    678 |
    679 |     // Stop HLS if it's running    }
    680 |

ERROR in src/TranslationRoom.tsx:681:9
TS2304: Cannot find name 'outputHlsRef'.
    679 |     // Stop HLS if it's running    }
    680 |
  > 681 |     if (outputHlsRef.current) {
        |         ^^^^^^^^^^^^
    682 |
    683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
    684 |

ERROR in src/TranslationRoom.tsx:683:7
TS2304: Cannot find name 'outputHlsRef'.
    681 |     if (outputHlsRef.current) {
    682 |
  > 683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
        |       ^^^^^^^^^^^^
    684 |
    685 |       outputHlsRef.current = null;  };
    686 |

ERROR in src/TranslationRoom.tsx:683:42
TS2304: Cannot find name 'setIsTranslating'.
    681 |     if (outputHlsRef.current) {
    682 |
  > 683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
        |                                          ^^^^^^^^^^^^^^^^
    684 |
    685 |       outputHlsRef.current = null;  };
    686 |

ERROR in src/TranslationRoom.tsx:685:7
TS2304: Cannot find name 'outputHlsRef'.
    683 |       outputHlsRef.current.destroy();    setIsTranslating(false);
    684 |
  > 685 |       outputHlsRef.current = null;  };
        |       ^^^^^^^^^^^^
    686 |
    687 |     }
    688 |

ERROR in src/TranslationRoom.tsx:689:41
TS2304: Cannot find name 'languages'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                         ^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:54
TS2304: Cannot find name 'languages'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                      ^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:69
TS7006: Parameter 'l' implicitly has an 'any' type.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                     ^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:689:86
TS2304: Cannot find name 'selectedLanguage'.
    687 |     }
    688 |
  > 689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
        |                                                                                      ^^^^^^^^^^^^^^^^
    690 |
    691 |     setIsTranslating(false);
    692 |

ERROR in src/TranslationRoom.tsx:691:5
TS2304: Cannot find name 'setIsTranslating'.
    689 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;
    690 |
  > 691 |     setIsTranslating(false);
        |     ^^^^^^^^^^^^^^^^
    692 |
    693 |     setStreamStatus('Stopped');  if (!inSession) {
    694 |

ERROR in src/TranslationRoom.tsx:693:5
TS2304: Cannot find name 'setStreamStatus'.
    691 |     setIsTranslating(false);
    692 |
  > 693 |     setStreamStatus('Stopped');  if (!inSession) {
        |     ^^^^^^^^^^^^^^^
    694 |
    695 |   };    return (
    696 |

ERROR in src/TranslationRoom.tsx:693:39
TS2304: Cannot find name 'inSession'.
    691 |     setIsTranslating(false);
    692 |
  > 693 |     setStreamStatus('Stopped');  if (!inSession) {
        |                                       ^^^^^^^^^
    694 |
    695 |   };    return (
    696 |

ERROR in src/TranslationRoom.tsx:699:72
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    697 |       <div className="translation-container">
    698 |
  > 699 |   const selectedLangObj = Array.isArray(languages) ? languages.find(l => l.value === selectedLanguage) : null;        <div className="translation-setup">
        |                                                                        ^
    700 |
    701 |           <h1>🌐 Translation Room</h1>
    702 |

ERROR in src/TranslationRoom.tsx:705:5
TS1005: '}' expected.
    703 |   if (!inSession) {          <p className="subtitle">Select a language and start translating live video content</p>
    704 |
  > 705 |     return (
        |     ^^^^^^
    706 |
    707 |       <div className="translation-container">          {loading ? (
    708 |

ERROR in src/TranslationRoom.tsx:707:57
TS2304: Cannot find name 'loading'.
    705 |     return (
    706 |
  > 707 |       <div className="translation-container">          {loading ? (
        |                                                         ^^^^^^^
    708 |
    709 |         <div className="translation-setup">            <div className="loading">Loading languages...</div>
    710 |

ERROR in src/TranslationRoom.tsx:713:133
TS2304: Cannot find name 'error'.
    711 |           <h1>🌐 Translation Room</h1>          ) : error ? (
    712 |
  > 713 |           <p className="subtitle">Select a language and start translating live video content</p>            <div className="error">{error}</div>
        |                                                                                                                                     ^^^^^
    714 |
    715 |           ) : (
    716 |

ERROR in src/TranslationRoom.tsx:717:12
TS2304: Cannot find name 'loading'.
    715 |           ) : (
    716 |
  > 717 |           {loading ? (            <div className="setup-form">
        |            ^^^^^^^
    718 |
    719 |             <div className="loading">Loading languages...</div>              <div className="form-group">
    720 |

ERROR in src/TranslationRoom.tsx:723:37
TS2304: Cannot find name 'error'.
    721 |           ) : error ? (                <label htmlFor="translatorName">Your Name</label>
    722 |
  > 723 |             <div className="error">{error}</div>                <input
        |                                     ^^^^^
    724 |
    725 |           ) : (                  id="translatorName"
    726 |

ERROR in src/TranslationRoom.tsx:725:11
TS1003: Identifier expected.
    723 |             <div className="error">{error}</div>                <input
    724 |
  > 725 |           ) : (                  id="translatorName"
        |           ^
    726 |
    727 |             <div className="setup-form">                  type="text"
    728 |

ERROR in src/TranslationRoom.tsx:731:91
TS2304: Cannot find name 'translatorName'.
    729 |               <div className="form-group">                  placeholder="Enter your name"
    730 |
  > 731 |                 <label htmlFor="translatorName">Your Name</label>                  value={translatorName}
        |                                                                                           ^^^^^^^^^^^^^^
    732 |
    733 |                 <input                  onChange={(e) => setTranslatorName(e.target.value)}
    734 |

ERROR in src/TranslationRoom.tsx:733:58
TS2304: Cannot find name 'setTranslatorName'.
    731 |                 <label htmlFor="translatorName">Your Name</label>                  value={translatorName}
    732 |
  > 733 |                 <input                  onChange={(e) => setTranslatorName(e.target.value)}
        |                                                          ^^^^^^^^^^^^^^^^^
    734 |
    735 |                   id="translatorName"                  className="translator-input"
    736 |

ERROR in src/TranslationRoom.tsx:741:26
TS2304: Cannot find name 'translatorName'.
    739 |                   placeholder="Enter your name"              </div>
    740 |
  > 741 |                   value={translatorName}
        |                          ^^^^^^^^^^^^^^
    742 |
    743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
    744 |

ERROR in src/TranslationRoom.tsx:743:30
TS7006: Parameter 'e' implicitly has an 'any' type.
    741 |                   value={translatorName}
    742 |
  > 743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
        |                              ^
    744 |
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |

ERROR in src/TranslationRoom.tsx:743:36
TS2304: Cannot find name 'setTranslatorName'.
    741 |                   value={translatorName}
    742 |
  > 743 |                   onChange={(e) => setTranslatorName(e.target.value)}              <div className="form-group">
        |                                    ^^^^^^^^^^^^^^^^^
    744 |
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |

ERROR in src/TranslationRoom.tsx:747:18
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    745 |                   className="translator-input"                <label htmlFor="language">Target Language</label>
    746 |
  > 747 |                 />                <select
        |                  ^
    748 |
    749 |               </div>                  id="language"
    750 |

ERROR in src/TranslationRoom.tsx:749:15
TS1003: Identifier expected.
    747 |                 />                <select
    748 |
  > 749 |               </div>                  id="language"
        |               ^^
    750 |
    751 |                   value={selectedLanguage}
    752 |

ERROR in src/TranslationRoom.tsx:751:26
TS2304: Cannot find name 'selectedLanguage'.
    749 |               </div>                  id="language"
    750 |
  > 751 |                   value={selectedLanguage}
        |                          ^^^^^^^^^^^^^^^^
    752 |
    753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
    754 |

ERROR in src/TranslationRoom.tsx:753:16
TS2746: This JSX tag's 'children' prop expects a single child of type 'ReactNode', but multiple children were provided.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                ^^^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:753:72
TS7006: Parameter 'e' implicitly has an 'any' type.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                                                                        ^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:753:78
TS2304: Cannot find name 'setSelectedLanguage'.
    751 |                   value={selectedLanguage}
    752 |
  > 753 |               <div className="form-group">                  onChange={(e) => setSelectedLanguage(e.target.value)}
        |                                                                              ^^^^^^^^^^^^^^^^^^^
    754 |
    755 |                 <label htmlFor="language">Target Language</label>                  className="language-select"
    756 |

ERROR in src/TranslationRoom.tsx:761:26
TS2304: Cannot find name 'selectedLanguage'.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                          ^^^^^^^^^^^^^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:761:62
TS2304: Cannot find name 'languages'.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                                                              ^^^^^^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:761:77
TS7006: Parameter 'lang' implicitly has an 'any' type.
    759 |                   id="language"                  <option value="">-- Select a language --</option>
    760 |
  > 761 |                   value={selectedLanguage}                  {languages.map((lang) => (
        |                                                                             ^^^^
    762 |
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |

ERROR in src/TranslationRoom.tsx:763:19
TS2304: Cannot find name 'onChange'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                   ^^^^^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:28
TS2349: This expression is not callable.
  Type '{}' has no call signatures.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                            ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:29
TS1136: Property assignment expected.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                             ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:30
TS2304: Cannot find name 'e'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                              ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:33
TS1005: ')' expected.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                 ^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:34
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                  ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:71
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                       ^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:105
TS2304: Cannot find name 'lang'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                                                         ^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:763:124
TS2304: Cannot find name 'lang'.
    761 |                   value={selectedLanguage}                  {languages.map((lang) => (
    762 |
  > 763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
        |                                                                                                                            ^^^^
    764 |
    765 |                   className="language-select"                      {lang.label}
    766 |

ERROR in src/TranslationRoom.tsx:765:69
TS2304: Cannot find name 'lang'.
    763 |                   onChange={(e) => setSelectedLanguage(e.target.value)}                    <option key={lang.value} value={lang.value}>
    764 |
  > 765 |                   className="language-select"                      {lang.label}
        |                                                                     ^^^^
    766 |
    767 |                 >                    </option>
    768 |

ERROR in src/TranslationRoom.tsx:767:17
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    765 |                   className="language-select"                      {lang.label}
    766 |
  > 767 |                 >                    </option>
        |                 ^
    768 |
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |

ERROR in src/TranslationRoom.tsx:769:88
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    767 |                 >                    </option>
    768 |
  > 769 |                   <option value="">-- Select a language --</option>                  ))}
        |                                                                                        ^
    770 |
    771 |                   {languages.map((lang) => (                </select>
    772 |

ERROR in src/TranslationRoom.tsx:771:20
TS2304: Cannot find name 'languages'.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                    ^^^^^^^^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:771:35
TS7006: Parameter 'lang' implicitly has an 'any' type.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                                   ^^^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:771:61
TS1109: Expression expected.
    769 |                   <option value="">-- Select a language --</option>                  ))}
    770 |
  > 771 |                   {languages.map((lang) => (                </select>
        |                                                             ^^
    772 |
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |

ERROR in src/TranslationRoom.tsx:773:22
TS17008: JSX element 'option' has no corresponding closing tag.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                      ^^^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:773:34
TS2304: Cannot find name 'lang'.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                                  ^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:773:53
TS2304: Cannot find name 'lang'.
    771 |                   {languages.map((lang) => (                </select>
    772 |
  > 773 |                     <option key={lang.value} value={lang.value}>              </div>
        |                                                     ^^^^
    774 |
    775 |                       {lang.label}
    776 |

ERROR in src/TranslationRoom.tsx:775:24
TS2304: Cannot find name 'lang'.
    773 |                     <option key={lang.value} value={lang.value}>              </div>
    774 |
  > 775 |                       {lang.label}
        |                        ^^^^
    776 |
    777 |                     </option>              <button
    778 |

ERROR in src/TranslationRoom.tsx:777:23
TS17002: Expected corresponding JSX closing tag for 'div'.
    775 |                       {lang.label}
    776 |
  > 777 |                     </option>              <button
        |                       ^^^^^^
    778 |
    779 |                   ))}                className="join-translation-btn"
    780 |

ERROR in src/TranslationRoom.tsx:779:19
TS1003: Identifier expected.
    777 |                     </option>              <button
    778 |
  > 779 |                   ))}                className="join-translation-btn"
        |                   ^
    780 |
    781 |                 </select>                onClick={handleJoinSession}
    782 |

ERROR in src/TranslationRoom.tsx:779:21
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    777 |                     </option>              <button
    778 |
  > 779 |                   ))}                className="join-translation-btn"
        |                     ^
    780 |
    781 |                 </select>                onClick={handleJoinSession}
    782 |

ERROR in src/TranslationRoom.tsx:781:19
TS17002: Expected corresponding JSX closing tag for 'div'.
    779 |                   ))}                className="join-translation-btn"
    780 |
  > 781 |                 </select>                onClick={handleJoinSession}
        |                   ^^^^^^
    782 |
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |

ERROR in src/TranslationRoom.tsx:781:51
TS2304: Cannot find name 'handleJoinSession'.
    779 |                   ))}                className="join-translation-btn"
    780 |
  > 781 |                 </select>                onClick={handleJoinSession}
        |                                                   ^^^^^^^^^^^^^^^^^
    782 |
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |

ERROR in src/TranslationRoom.tsx:783:37
TS1005: ')' expected.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                     ^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:783:48
TS2304: Cannot find name 'selectedLanguage'.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                                ^^^^^^^^^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:783:69
TS2304: Cannot find name 'translatorName'.
    781 |                 </select>                onClick={handleJoinSession}
    782 |
  > 783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
        |                                                                     ^^^^^^^^^^^^^^
    784 |
    785 |               >
    786 |

ERROR in src/TranslationRoom.tsx:785:15
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    783 |               </div>                disabled={!selectedLanguage || !translatorName.trim()}
    784 |
  > 785 |               >
        |               ^
    786 |
    787 |               <button                Join Translation Room
    788 |

ERROR in src/TranslationRoom.tsx:787:38
TS2322: Type '{ Join: true; Translation: true; Room: true; className: string; }' is not assignable to type 'DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>'.
  Property 'Join' does not exist on type 'DetailedHTMLProps<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>'.
    785 |               >
    786 |
  > 787 |               <button                Join Translation Room
        |                                      ^^^^
    788 |
    789 |                 className="join-translation-btn"              </button>
    790 |

ERROR in src/TranslationRoom.tsx:789:63
TS1003: Identifier expected.
    787 |               <button                Join Translation Room
    788 |
  > 789 |                 className="join-translation-btn"              </button>
        |                                                               ^^
    790 |
    791 |                 onClick={handleJoinSession}            </div>
    792 |

ERROR in src/TranslationRoom.tsx:789:65
TS17002: Expected corresponding JSX closing tag for 'div'.
    787 |               <button                Join Translation Room
    788 |
  > 789 |                 className="join-translation-btn"              </button>
        |                                                                 ^^^^^^
    790 |
    791 |                 onClick={handleJoinSession}            </div>
    792 |

ERROR in src/TranslationRoom.tsx:791:17
TS1005: ')' expected.
    789 |                 className="join-translation-btn"              </button>
    790 |
  > 791 |                 onClick={handleJoinSession}            </div>
        |                 ^^^^^^^
    792 |
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |

ERROR in src/TranslationRoom.tsx:791:26
TS2304: Cannot find name 'handleJoinSession'.
    789 |                 className="join-translation-btn"              </button>
    790 |
  > 791 |                 onClick={handleJoinSession}            </div>
        |                          ^^^^^^^^^^^^^^^^^
    792 |
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |

ERROR in src/TranslationRoom.tsx:793:28
TS2304: Cannot find name 'selectedLanguage'.
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                            ^^^^^^^^^^^^^^^^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:793:49
TS2304: Cannot find name 'translatorName'.
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                                                 ^^^^^^^^^^^^^^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:793:82
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    791 |                 onClick={handleJoinSession}            </div>
    792 |
  > 793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
        |                                                                                  ^
    794 |
    795 |               >        </div>
    796 |

ERROR in src/TranslationRoom.tsx:795:15
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    793 |                 disabled={!selectedLanguage || !translatorName.trim()}          )}
    794 |
  > 795 |               >        </div>
        |               ^
    796 |
    797 |                 Join Translation Room      </div>
    798 |

ERROR in src/TranslationRoom.tsx:799:15
TS1005: ')' expected.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |               ^^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:799:17
TS2304: Cannot find name 'button'.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |                 ^^^^^^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:799:28
TS1109: Expression expected.
    797 |                 Join Translation Room      </div>
    798 |
  > 799 |               </button>    );
        |                            ^
    800 |
    801 |             </div>  }
    802 |

ERROR in src/TranslationRoom.tsx:801:13
TS1128: Declaration or statement expected.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |             ^^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:801:15
TS2304: Cannot find name 'div'.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |               ^^^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:801:21
TS1109: Expression expected.
    799 |               </button>    );
    800 |
  > 801 |             </div>  }
        |                     ^
    802 |
    803 |           )}
    804 |

ERROR in src/TranslationRoom.tsx:803:11
TS1128: Declaration or statement expected.
    801 |             </div>  }
    802 |
  > 803 |           )}
        |           ^
    804 |
    805 |         </div>  return (
    806 |

ERROR in src/TranslationRoom.tsx:803:12
TS1128: Declaration or statement expected.
    801 |             </div>  }
    802 |
  > 803 |           )}
        |            ^
    804 |
    805 |         </div>  return (
    806 |

ERROR in src/TranslationRoom.tsx:805:9
TS1128: Declaration or statement expected.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |         ^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:805:11
TS2304: Cannot find name 'div'.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |           ^^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:805:17
TS1109: Expression expected.
    803 |           )}
    804 |
  > 805 |         </div>  return (
        |                 ^^^^^^
    806 |
    807 |       </div>    <div className="translation-session">
    808 |

ERROR in src/TranslationRoom.tsx:807:7
TS1109: Expression expected.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |       ^^
    808 |
    809 |     );      <header className="session-header">
    810 |

ERROR in src/TranslationRoom.tsx:807:9
TS2304: Cannot find name 'div'.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |         ^^^
    808 |
    809 |     );      <header className="session-header">
    810 |

ERROR in src/TranslationRoom.tsx:807:17
TS2657: JSX expressions must have one parent element.
    805 |         </div>  return (
    806 |
  > 807 |       </div>    <div className="translation-session">
        |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  > 808 |
        | ^
  > 809 |     );      <header className="session-header">
        | ^
  > 810 |
        | ^
  > 811 |   }        <div className="header-info">
        | ^
  > 812 |
        | ^
  > 813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
        | ^
  > 814 |
        | ^
  > 815 |   return (          <span className="translator-badge">{translatorName}</span>
        | ^
  > 816 |
        | ^
  > 817 |     <div className="translation-session">        </div>
        | ^
  > 818 |
        | ^
  > 819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
        | ^
  > 820 |
        | ^
  > 821 |         <div className="header-info">          ← Leave Session
        | ^
  > 822 |
        | ^
  > 823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
        | ^
  > 824 |
        | ^
  > 825 |           <span className="translator-badge">{translatorName}</span>      </header>
        | ^
  > 826 |
        | ^
  > 827 |         </div>
        | ^
  > 828 |
        | ^
  > 829 |         <button className="leave-session-btn" onClick={handleLeaveSession}>      <div className="video-grid">
        | ^
  > 830 |
        | ^
  > 831 |           ← Leave Session        <div className="video-panel">
        | ^
  > 832 |
        | ^
  > 833 |         </button>          <div className="panel-header">
        | ^
  > 834 |
        | ^
  > 835 |       </header>            <h3>📺 Source Video</h3>
        | ^
  > 836 |
        | ^
  > 837 |             <span className="status-badge source">Live</span>
        | ^
  > 838 |
        | ^
  > 839 |       <div className="video-grid">          </div>
        | ^
  > 840 |
        | ^
  > 841 |         <div className="video-panel">          <div className="video-wrapper">
        | ^
  > 842 |
        | ^
  > 843 |           <div className="panel-header">            <video
        | ^
  > 844 |
        | ^
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        | ^
  > 846 |
        | ^
  > 847 |             <span className="status-badge source">Live</span>              className="translation-video"
        | ^
  > 848 |
        | ^
  > 849 |           </div>              controls
        | ^
  > 850 |
        | ^
  > 851 |           <div className="video-wrapper">              muted
        | ^
  > 852 |
        | ^
  > 853 |             <video              playsInline
        | ^
  > 854 |
        | ^
  > 855 |               ref={sourceVideoRef}            />
        | ^
  > 856 |
        | ^
  > 857 |               className="translation-video"          </div>
        | ^
  > 858 |
        | ^
  > 859 |               controls        </div>
        | ^
  > 860 |
        | ^
  > 861 |               muted
        | ^
  > 862 |
        | ^
  > 863 |               playsInline        <div className="video-panel">
        | ^
  > 864 |
        | ^
  > 865 |             />          <div className="panel-header">
        | ^
  > 866 |
        | ^
  > 867 |           </div>            <h3>🎙️ Translation Output</h3>
        | ^
  > 868 |
        | ^
  > 869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
        | ^
  > 870 |
        | ^
  > 871 |               {isTranslating ? 'Streaming' : 'Waiting'}
        | ^
  > 872 |
        | ^
  > 873 |         <div className="video-panel">            </span>
        | ^
  > 874 |
        | ^
  > 875 |           <div className="panel-header">          </div>
        | ^
  > 876 |
        | ^
  > 877 |             <h3>🎙️ Translation Output</h3>          <div className="video-wrapper">
        | ^
  > 878 |
        | ^
  > 879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
        | ^
  > 880 |
        | ^
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        | ^
  > 882 |
        | ^
  > 883 |             </span>              className="translation-video"
        | ^
  > 884 |
        | ^
  > 885 |           </div>              controls
        | ^
  > 886 |
        | ^
  > 887 |           <div className="video-wrapper">              playsInline
        | ^
  > 888 |
        | ^
  > 889 |             <video            />
        | ^
  > 890 |
        | ^
  > 891 |               ref={outputVideoRef}          </div>
        | ^
  > 892 |
        | ^
  > 893 |               className="translation-video"        </div>
        | ^
  > 894 |
        | ^
  > 895 |               controls      </div>
        | ^
  > 896 |
        | ^
  > 897 |               playsInline
        | ^
  > 898 |
        | ^
  > 899 |             />      <div className="control-panel">
        | ^
  > 900 |
        | ^
  > 901 |           </div>        <div className="stream-info">
        | ^
  > 902 |
        | ^
  > 903 |         </div>          <div className="info-item">
        | ^
  > 904 |
        | ^
  > 905 |       </div>            <strong>RTMP Server:</strong> {RTMP_SERVER}
        | ^
  > 906 |
        | ^
  > 907 |           </div>
        | ^
  > 908 |
        | ^
  > 909 |       <div className="control-panel">          <div className="info-item">
        | ^
  > 910 |
        | ^
  > 911 |         <div className="stream-info">            <strong>Stream Key:</strong> {selectedLanguage}
        | ^
  > 912 |
        | ^
  > 913 |           <div className="info-item">          </div>
        | ^
  > 914 |
        | ^
  > 915 |             <strong>RTMP Server:</strong> {RTMP_SERVER}          <div className="info-item">
        | ^
  > 916 |
        | ^
  > 917 |           </div>            <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8
        | ^
  > 918 |
        | ^
  > 919 |           <div className="info-item">          </div>
        | ^
  > 920 |
        | ^
  > 921 |             <strong>Stream Key:</strong> {selectedLanguage}        </div>
        | ^
  > 922 |
        | ^
  > 923 |           </div>
        | ^
  > 924 |
        | ^
  > 925 |           <div className="info-item">        <div className="control-buttons">
        | ^
  > 926 |
        | ^
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        | ^
  > 928 |
        | ^
  > 929 |           </div>            <button className="start-btn" onClick={startTranslation}>
        | ^
  > 930 |
        | ^
  > 931 |           {streamStatus && (              🎙️ Start Translating
        | ^
  > 932 |
        | ^
  > 933 |             <div className="info-item status-info">            </button>
        | ^
  > 934 |
        | ^
  > 935 |               <strong>Status:</strong> {streamStatus}          ) : (
        | ^
  > 936 |
        | ^
  > 937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
        | ^
  > 938 |
        | ^
  > 939 |           )}              ⏹️ Stop Streaming
        | ^
  > 940 |
        | ^
  > 941 |         </div>            </button>
        | ^^^^^^^^^^^^^^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:809:14
TS17008: JSX element 'header' has no corresponding closing tag.
    807 |       </div>    <div className="translation-session">
    808 |
  > 809 |     );      <header className="session-header">
        |              ^^^^^^
    810 |
    811 |   }        <div className="header-info">
    812 |

ERROR in src/TranslationRoom.tsx:811:3
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    809 |     );      <header className="session-header">
    810 |
  > 811 |   }        <div className="header-info">
        |   ^
    812 |
    813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
    814 |

ERROR in src/TranslationRoom.tsx:813:38
TS2304: Cannot find name 'selectedLangObj'.
    811 |   }        <div className="header-info">
    812 |
  > 813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
        |                                      ^^^^^^^^^^^^^^^
    814 |
    815 |   return (          <span className="translator-badge">{translatorName}</span>
    816 |

ERROR in src/TranslationRoom.tsx:815:57
TS2304: Cannot find name 'translatorName'.
    813 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>
    814 |
  > 815 |   return (          <span className="translator-badge">{translatorName}</span>
        |                                                         ^^^^^^^^^^^^^^
    816 |
    817 |     <div className="translation-session">        </div>
    818 |

ERROR in src/TranslationRoom.tsx:819:97
TS2304: Cannot find name 'handleLeaveSession'.
    817 |     <div className="translation-session">        </div>
    818 |
  > 819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
        |                                                                                                 ^^^^^^^^^^^^^^^^^^
    820 |
    821 |         <div className="header-info">          ← Leave Session
    822 |

ERROR in src/TranslationRoom.tsx:821:10
TS17008: JSX element 'div' has no corresponding closing tag.
    819 |       <header className="session-header">        <button className="leave-session-btn" onClick={handleLeaveSession}>
    820 |
  > 821 |         <div className="header-info">          ← Leave Session
        |          ^^^
    822 |
    823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
    824 |

ERROR in src/TranslationRoom.tsx:823:38
TS2304: Cannot find name 'selectedLangObj'.
    821 |         <div className="header-info">          ← Leave Session
    822 |
  > 823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
        |                                      ^^^^^^^^^^^^^^^
    824 |
    825 |           <span className="translator-badge">{translatorName}</span>      </header>
    826 |

ERROR in src/TranslationRoom.tsx:825:47
TS2304: Cannot find name 'translatorName'.
    823 |           <h2>🌐 Translation Room - {selectedLangObj?.label}</h2>        </button>
    824 |
  > 825 |           <span className="translator-badge">{translatorName}</span>      </header>
        |                                               ^^^^^^^^^^^^^^
    826 |
    827 |         </div>
    828 |

ERROR in src/TranslationRoom.tsx:829:56
TS2304: Cannot find name 'handleLeaveSession'.
    827 |         </div>
    828 |
  > 829 |         <button className="leave-session-btn" onClick={handleLeaveSession}>      <div className="video-grid">
        |                                                        ^^^^^^^^^^^^^^^^^^
    830 |
    831 |           ← Leave Session        <div className="video-panel">
    832 |

ERROR in src/TranslationRoom.tsx:833:11
TS17002: Expected corresponding JSX closing tag for 'div'.
    831 |           ← Leave Session        <div className="video-panel">
    832 |
  > 833 |         </button>          <div className="panel-header">
        |           ^^^^^^
    834 |
    835 |       </header>            <h3>📺 Source Video</h3>
    836 |

ERROR in src/TranslationRoom.tsx:835:9
TS17002: Expected corresponding JSX closing tag for 'div'.
    833 |         </button>          <div className="panel-header">
    834 |
  > 835 |       </header>            <h3>📺 Source Video</h3>
        |         ^^^^^^
    836 |
    837 |             <span className="status-badge source">Live</span>
    838 |

ERROR in src/TranslationRoom.tsx:845:14
TS2304: Cannot find name 'h3'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |              ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:14
TS2558: Expected 0 type arguments, but got 1.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |              ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:17
TS1127: Invalid character.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                 ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:34
TS17002: Expected corresponding JSX closing tag for 'div'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                                  ^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:845:56
TS2304: Cannot find name 'sourceVideoRef'.
    843 |           <div className="panel-header">            <video
    844 |
  > 845 |             <h3>📺 Source Video</h3>              ref={sourceVideoRef}
        |                                                        ^^^^^^^^^^^^^^
    846 |
    847 |             <span className="status-badge source">Live</span>              className="translation-video"
    848 |

ERROR in src/TranslationRoom.tsx:855:20
TS2304: Cannot find name 'sourceVideoRef'.
    853 |             <video              playsInline
    854 |
  > 855 |               ref={sourceVideoRef}            />
        |                    ^^^^^^^^^^^^^^
    856 |
    857 |               className="translation-video"          </div>
    858 |

ERROR in src/TranslationRoom.tsx:865:14
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    863 |               playsInline        <div className="video-panel">
    864 |
  > 865 |             />          <div className="panel-header">
        |              ^
    866 |
    867 |           </div>            <h3>🎙️ Translation Output</h3>
    868 |

ERROR in src/TranslationRoom.tsx:869:60
TS2304: Cannot find name 'isTranslating'.
    867 |           </div>            <h3>🎙️ Translation Output</h3>
    868 |
  > 869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
        |                                                            ^^^^^^^^^^^^^
    870 |
    871 |               {isTranslating ? 'Streaming' : 'Waiting'}
    872 |

ERROR in src/TranslationRoom.tsx:871:16
TS2304: Cannot find name 'isTranslating'.
    869 |         </div>            <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>
    870 |
  > 871 |               {isTranslating ? 'Streaming' : 'Waiting'}
        |                ^^^^^^^^^^^^^
    872 |
    873 |         <div className="video-panel">            </span>
    874 |

ERROR in src/TranslationRoom.tsx:873:10
TS17008: JSX element 'div' has no corresponding closing tag.
    871 |               {isTranslating ? 'Streaming' : 'Waiting'}
    872 |
  > 873 |         <div className="video-panel">            </span>
        |          ^^^
    874 |
    875 |           <div className="panel-header">          </div>
    876 |

ERROR in src/TranslationRoom.tsx:879:46
TS2304: Cannot find name 'isTranslating'.
    877 |             <h3>🎙️ Translation Output</h3>          <div className="video-wrapper">
    878 |
  > 879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
        |                                              ^^^^^^^^^^^^^
    880 |
    881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
    882 |

ERROR in src/TranslationRoom.tsx:881:16
TS1005: '...' expected.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:16
TS2304: Cannot find name 'isTranslating'.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:16
TS2698: Spread types may only be created from object types.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:881:75
TS2304: Cannot find name 'outputVideoRef'.
    879 |             <span className={`status-badge ${isTranslating ? 'streaming' : 'waiting'}`}>            <video
    880 |
  > 881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
        |                                                                           ^^^^^^^^^^^^^^
    882 |
    883 |             </span>              className="translation-video"
    884 |

ERROR in src/TranslationRoom.tsx:883:13
TS1003: Identifier expected.
    881 |               {isTranslating ? 'Streaming' : 'Waiting'}              ref={outputVideoRef}
    882 |
  > 883 |             </span>              className="translation-video"
        |             ^^
    884 |
    885 |           </div>              controls
    886 |

ERROR in src/TranslationRoom.tsx:891:20
TS2304: Cannot find name 'outputVideoRef'.
    889 |             <video            />
    890 |
  > 891 |               ref={outputVideoRef}          </div>
        |                    ^^^^^^^^^^^^^^
    892 |
    893 |               className="translation-video"        </div>
    894 |

ERROR in src/TranslationRoom.tsx:895:31
TS17002: Expected corresponding JSX closing tag for 'button'.
    893 |               className="translation-video"        </div>
    894 |
  > 895 |               controls      </div>
        |                               ^^^
    896 |
    897 |               playsInline
    898 |

ERROR in src/TranslationRoom.tsx:899:14
TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
    897 |               playsInline
    898 |
  > 899 |             />      <div className="control-panel">
        |              ^
    900 |
    901 |           </div>        <div className="stream-info">
    902 |

ERROR in src/TranslationRoom.tsx:911:80
TS2304: Cannot find name 'selectedLanguage'.
    909 |       <div className="control-panel">          <div className="info-item">
    910 |
  > 911 |         <div className="stream-info">            <strong>Stream Key:</strong> {selectedLanguage}
        |                                                                                ^^^^^^^^^^^^^^^^
    912 |
    913 |           <div className="info-item">          </div>
    914 |

ERROR in src/TranslationRoom.tsx:917:101
TS2304: Cannot find name 'selectedLanguage'.
    915 |             <strong>RTMP Server:</strong> {RTMP_SERVER}          <div className="info-item">
    916 |
  > 917 |           </div>            <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8
        |                                                                                                     ^^^^^^^^^^^^^^^^
    918 |
    919 |           <div className="info-item">          </div>
    920 |

ERROR in src/TranslationRoom.tsx:921:43
TS2304: Cannot find name 'selectedLanguage'.
    919 |           <div className="info-item">          </div>
    920 |
  > 921 |             <strong>Stream Key:</strong> {selectedLanguage}        </div>
        |                                           ^^^^^^^^^^^^^^^^
    922 |
    923 |           </div>
    924 |

ERROR in src/TranslationRoom.tsx:927:85
TS2304: Cannot find name 'selectedLanguage'.
    925 |           <div className="info-item">        <div className="control-buttons">
    926 |
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        |                                                                                     ^^^^^^^^^^^^^^^^
    928 |
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |

ERROR in src/TranslationRoom.tsx:927:128
TS2304: Cannot find name 'isTranslating'.
    925 |           <div className="info-item">        <div className="control-buttons">
    926 |
  > 927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
        |                                                                                                                                ^^^^^^^^^^^^^
    928 |
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |

ERROR in src/TranslationRoom.tsx:929:11
TS1109: Expression expected.
    927 |             <strong>Watch URL:</strong> https://tni-out.ceflixcdn.com/translations/{selectedLanguage}/playlist.m3u8          {!isTranslating ? (
    928 |
  > 929 |           </div>            <button className="start-btn" onClick={startTranslation}>
        |           ^^
    930 |
    931 |           {streamStatus && (              🎙️ Start Translating
    932 |

ERROR in src/TranslationRoom.tsx:931:12
TS2304: Cannot find name 'streamStatus'.
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |
  > 931 |           {streamStatus && (              🎙️ Start Translating
        |            ^^^^^^^^^^^^
    932 |
    933 |             <div className="info-item status-info">            </button>
    934 |

ERROR in src/TranslationRoom.tsx:931:43
TS1127: Invalid character.
    929 |           </div>            <button className="start-btn" onClick={startTranslation}>
    930 |
  > 931 |           {streamStatus && (              🎙️ Start Translating
        |                                           ^^
    932 |
    933 |             <div className="info-item status-info">            </button>
    934 |

ERROR in src/TranslationRoom.tsx:933:14
TS17008: JSX element 'div' has no corresponding closing tag.
    931 |           {streamStatus && (              🎙️ Start Translating
    932 |
  > 933 |             <div className="info-item status-info">            </button>
        |              ^^^
    934 |
    935 |               <strong>Status:</strong> {streamStatus}          ) : (
    936 |

ERROR in src/TranslationRoom.tsx:935:41
TS2304: Cannot find name 'streamStatus'.
    933 |             <div className="info-item status-info">            </button>
    934 |
  > 935 |               <strong>Status:</strong> {streamStatus}          ) : (
        |                                         ^^^^^^^^^^^^
    936 |
    937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
    938 |

ERROR in src/TranslationRoom.tsx:937:32
TS17008: JSX element 'button' has no corresponding closing tag.
    935 |               <strong>Status:</strong> {streamStatus}          ) : (
    936 |
  > 937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
        |                                ^^^^^^
    938 |
    939 |           )}              ⏹️ Stop Streaming
    940 |

ERROR in src/TranslationRoom.tsx:939:12
TS1381: Unexpected token. Did you mean `{'}'}` or `&rbrace;`?
    937 |             </div>            <button className="stop-btn" onClick={stopTranslation}>
    938 |
  > 939 |           )}              ⏹️ Stop Streaming
        |            ^
    940 |
    941 |         </div>            </button>
    942 |

ERROR in src/TranslationRoom.tsx:941:27
TS1005: ';' expected.
    939 |           )}              ⏹️ Stop Streaming
    940 |
  > 941 |         </div>            </button>
        |                           ^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:941:29
TS2304: Cannot find name 'button'.
    939 |           )}              ⏹️ Stop Streaming
    940 |
  > 941 |         </div>            </button>
        |                             ^^^^^^
    942 |
    943 |           )}
    944 |

ERROR in src/TranslationRoom.tsx:943:11
TS1109: Expression expected.
    941 |         </div>            </button>
    942 |
  > 943 |           )}
        |           ^
    944 |
    945 |         <div className="control-buttons">        </div>
    946 |

ERROR in src/TranslationRoom.tsx:943:12
TS1128: Declaration or statement expected.
    941 |         </div>            </button>
    942 |
  > 943 |           )}
        |            ^
    944 |
    945 |         <div className="control-buttons">        </div>
    946 |

ERROR in src/TranslationRoom.tsx:947:13
TS2304: Cannot find name 'isTranslating'.
    945 |         <div className="control-buttons">        </div>
    946 |
  > 947 |           {!isTranslating ? (
        |             ^^^^^^^^^^^^^
    948 |
    949 |             <button className="start-btn" onClick={startTranslation}>        <div className="rtmp-note">
    950 |

ERROR in src/TranslationRoom.tsx:949:79
TS17008: JSX element 'div' has no corresponding closing tag.
    947 |           {!isTranslating ? (
    948 |
  > 949 |             <button className="start-btn" onClick={startTranslation}>        <div className="rtmp-note">
        |                                                                               ^^^
    950 |
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |

ERROR in src/TranslationRoom.tsx:953:32
TS1005: ')' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                ^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:32
TS2304: Cannot find name 'Consider'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                ^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:41
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                         ^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:41
TS2304: Cannot find name 'using'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                         ^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:47
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                               ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:47
TS2304: Cannot find name 'OBS'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                               ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:51
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                   ^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:51
TS2304: Cannot find name 'Browser'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                   ^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:59
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                           ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:59
TS2304: Cannot find name 'Source'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                           ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:66
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                  ^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:66
TS2304: Cannot find name 'or'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                  ^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:69
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                     ^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:69
TS2304: Cannot find name 'a'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                     ^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:71
TS1435: Unknown keyword or identifier. Did you mean 'string'?
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                       ^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:71
TS2304: Cannot find name 'streaming'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                       ^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:81
TS1434: Unexpected keyword or identifier.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                 ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:81
TS2304: Cannot find name 'server'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                 ^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:92
TS1005: '(' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                            ^^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:92
TS2304: Cannot find name 'production'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                            ^^^^^^^^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:103
TS1005: ';' expected.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                                       ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:953:103
TS2304: Cannot find name 'use'.
    951 |               🎙️ Start Translating          <strong>Note:</strong> Direct RTMP streaming from browser requires a server-side bridge (WebRTC-to-RTMP).
    952 |
  > 953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
        |                                                                                                       ^^^
    954 |
    955 |           ) : (        </div>
    956 |

ERROR in src/TranslationRoom.tsx:955:11
TS1003: Identifier expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |           ^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:13
TS1109: Expression expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |             ^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:24
TS1109: Expression expected.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |                        ^^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:955:26
TS2304: Cannot find name 'div'.
    953 |             </button>          Consider using OBS Browser Source or a streaming server for production use.
    954 |
  > 955 |           ) : (        </div>
        |                          ^^^
    956 |
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |

ERROR in src/TranslationRoom.tsx:957:76
TS17002: Expected corresponding JSX closing tag for 'button'.
    955 |           ) : (        </div>
    956 |
  > 957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
        |                                                                            ^^^
    958 |
    959 |               ⏹️ Stop Streaming    </div>
    960 |

ERROR in src/TranslationRoom.tsx:959:15
TS1127: Invalid character.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |               ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:15
TS1128: Declaration or statement expected.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |               ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:16
TS1127: Invalid character.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                ^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:18
TS1434: Unexpected keyword or identifier.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                  ^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:18
TS2304: Cannot find name 'Stop'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                  ^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:23
TS1435: Unknown keyword or identifier. Did you mean 'string'?
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                       ^^^^^^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:23
TS2304: Cannot find name 'Streaming'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                       ^^^^^^^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:36
TS1128: Declaration or statement expected.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                                    ^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:959:38
TS2304: Cannot find name 'div'.
    957 |             <button className="stop-btn" onClick={stopTranslation}>      </div>
    958 |
  > 959 |               ⏹️ Stop Streaming    </div>
        |                                      ^^^
    960 |
    961 |             </button>  );
    962 |

ERROR in src/TranslationRoom.tsx:961:13
TS1109: Expression expected.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |             ^^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:961:15
TS2304: Cannot find name 'button'.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |               ^^^^^^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:961:24
TS1109: Expression expected.
    959 |               ⏹️ Stop Streaming    </div>
    960 |
  > 961 |             </button>  );
        |                        ^
    962 |
    963 |           )}};
    964 |

ERROR in src/TranslationRoom.tsx:963:11
TS1128: Declaration or statement expected.
    961 |             </button>  );
    962 |
  > 963 |           )}};
        |           ^
    964 |
    965 |         </div>
    966 |

ERROR in src/TranslationRoom.tsx:963:13
TS1128: Declaration or statement expected.
    961 |             </button>  );
    962 |
  > 963 |           )}};
        |             ^
    964 |
    965 |         </div>
    966 |

ERROR in src/TranslationRoom.tsx:965:9
TS1128: Declaration or statement expected.
    963 |           )}};
    964 |
  > 965 |         </div>
        |         ^^
    966 |
    967 | export default TranslationRoom;
    968 |

ERROR in src/TranslationRoom.tsx:965:11
TS2304: Cannot find name 'div'.
    963 |           )}};
    964 |
  > 965 |         </div>
        |           ^^^
    966 |
    967 | export default TranslationRoom;
    968 |

ERROR in src/TranslationRoom.tsx:967:1
TS1109: Expression expected.
    965 |         </div>
    966 |
  > 967 | export default TranslationRoom;
        | ^^^^^^
    968 |
    969 |         <div className="rtmp-note">
    970 |           <strong>How it works:</strong> Your microphone audio is combined with the source video and streamed to the RTMP server via a WebSocket bridge. 

ERROR in src/TranslationRoom.tsx:967:16
TS2528: A module cannot have multiple default exports.
    965 |         </div>
    966 |
  > 967 | export default TranslationRoom;
        |                ^^^^^^^^^^^^^^^
    968 |
    969 |         <div className="rtmp-note">
    970 |           <strong>How it works:</strong> Your microphone audio is combined with the source video and streamed to the RTMP server via a WebSocket bridge. 

ERROR in src/TranslationRoom.tsx:973:7
TS1128: Declaration or statement expected.
    971 |           Viewers can watch at the output URL above.
    972 |         </div>
  > 973 |       </div>
        |       ^^
    974 |     </div>
    975 |   );
    976 | };

ERROR in src/TranslationRoom.tsx:973:9
TS2304: Cannot find name 'div'.
    971 |           Viewers can watch at the output URL above.
    972 |         </div>
  > 973 |       </div>
        |         ^^^
    974 |     </div>
    975 |   );
    976 | };

ERROR in src/TranslationRoom.tsx:974:5
TS1109: Expression expected.
    972 |         </div>
    973 |       </div>
  > 974 |     </div>
        |     ^^
    975 |   );
    976 | };
    977 |

ERROR in src/TranslationRoom.tsx:974:7
TS2304: Cannot find name 'div'.
    972 |         </div>
    973 |       </div>
  > 974 |     </div>
        |       ^^^
    975 |   );
    976 | };
    977 |

ERROR in src/TranslationRoom.tsx:975:3
TS1109: Expression expected.
    973 |       </div>
    974 |     </div>
  > 975 |   );
        |   ^
    976 | };
    977 |
    978 | export default TranslationRoom;

ERROR in src/TranslationRoom.tsx:976:1
TS1128: Declaration or statement expected.
    974 |     </div>
    975 |   );
  > 976 | };
        | ^
    977 |
    978 | export default TranslationRoom;
    979 |

ERROR in src/TranslationRoom.tsx:978:16
TS2528: A module cannot have multiple default exports.
    976 | };
    977 |
  > 978 | export default TranslationRoom;
        |                ^^^^^^^^^^^^^^^
    979 |

Failed to compile.

[eslint] 
src/TranslationRoom.tsx
Syntax error: Property or signature expected (9:20)
ERROR in ./src/App.tsx 9:0-48
Module not found: Error: Can't resolve './TranslationRoom' in '/home/tniglobal/public_html/live/server/video-conferencing-frontend/src'

ERROR in [eslint] 
src/TranslationRoom.tsx
  Line 9:20:  Parsing error: Property or signature expected

webpack compiled with 2 errors
ERROR in src/App.tsx:5:29
TS2307: Cannot find module './TranslationRoom' or its corresponding type declarations.
    3 | import Sidebar from './Sidebar';
    4 | import VideoRooms from './VideoRooms';
  > 5 | import TranslationRoom from './TranslationRoom';
      |                             ^^^^^^^^^^^^^^^^^^^
    6 | import './App.css';
    7 |
    8 | function App() {

Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 24:10:  'sourceVideoReady' is assigned a value but never used     @typescript-eslint/no-unused-vars
  Line 24:28:  'setSourceVideoReady' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 24:10:  'sourceVideoReady' is assigned a value but never used     @typescript-eslint/no-unused-vars
  Line 24:28:  'setSourceVideoReady' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
No issues found.
Compiling...
Compiled with warnings.

[eslint] 
src/TranslationRoom.tsx
  Line 24:10:  'sourceVideoReady' is assigned a value but never used  @typescript-eslint/no-unused-vars

Search for the keywords to learn more about each warning.
To ignore, add // eslint-disable-next-line to the line before.

WARNING in [eslint] 
src/TranslationRoom.tsx
  Line 24:10:  'sourceVideoReady' is assigned a value but never used  @typescript-eslint/no-unused-vars

webpack compiled with 1 warning
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Compiling...
Compiled successfully!
webpack compiled successfully
No issues found.
Killed
