@@ -30,6 +30,7 @@ import type {
30
30
IWebhookResponseData ,
31
31
IWorkflowDataProxyAdditionalKeys ,
32
32
IWorkflowExecuteAdditionalData ,
33
+ WebhookResponseMode ,
33
34
Workflow ,
34
35
WorkflowExecuteMode ,
35
36
} from 'n8n-workflow' ;
@@ -272,7 +273,7 @@ export async function executeWebhook(
272
273
additionalKeys ,
273
274
undefined ,
274
275
'onReceived' ,
275
- ) ;
276
+ ) as WebhookResponseMode ;
276
277
const responseCode = workflow . expression . getSimpleParameterValue (
277
278
workflowStartNode ,
278
279
webhookData . webhookDescription . responseCode as string ,
@@ -291,7 +292,7 @@ export async function executeWebhook(
291
292
'firstEntryJson' ,
292
293
) ;
293
294
294
- if ( ! [ 'onReceived' , 'lastNode' , 'responseNode' ] . includes ( responseMode as string ) ) {
295
+ if ( ! [ 'onReceived' , 'lastNode' , 'responseNode' ] . includes ( responseMode ) ) {
295
296
// If the mode is not known we error. Is probably best like that instead of using
296
297
// the default that people know as early as possible (probably already testing phase)
297
298
// that something does not resolve properly.
@@ -562,11 +563,11 @@ export async function executeWebhook(
562
563
if ( binaryData ?. id ) {
563
564
res . header ( response . headers ) ;
564
565
const stream = await Container . get ( BinaryDataService ) . getAsStream ( binaryData . id ) ;
565
- await pipeline ( stream , res ) ;
566
+ await pipeline ( stream , res , { end : false } ) ;
566
567
responseCallback ( null , { noWebhookResponse : true } ) ;
567
568
} else if ( Buffer . isBuffer ( response . body ) ) {
568
569
res . header ( response . headers ) ;
569
- res . end ( response . body ) ;
570
+ res . write ( response . body ) ;
570
571
responseCallback ( null , { noWebhookResponse : true } ) ;
571
572
} else {
572
573
// TODO: This probably needs some more changes depending on the options on the
@@ -595,6 +596,7 @@ export async function executeWebhook(
595
596
} ) ;
596
597
}
597
598
599
+ res . end ( ) ;
598
600
didSendResponse = true ;
599
601
} )
600
602
. catch ( async ( error ) => {
@@ -659,17 +661,9 @@ export async function executeWebhook(
659
661
return data ;
660
662
}
661
663
662
- if ( responseMode === 'responseNode' ) {
663
- if ( ! didSendResponse ) {
664
- // Return an error if no Webhook-Response node did send any data
665
- responseCallback ( null , {
666
- data : {
667
- message : 'Workflow executed successfully' ,
668
- } ,
669
- responseCode,
670
- } ) ;
671
- didSendResponse = true ;
672
- }
664
+ // in `responseNode` mode `responseCallback` is called by `responsePromise`
665
+ if ( responseMode === 'responseNode' && responsePromise ) {
666
+ await Promise . allSettled ( [ responsePromise . promise ( ) ] ) ;
673
667
return undefined ;
674
668
}
675
669
@@ -795,14 +789,15 @@ export async function executeWebhook(
795
789
res . setHeader ( 'Content-Type' , binaryData . mimeType ) ;
796
790
if ( binaryData . id ) {
797
791
const stream = await Container . get ( BinaryDataService ) . getAsStream ( binaryData . id ) ;
798
- await pipeline ( stream , res ) ;
792
+ await pipeline ( stream , res , { end : false } ) ;
799
793
} else {
800
- res . end ( Buffer . from ( binaryData . data , BINARY_ENCODING ) ) ;
794
+ res . write ( Buffer . from ( binaryData . data , BINARY_ENCODING ) ) ;
801
795
}
802
796
803
797
responseCallback ( null , {
804
798
noWebhookResponse : true ,
805
799
} ) ;
800
+ res . end ( ) ;
806
801
}
807
802
} else if ( responseData === 'noData' ) {
808
803
// Return without data
0 commit comments