@@ -21,107 +21,136 @@ export const useSocketCommunication = () => {
2121 resetConsoleChunks,
2222 appendConsoleChunks,
2323 } = useGlobalStore ( ) ;
24+
2425 const { setActive, clearFrontendState } = useFrontendStateStore ( ) ;
2526 const { socketClient } = useSocketClientStore ( ) ;
26- const { setToastMessage : setMessage } = useToastStateStore ( ) ;
27+ const { setToastMessage } = useToastStateStore ( ) ;
2728 const queue = useQueue ( ) ;
2829
30+ // Setup socket event handlers on mount
2931 useEffect ( ( ) => {
30- const eventHandler = buildSocketEventHandler ( {
32+ console . log ( 'usesocketcom is mounted' ) ;
33+
34+ if ( ! socketClient ) {
35+ return ;
36+ }
37+
38+ const handlers = buildSocketEventHandler ( {
3139 setActive,
3240 updateNextFrame,
3341 updateTypeDeclaration,
3442 appendConsoleChunks,
3543 updateCurrFocusedTab,
36- setMessage,
44+ setMessage : setToastMessage ,
3745 } ) ;
3846
39- socketClient . setupEventHandlers ( eventHandler ) ;
40- } , [ ] ) ;
47+ socketClient . setupEventHandlers ( handlers ) ;
48+ } , [ socketClient ] ) ;
4149
50+ // reset entire debuggin session
4251 const resetDebugSession = useCallback ( ( ) => {
4352 updateNextFrame ( INITIAL_BACKEND_STATE ) ;
4453 clearFrontendState ( ) ;
4554 setActive ( false ) ;
4655 clearTypeDeclarations ( ) ;
4756 clearUserAnnotation ( ) ;
4857 resetConsoleChunks ( ) ;
49- } , [ ] ) ;
58+ } , [
59+ updateNextFrame ,
60+ clearFrontendState ,
61+ setActive ,
62+ clearTypeDeclarations ,
63+ clearUserAnnotation ,
64+ resetConsoleChunks ,
65+ ] ) ;
5066
67+ // error handler for sending code
68+ const handleSendCodeError = ( ) => {
69+ setToastMessage ( {
70+ content : 'No file being selected' ,
71+ colorTheme : 'warning' ,
72+ durationMs : DEFAULT_MESSAGE_DURATION ,
73+ } ) ;
74+ } ;
75+
76+ // send code to backend to start debugging session
5177 const sendCode = useCallback ( ( ) => {
78+ if ( ! socketClient ) return ;
79+
5280 resetDebugSession ( ) ;
81+
5382 const { fileSystem, currFocusFilePath } = useUserFsStateStore . getState ( ) ;
5483 const file = fileSystem . getFileFromPath ( currFocusFilePath ) ;
5584
5685 if ( ! file || file . path === 'root' ) {
57- setMessage ( {
58- content : 'No file being selected.' ,
59- colorTheme : 'warning' ,
60- durationMs : DEFAULT_MESSAGE_DURATION ,
61- } ) ;
86+ handleSendCodeError ( ) ;
6287 return ;
6388 }
89+
6490 socketClient . serverAction . initializeDebugSession ( file . data ) ;
65- } , [ socketClient ] ) ;
91+ } , [ socketClient , resetDebugSession ] ) ;
6692
67- const executeNextWithRetry = useCallback ( ( ) => {
68- const addEventListenerWithTimeout = (
69- listener : ( state : BackendState | null ) => void ,
70- timeout : number
71- ) => {
72- let resolved = false ;
73-
74- const wrappedListener = ( state : BackendState ) => {
75- if ( ! resolved ) {
76- resolved = true ;
77- listener ( state ) ;
78- socketClient . socket . off ( 'sendBackendStateToUser' , wrappedListener ) ;
79- }
80- } ;
81-
82- socketClient . socket . on ( 'sendBackendStateToUser' , wrappedListener ) ;
83-
84- setTimeout ( ( ) => {
85- if ( ! resolved ) {
86- resolved = true ;
87- listener ( null ) ;
88- socketClient . socket . off ( 'sendBackendStateToUser' , wrappedListener ) ;
89- }
90- } , timeout ) ;
93+ // add event listener with timeout
94+ const addEventListenerWithTimeout = (
95+ listener : ( state : BackendState | null ) => void ,
96+ timeout : number
97+ ) => {
98+ if ( ! socketClient ) return ;
99+
100+ let resolved = false ;
101+
102+ const wrappedListener = ( state : BackendState ) => {
103+ if ( ! resolved ) {
104+ resolved = true ;
105+ listener ( state ) ;
106+ socketClient . socket . off ( 'sendBackendStateToUser' , wrappedListener ) ;
107+ }
91108 } ;
92109
110+ socketClient . socket . on ( 'sendBackendStateToUser' , wrappedListener ) ;
111+
112+ setTimeout ( ( ) => {
113+ if ( ! resolved ) {
114+ resolved = true ;
115+ listener ( null ) ;
116+ socketClient . socket . off ( 'sendBackendStateToUser' , wrappedListener ) ;
117+ }
118+ } , timeout ) ;
119+ } ;
120+
121+ // step debugger and wait for backend to respond
122+ const executeNextWithRetry = useCallback ( ( ) => {
123+ if ( ! socketClient ) return Promise . resolve ( false ) ;
124+
93125 return queue ( ( ) => {
94126 return new Promise < boolean > ( ( resolve ) => {
95127 const handleBackendState = ( state : BackendState | null ) => {
96- if ( state ) {
97- resolve ( true ) ; // Resolve as success
98- } else {
99- resolve ( false ) ; // Resolve as failure due to timeout
100- }
128+ resolve ( ! ! state ) ;
101129 } ;
102130
103- // Add the event listener with a timeout
104131 addEventListenerWithTimeout ( handleBackendState , 5000 ) ;
105132 socketClient . serverAction . executeNext ( ) ;
106133 } ) ;
107134 } ) ;
108- } , [ socketClient ] ) ;
135+ } , [ socketClient , queue ] ) ;
109136
137+ // to call multiple next states in bulk
110138 const bulkSendNextStates = useCallback (
111139 async ( count : number ) => {
112- const results = await Promise . all ( Array . from ( { length : count } , executeNextWithRetry ) ) ;
113- const successfulCount = results . filter ( ( result ) => result ) . length ;
114- return successfulCount ;
140+ const results = await Promise . all (
141+ Array . from ( { length : count } , ( ) => executeNextWithRetry ( ) )
142+ ) ;
143+ return results . filter ( Boolean ) . length ;
115144 } ,
116145 [ executeNextWithRetry ]
117146 ) ;
118147
119148 return {
120- resetConsoleChunks,
121- appendConsoleChunks,
122- sendCode,
123- getNextState : executeNextWithRetry ,
124- bulkSendNextStates,
125- resetDebugSession,
149+ resetConsoleChunks, // Clear console logs
150+ appendConsoleChunks, // Append logs
151+ sendCode, // Start session with file
152+ getNextState : executeNextWithRetry , // Step once
153+ bulkSendNextStates, // Step multiple times
154+ resetDebugSession, // Full reset
126155 } ;
127156} ;
0 commit comments