@@ -1074,6 +1074,103 @@ describe("TriggerChatTransport", function () {
10741074 ) . rejects . toThrowError ( "trigger task failed root" ) ;
10751075 } ) ;
10761076
1077+ it ( "reports stream subscription failures through onError" , async function ( ) {
1078+ const errors : TriggerChatTransportError [ ] = [ ] ;
1079+ const runStore = new InMemoryTriggerChatRunStore ( ) ;
1080+
1081+ const server = await startServer ( function ( req , res ) {
1082+ if ( req . method === "POST" && req . url === "/api/v1/tasks/chat-task/trigger" ) {
1083+ res . writeHead ( 200 , {
1084+ "content-type" : "application/json" ,
1085+ "x-trigger-jwt" : "pk_stream_subscribe_error" ,
1086+ } ) ;
1087+ res . end ( JSON . stringify ( { id : "run_stream_subscribe_error" } ) ) ;
1088+ return ;
1089+ }
1090+
1091+ res . writeHead ( 404 ) ;
1092+ res . end ( ) ;
1093+ } ) ;
1094+
1095+ const transport = new TriggerChatTransport ( {
1096+ task : "chat-task" ,
1097+ stream : "chat-stream" ,
1098+ accessToken : "pk_trigger" ,
1099+ baseURL : server . url ,
1100+ runStore,
1101+ onError : function onError ( error ) {
1102+ errors . push ( error ) ;
1103+ } ,
1104+ } ) ;
1105+
1106+ ( transport as any ) . fetchRunStream = async function fetchRunStream ( ) {
1107+ throw new Error ( "stream subscribe failed root" ) ;
1108+ } ;
1109+
1110+ await expect (
1111+ transport . sendMessages ( {
1112+ trigger : "submit-message" ,
1113+ chatId : "chat-stream-subscribe-error" ,
1114+ messageId : undefined ,
1115+ messages : [ ] ,
1116+ abortSignal : undefined ,
1117+ } )
1118+ ) . rejects . toThrowError ( "stream subscribe failed root" ) ;
1119+
1120+ expect ( errors ) . toHaveLength ( 1 ) ;
1121+ expect ( errors [ 0 ] ) . toMatchObject ( {
1122+ phase : "streamSubscribe" ,
1123+ chatId : "chat-stream-subscribe-error" ,
1124+ runId : "run_stream_subscribe_error" ,
1125+ } ) ;
1126+ expect ( runStore . get ( "chat-stream-subscribe-error" ) ) . toBeUndefined ( ) ;
1127+ } ) ;
1128+
1129+ it ( "keeps original stream subscription failure when onError callback also fails" , async function ( ) {
1130+ const runStore = new InMemoryTriggerChatRunStore ( ) ;
1131+
1132+ const server = await startServer ( function ( req , res ) {
1133+ if ( req . method === "POST" && req . url === "/api/v1/tasks/chat-task/trigger" ) {
1134+ res . writeHead ( 200 , {
1135+ "content-type" : "application/json" ,
1136+ "x-trigger-jwt" : "pk_stream_subscribe_onerror_failure" ,
1137+ } ) ;
1138+ res . end ( JSON . stringify ( { id : "run_stream_subscribe_onerror_failure" } ) ) ;
1139+ return ;
1140+ }
1141+
1142+ res . writeHead ( 404 ) ;
1143+ res . end ( ) ;
1144+ } ) ;
1145+
1146+ const transport = new TriggerChatTransport ( {
1147+ task : "chat-task" ,
1148+ stream : "chat-stream" ,
1149+ accessToken : "pk_trigger" ,
1150+ baseURL : server . url ,
1151+ runStore,
1152+ onError : async function onError ( ) {
1153+ throw new Error ( "onError failed" ) ;
1154+ } ,
1155+ } ) ;
1156+
1157+ ( transport as any ) . fetchRunStream = async function fetchRunStream ( ) {
1158+ throw new Error ( "stream subscribe failed root" ) ;
1159+ } ;
1160+
1161+ await expect (
1162+ transport . sendMessages ( {
1163+ trigger : "submit-message" ,
1164+ chatId : "chat-stream-subscribe-onerror-failure" ,
1165+ messageId : undefined ,
1166+ messages : [ ] ,
1167+ abortSignal : undefined ,
1168+ } )
1169+ ) . rejects . toThrowError ( "stream subscribe failed root" ) ;
1170+
1171+ expect ( runStore . get ( "chat-stream-subscribe-onerror-failure" ) ) . toBeUndefined ( ) ;
1172+ } ) ;
1173+
10771174 it ( "supports creating transport with factory function" , async function ( ) {
10781175 let observedRunId : string | undefined ;
10791176 let callbackCompleted = false ;
0 commit comments