@@ -30,9 +30,10 @@ import {
3030    ITurnServer , 
3131    IRoomEvent , 
3232    IOpenIDCredentials , 
33+     WidgetApiResponseError , 
3334}  from  "matrix-widget-api" ; 
3435
35- import  {  createRoomWidgetClient ,  MsgType ,  UpdateDelayedEventAction  }  from  "../../src/matrix" ; 
36+ import  {  createRoomWidgetClient ,  MatrixError ,   MsgType ,  UpdateDelayedEventAction  }  from  "../../src/matrix" ; 
3637import  {  MatrixClient ,  ClientEvent ,  ITurnServer  as  IClientTurnServer  }  from  "../../src/client" ; 
3738import  {  SyncState  }  from  "../../src/sync" ; 
3839import  {  ICapabilities ,  RoomWidgetClient  }  from  "../../src/embedded" ; 
@@ -90,7 +91,11 @@ class MockWidgetApi extends EventEmitter {
9091    public  getTurnServers  =  jest . fn ( ( )  =>  [ ] ) ; 
9192    public  sendContentLoaded  =  jest . fn ( ) ; 
9293
93-     public  transport  =  {  reply : jest . fn ( )  } ; 
94+     public  transport  =  { 
95+         reply : jest . fn ( ) , 
96+         send : jest . fn ( ) , 
97+         sendComplete : jest . fn ( ) , 
98+     } ; 
9499} 
95100
96101declare  module "../../src/types"  { 
@@ -187,6 +192,46 @@ describe("RoomWidgetClient", () => {
187192                    . map ( ( e )  =>  e . getEffectiveEvent ( ) ) , 
188193            ) . toEqual ( [ event ] ) ; 
189194        } ) ; 
195+ 
196+         it ( "handles widget errors with generic error data" ,  async  ( )  =>  { 
197+             const  error  =  new  Error ( "failed to send" ) ; 
198+             widgetApi . transport . send . mockRejectedValue ( error ) ; 
199+ 
200+             await  makeClient ( {  sendEvent : [ "org.matrix.rageshake_request" ]  } ) ; 
201+             widgetApi . sendRoomEvent . mockImplementation ( widgetApi . transport . send ) ; 
202+ 
203+             await  expect ( 
204+                 client . sendEvent ( "!1:example.org" ,  "org.matrix.rageshake_request" ,  {  request_id : 123  } ) , 
205+             ) . rejects . toThrow ( error ) ; 
206+         } ) ; 
207+ 
208+         it ( "handles widget errors with Matrix API error response data" ,  async  ( )  =>  { 
209+             const  errorStatusCode  =  400 ; 
210+             const  errorUrl  =  "http://example.org" ; 
211+             const  errorData  =  { 
212+                 errcode : "M_BAD_JSON" , 
213+                 error : "Invalid body" , 
214+             } ; 
215+ 
216+             const  widgetError  =  new  WidgetApiResponseError ( "failed to send" ,  { 
217+                 matrix_api_error : { 
218+                     http_status : errorStatusCode , 
219+                     http_headers : { } , 
220+                     url : errorUrl , 
221+                     response : errorData , 
222+                 } , 
223+             } ) ; 
224+             const  matrixError  =  new  MatrixError ( errorData ,  errorStatusCode ,  errorUrl ) ; 
225+ 
226+             widgetApi . transport . send . mockRejectedValue ( widgetError ) ; 
227+ 
228+             await  makeClient ( {  sendEvent : [ "org.matrix.rageshake_request" ]  } ) ; 
229+             widgetApi . sendRoomEvent . mockImplementation ( widgetApi . transport . send ) ; 
230+ 
231+             await  expect ( 
232+                 client . sendEvent ( "!1:example.org" ,  "org.matrix.rageshake_request" ,  {  request_id : 123  } ) , 
233+             ) . rejects . toThrow ( matrixError ) ; 
234+         } ) ; 
190235    } ) ; 
191236
192237    describe ( "delayed events" ,  ( )  =>  { 
@@ -598,6 +643,42 @@ describe("RoomWidgetClient", () => {
598643            await  makeClient ( { } ) ; 
599644            expect ( await  client . getOpenIdToken ( ) ) . toStrictEqual ( testOIDCToken ) ; 
600645        } ) ; 
646+ 
647+         it ( "handles widget errors with generic error data" ,  async  ( )  =>  { 
648+             const  error  =  new  Error ( "failed to get token" ) ; 
649+             widgetApi . transport . sendComplete . mockRejectedValue ( error ) ; 
650+ 
651+             await  makeClient ( { } ) ; 
652+             widgetApi . requestOpenIDConnectToken . mockImplementation ( widgetApi . transport . sendComplete  as  any ) ; 
653+ 
654+             await  expect ( client . getOpenIdToken ( ) ) . rejects . toThrow ( error ) ; 
655+         } ) ; 
656+ 
657+         it ( "handles widget errors with Matrix API error response data" ,  async  ( )  =>  { 
658+             const  errorStatusCode  =  400 ; 
659+             const  errorUrl  =  "http://example.org" ; 
660+             const  errorData  =  { 
661+                 errcode : "M_UNKNOWN" , 
662+                 error : "Bad request" , 
663+             } ; 
664+ 
665+             const  widgetError  =  new  WidgetApiResponseError ( "failed to get token" ,  { 
666+                 matrix_api_error : { 
667+                     http_status : errorStatusCode , 
668+                     http_headers : { } , 
669+                     url : errorUrl , 
670+                     response : errorData , 
671+                 } , 
672+             } ) ; 
673+             const  matrixError  =  new  MatrixError ( errorData ,  errorStatusCode ,  errorUrl ) ; 
674+ 
675+             widgetApi . transport . sendComplete . mockRejectedValue ( widgetError ) ; 
676+ 
677+             await  makeClient ( { } ) ; 
678+             widgetApi . requestOpenIDConnectToken . mockImplementation ( widgetApi . transport . sendComplete  as  any ) ; 
679+ 
680+             await  expect ( client . getOpenIdToken ( ) ) . rejects . toThrow ( matrixError ) ; 
681+         } ) ; 
601682    } ) ; 
602683
603684    it ( "gets TURN servers" ,  async  ( )  =>  { 
0 commit comments