Skip to content

Commit 33531b5

Browse files
Merge branch 'main' into support_host_url
2 parents eed4998 + 52f623f commit 33531b5

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed

src/logger.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import winston from 'winston'
22
import chalk from 'chalk'
33

4-
const format = winston.format
54
const paint = (kind, message) => {
65
const painter = {
76
error: chalk.red,
@@ -17,14 +16,14 @@ const paint = (kind, message) => {
1716

1817

1918
export const logger = winston.createLogger({
20-
format: format.printf((info) => {
19+
format: winston.format.printf((info) => {
2120
return paint(info.level, `${info.message}`)
2221
}),
23-
transports: [ new winston.transports.Console() ],
22+
transports: [ new winston.transports.Console({ level: process.env.DEBUG === '1' ? 'debug' : 'info' }) ],
2423
})
2524

2625
export const workflowLogger = winston.createLogger({
27-
format: format.printf((info) => {
26+
format: winston.format.printf((info) => {
2827
let logMessage = `${info.message}`
2928
if (info.pod) {
3029
logMessage = `[${info.pod}] ${logMessage}`

src/main.ts

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { logger, workflowLogger } from './logger'
77

88
const { 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
})

src/utils.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,26 @@ export namespace Utils {
5959
return str
6060
}
6161
}
62+
63+
export type Timer = {
64+
timeoutTime: number,
65+
restart: (timeoutMs?: number) => void,
66+
stop: () => void,
67+
}
68+
69+
export function createHeartbeatTimer(cb: () => void, timeoutTime: number): Timer {
70+
let timeout: NodeJS.Timeout = setTimeout(cb, timeoutTime)
71+
72+
return {
73+
timeoutTime,
74+
restart(_timeoutMs?: number) {
75+
this.stop()
76+
timeout = setTimeout(cb, _timeoutMs || this.timeoutTime)
77+
},
78+
stop() {
79+
clearTimeout(timeout)
80+
}
81+
}
82+
}
6283
}
6384

0 commit comments

Comments
 (0)