@@ -7,6 +7,7 @@ import { logger, workflowLogger } from './logger'
7
7
8
8
const { EventSourceError } = errors
9
9
10
+ const INITIAL_HEARTBEAT_TIMEOUT_IN_SEC = Number ( process . env . INITIAL_HEARTBEAT_TIMEOUT_IN_SECONDS ) || 5
10
11
11
12
/**
12
13
* 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> {
26
27
logger . info ( `CI provider: ${ payload [ 'CF_CI_TYPE' ] } , job URL: ${ payload [ 'CF_WORKFLOW_URL' ] } ` )
27
28
}
28
29
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
+
30
34
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 )
34
43
} )
44
+
35
45
eventSource . addEventListener ( 'info' , function ( event ) {
36
46
logger . info ( event . data )
37
47
} )
@@ -46,7 +56,22 @@ async function main(argv, env): Promise<void> {
46
56
workflowLogger . info ( event . data )
47
57
}
48
58
} )
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
+ } )
49
70
eventSource . addEventListener ( 'error' , ( errorEvent ) => {
71
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
72
+ if ( heartbeatTimer ) {
73
+ heartbeatTimer . stop ( )
74
+ }
50
75
eventSource . close ( )
51
76
52
77
const error = Utils . tryParseJson ( errorEvent . data )
@@ -67,7 +92,12 @@ async function main(argv, env): Promise<void> {
67
92
reject ( new EventSourceError ( message , name ) )
68
93
} )
69
94
eventSource . addEventListener ( 'end' , ( event ) => {
95
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
96
+ if ( heartbeatTimer ) {
97
+ heartbeatTimer . stop ( )
98
+ }
70
99
eventSource . close ( )
100
+
71
101
logger . info ( event . data )
72
102
resolve ( )
73
103
} )
0 commit comments