@@ -754,6 +754,17 @@ export class CopilotSession {
754754 const shutdownPromise = new Promise < Error > ( ( resolve ) => {
755755 resolveShutdown = resolve ;
756756 } ) ;
757+ let outcomeSettled = false ;
758+ const settleOutcome = ( outcome : SessionOutcome , shutdown = false ) : void => {
759+ if ( outcomeSettled ) {
760+ return ;
761+ }
762+ outcomeSettled = true ;
763+ resolveOutcome ( outcome ) ;
764+ if ( shutdown && outcome . kind === "error" ) {
765+ resolveShutdown ( outcome . error ) ;
766+ }
767+ } ;
757768
758769 let lastAssistantMessage : AssistantMessageEvent | undefined ;
759770
@@ -763,29 +774,29 @@ export class CopilotSession {
763774 if ( event . type === "assistant.message" ) {
764775 lastAssistantMessage = event ;
765776 } else if ( event . type === "session.idle" ) {
766- resolveOutcome ( { kind : "idle" } ) ;
777+ settleOutcome ( { kind : "idle" } ) ;
767778 } else if ( event . type === "session.error" ) {
768779 const error = new Error ( event . data . message ) ;
769780 error . stack = event . data . stack ;
770- resolveOutcome ( { kind : "error" , error } ) ;
781+ settleOutcome ( { kind : "error" , error } ) ;
771782 } else if ( event . type === "session.shutdown" ) {
772783 const reason = event . data . errorReason ? `: ${ event . data . errorReason } ` : "" ;
773784 const error = new Error (
774785 `Session ${ this . sessionId } shut down before becoming idle${ reason } `
775786 ) ;
776- resolveOutcome ( { kind : "error" , error } ) ;
777- resolveShutdown ( error ) ;
787+ settleOutcome ( { kind : "error" , error } , true ) ;
778788 }
779789 } ) ;
780790
781791 let timeoutId : ReturnType < typeof setTimeout > | undefined ;
782792 try {
783- await Promise . race ( [
784- this . send ( options ) ,
785- shutdownPromise . then ( ( error ) => {
786- throw error ;
787- } ) ,
793+ const sendResult = await Promise . race ( [
794+ this . send ( options ) . then ( ( ) => ( { kind : "sent" } ) as const ) ,
795+ shutdownPromise . then ( ( error ) => ( { kind : "shutdown" , error } ) as const ) ,
788796 ] ) ;
797+ if ( sendResult . kind === "shutdown" ) {
798+ throw sendResult . error ;
799+ }
789800
790801 const timeoutPromise = new Promise < never > ( ( _ , reject ) => {
791802 timeoutId = setTimeout (
0 commit comments