@@ -7,6 +7,7 @@ import { logger, workflowLogger } from './logger'
77
88const { EventSourceError } = errors
99
10+ const INITIAL_HEARTBEAT_TIMEOUT_IN_SEC = Number ( process . env . INITIAL_HEARTBEAT_TIMEOUT_IN_SECONDS ) || 5
1011
1112/**
1213 * Take (CF_ prefixed) Env variables and perform http/s request (SSE) to app-proxy for image-report with CF_ENRICHERS
@@ -26,12 +27,21 @@ async function main(argv, env): Promise<void> {
2627 logger . info ( `CI provider: ${ payload [ 'CF_CI_TYPE' ] } , job URL: ${ payload [ 'CF_WORKFLOW_URL' ] } ` )
2728 }
2829 const eventSource = new EventSource ( url , { headers } )
29- eventSource . reconnectInterval = 1000 * 10000 // prevent retry. client should not issue a reconnect
30+ eventSource . reconnectInterval = 1000 * 100000 // prevent retry. client should not issue a reconnect
31+
32+ let heartbeatTimer : Utils . Timer
33+
3034 const waitFor = new Promise < void > ( ( resolve , reject ) => {
31-
32- eventSource . addEventListener ( 'report' , function ( event ) {
33- logger . info ( JSON . stringify ( JSON . parse ( event . data ) , null , 2 ) )
35+
36+ eventSource . addEventListener ( 'open' , function ( ) {
37+ logger . debug ( 'event-source connected' )
38+
39+ heartbeatTimer = Utils . createHeartbeatTimer ( ( ) => {
40+ logger . debug ( `missing heartbeat after ${ heartbeatTimer . timeoutTime / 1000 } seconds` )
41+ heartbeatTimer . restart ( )
42+ } , INITIAL_HEARTBEAT_TIMEOUT_IN_SEC * 1000 )
3443 } )
44+
3545 eventSource . addEventListener ( 'info' , function ( event ) {
3646 logger . info ( event . data )
3747 } )
@@ -46,7 +56,22 @@ async function main(argv, env): Promise<void> {
4656 workflowLogger . info ( event . data )
4757 }
4858 } )
59+ eventSource . addEventListener ( 'heartbeat' , function ( event ) {
60+ logger . debug ( `heartbeat ${ JSON . stringify ( event ) } ` )
61+
62+ const heartBeatInterval = Number ( event . data )
63+ if ( heartBeatInterval ) {
64+ const extraGap = 1 * 1000
65+ heartbeatTimer . restart ( heartBeatInterval + extraGap )
66+ } else {
67+ heartbeatTimer . restart ( )
68+ }
69+ } )
4970 eventSource . addEventListener ( 'error' , ( errorEvent ) => {
71+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
72+ if ( heartbeatTimer ) {
73+ heartbeatTimer . stop ( )
74+ }
5075 eventSource . close ( )
5176
5277 const error = Utils . tryParseJson ( errorEvent . data )
@@ -67,7 +92,12 @@ async function main(argv, env): Promise<void> {
6792 reject ( new EventSourceError ( message , name ) )
6893 } )
6994 eventSource . addEventListener ( 'end' , ( event ) => {
95+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
96+ if ( heartbeatTimer ) {
97+ heartbeatTimer . stop ( )
98+ }
7099 eventSource . close ( )
100+
71101 logger . info ( event . data )
72102 resolve ( )
73103 } )
0 commit comments