1
+ let isLogging = false ;
2
+
3
+ function logError ( error ) {
4
+ if ( isLogging ) return ; // Prevent recursion
5
+
6
+ isLogging = true ;
7
+ try {
8
+ const errorMessage = `[${ getTimestamp ( ) } ] ${ error . stack || error . message || error } \n` ;
9
+
10
+ // Fallback to console if fetch fails
11
+ fetch ( '/log_error' , {
12
+ method : 'POST' ,
13
+ headers : { 'Content-Type' : 'application/json' } ,
14
+ body : JSON . stringify ( { error : errorMessage } )
15
+ } ) . catch ( ( ) => {
16
+ console . error ( 'Failed to log error:' , errorMessage ) ;
17
+ } ) ;
18
+
19
+ console . error ( errorMessage ) ;
20
+ } finally {
21
+ isLogging = false ;
22
+ }
23
+ }
24
+
1
25
async function loadApps ( ) {
2
26
try {
3
27
const appGrid = document . getElementById ( 'app-grid' ) ;
@@ -21,7 +45,7 @@ async function loadApps() {
21
45
22
46
return config . apps ;
23
47
} catch ( error ) {
24
- console . error ( 'Error loading apps config:' , error ) ;
48
+ logError ( 'Error loading apps config:' , error ) ;
25
49
26
50
// Show error state to user
27
51
const appGrid = document . getElementById ( 'app-grid' ) ;
@@ -50,7 +74,7 @@ async function initializeApplication() {
50
74
setupCategoryFilter ( apps ) ;
51
75
startAppStatusChecker ( ) ;
52
76
} catch ( error ) {
53
- console . error ( 'Application initialization failed:' , error ) ;
77
+ logError ( 'Application initialization failed:' , error ) ;
54
78
}
55
79
}
56
80
@@ -133,7 +157,7 @@ async function handleAppClick(app, card) {
133
157
card . innerHTML = originalContent ;
134
158
updateAppStatus ( app . script ) ; // Update status after launch
135
159
} catch ( error ) {
136
- console . error ( 'Error launching app:' , error ) ;
160
+ logError ( 'Error launching app:' , error ) ;
137
161
showAlert ( `Failed to launch ${ app . title } : ${ error . message } ` ) ;
138
162
card . innerHTML = originalContent ;
139
163
}
@@ -165,7 +189,7 @@ async function updateAppStatus(appName) {
165
189
}
166
190
}
167
191
} catch ( error ) {
168
- console . error ( 'Error checking app status:' , error ) ;
192
+ logError ( 'Error checking app status:' , error ) ;
169
193
}
170
194
}
171
195
@@ -432,7 +456,7 @@ function scanBleDevices() {
432
456
} )
433
457
. catch ( error => {
434
458
isScanning = false ;
435
- console . error ( 'BLE scan error:' , error ) ;
459
+ logError ( 'BLE scan error:' , error ) ;
436
460
bleDevicesList . innerHTML = `
437
461
<div class="text-center py-4 text-red-500">
438
462
Error scanning for devices. Please try again.
@@ -532,7 +556,7 @@ connectBtn.addEventListener('click', async () => {
532
556
throw new Error ( data . message || 'Connection failed' ) ;
533
557
}
534
558
} catch ( error ) {
535
- console . error ( 'Connection error:' , error ) ;
559
+ logError ( 'Connection error:' , error ) ;
536
560
showStatus ( `Connection failed: ${ error . message } ` , 'fa-times-circle' , 'text-red-500' ) ;
537
561
// Return to connect state
538
562
connectingBtn . classList . add ( 'hidden' ) ;
@@ -573,7 +597,7 @@ async function pollConnectionStatus() {
573
597
} ) ;
574
598
}
575
599
} catch ( error ) {
576
- console . error ( 'Connection polling error:' , error ) ;
600
+ logError ( 'Connection polling error:' , error ) ;
577
601
showStatus ( `Connection failed: Try again` , 'fa-times-circle' , 'text-red-500' ) ;
578
602
// Return to connect state
579
603
connectingBtn . classList . add ( 'hidden' ) ;
@@ -686,7 +710,7 @@ disconnectBtn.addEventListener('click', async () => {
686
710
}
687
711
}
688
712
} catch ( error ) {
689
- console . error ( 'Disconnection error:' , error ) ;
713
+ logError ( 'Disconnection error:' , error ) ;
690
714
// Return to disconnect state if disconnection failed
691
715
disconnectingBtn . classList . add ( 'hidden' ) ;
692
716
disconnectBtn . classList . remove ( 'hidden' ) ;
@@ -707,7 +731,7 @@ function startConsoleUpdates() {
707
731
} ;
708
732
709
733
eventSource . onerror = function ( ) {
710
- console . error ( 'EventSource failed' ) ;
734
+ logError ( 'EventSource failed' ) ;
711
735
if ( eventSource ) {
712
736
eventSource . close ( ) ;
713
737
eventSource = null ;
@@ -754,7 +778,7 @@ function toggleRecording() {
754
778
}
755
779
} )
756
780
. catch ( error => {
757
- console . error ( 'Error stopping recording:' , error ) ;
781
+ logError ( 'Error stopping recording:' , error ) ;
758
782
} ) ;
759
783
} else {
760
784
// Start recording - send the filename (or null for default)
@@ -780,7 +804,7 @@ function toggleRecording() {
780
804
}
781
805
} )
782
806
. catch ( error => {
783
- console . error ( 'Error starting recording:' , error ) ;
807
+ logError ( 'Error starting recording:' , error ) ;
784
808
showAlert ( 'Failed to start recording: ' + error . message ) ;
785
809
} ) ;
786
810
}
@@ -858,7 +882,7 @@ function checkStreamStatus() {
858
882
}
859
883
} )
860
884
. catch ( error => {
861
- console . error ( 'Error fetching stream status:' , error ) ;
885
+ logError ( 'Error fetching stream status:' , error ) ;
862
886
} ) ;
863
887
}
864
888
@@ -903,6 +927,9 @@ checkStreamStatus();
903
927
// Initialize the app when DOM is loaded
904
928
document . addEventListener ( 'DOMContentLoaded' , ( ) => {
905
929
initializeApplication ( ) ;
930
+ window . onerror = function ( message , source , lineno , colno , error ) {
931
+ logError ( error || message ) ;
932
+ return true ; } ;
906
933
907
934
document . getElementById ( 'github-btn' ) . addEventListener ( 'click' , ( ) => {
908
935
window . open ( 'https://github.com/upsidedownlabs/Chords-Python' , '_blank' ) ;
0 commit comments