11import { Middleware } from 'redux' ;
22import { z } from 'zod' ;
33
4- import { ActionType , websocketError , websocketConnected , websocketDisconnected , WSExecuteResponse } from './actions' ;
4+ import {
5+ ActionType ,
6+ WSExecuteResponse ,
7+ WebSocketError ,
8+ websocketConnected ,
9+ websocketDisconnected ,
10+ websocketError ,
11+ } from './actions' ;
512
6- const WSMessageResponse = z . discriminatedUnion ( 'type' , [ WSExecuteResponse ] ) ;
13+ const WSMessageResponse = z . discriminatedUnion ( 'type' , [ WebSocketError , WSExecuteResponse ] ) ;
714
8- const reportWebSocketError = async ( ) => {
15+ const reportWebSocketError = async ( error : string ) => {
916 try {
1017 await fetch ( '/nowebsocket' , {
1118 method : 'post' ,
1219 headers : {
13- 'Content-Length ' : '0 ' ,
20+ 'Content-Type ' : 'application/json ' ,
1421 } ,
22+ body : JSON . stringify ( { error } ) ,
1523 } ) ;
1624 } catch ( reportError ) {
17- console . log ( 'Unable to report WebSocket error' , reportError ) ;
25+ console . log ( 'Unable to report WebSocket error' , error , reportError ) ;
1826 }
1927}
2028
@@ -26,7 +34,8 @@ const openWebSocket = (currentLocation: Location) => {
2634 } catch ( e ) {
2735 // WebSocket URL error or WebSocket is not supported by browser.
2836 // Assume it's the second case since URL error is easy to notice.
29- reportWebSocketError ( )
37+ const detail = ( e instanceof Error ) ? e . toString ( ) : 'An unknown error occurred' ;
38+ reportWebSocketError ( `Could not create the WebSocket: ${ detail } ` )
3039
3140 return null ;
3241 }
@@ -45,8 +54,11 @@ export const websocketMiddleware = (window: Window): Middleware => store => {
4554 } ) ;
4655
4756 socket . addEventListener ( 'error' , ( ) => {
48- store . dispatch ( websocketError ( ) ) ;
49- reportWebSocketError ( ) ;
57+ // We cannot get detailed information about the failure
58+ // https://stackoverflow.com/a/31003057/155423
59+ const error = 'Generic WebSocket Error' ;
60+ store . dispatch ( websocketError ( error ) ) ;
61+ reportWebSocketError ( error ) ;
5062 } ) ;
5163
5264 // TODO: reconnect on error? (if ever connected? if < n failures?)
0 commit comments