@@ -6,30 +6,49 @@ import { stopSketch, expandConsole } from '../actions/ide';
66export default function useHandleMessageEvent ( ) {
77 const dispatch = useDispatch ( ) ;
88
9+ // Function to safely convert objects to strings (handles circular references)
10+ const safeStringify = ( obj ) => {
11+ const seen = new WeakSet ( ) ;
12+ return JSON . stringify ( obj , ( key , value ) => {
13+ if ( typeof value === 'object' && value !== null ) {
14+ if ( seen . has ( value ) ) return '[Circular Reference]' ;
15+ seen . add ( value ) ;
16+ }
17+ return value ;
18+ } ) ;
19+ } ;
20+
921 const handleMessageEvent = ( data ) => {
22+ if ( ! data || typeof data !== 'object' ) return ;
1023 const { source, messages } = data ;
11- if ( source === 'sketch' && Array . isArray ( messages ) ) {
12- const decodedMessages = messages . map ( ( message ) => Decode ( message . log ) ) ;
13- decodedMessages . every ( ( message , index , arr ) => {
14- const { data : args } = message ;
15- let hasInfiniteLoop = false ;
16- Object . keys ( args ) . forEach ( ( key ) => {
17- if (
18- typeof args [ key ] === 'string' &&
19- args [ key ] . includes ( 'Exiting potential infinite loop' )
20- ) {
21- dispatch ( stopSketch ( ) ) ;
22- dispatch ( expandConsole ( ) ) ;
23- hasInfiniteLoop = true ;
24- }
25- } ) ;
26- if ( hasInfiniteLoop ) {
27- return false ;
28- }
29- return true ;
30- } ) ;
31- dispatch ( dispatchConsoleEvent ( decodedMessages ) ) ;
24+ if ( source !== 'sketch' || ! Array . isArray ( messages ) ) return ;
25+ const decodedMessages = messages . map ( ( message ) => {
26+ try {
27+ return JSON . parse ( safeStringify ( Decode ( message . log ) ) ) ;
28+ } catch ( error ) {
29+ console . error ( 'Error decoding message:' , error ) ;
30+ return { error : 'Failed to decode message' } ;
31+ }
32+ } ) ;
33+
34+ const hasInfiniteLoop = decodedMessages . some (
35+ ( message ) =>
36+ message ?. data &&
37+ Object . values ( message . data ) . some (
38+ ( arg ) =>
39+ typeof arg === 'string' &&
40+ arg . includes ( 'Exiting potential infinite loop' )
41+ )
42+ ) ;
43+
44+ if ( hasInfiniteLoop ) {
45+ dispatch ( stopSketch ( ) ) ;
46+ dispatch ( expandConsole ( ) ) ;
47+ return ;
3248 }
49+
50+ dispatch ( dispatchConsoleEvent ( decodedMessages ) ) ;
3351 } ;
52+
3453 return handleMessageEvent ;
3554}
0 commit comments