Skip to content

Commit 52f623f

Browse files
heartbeat (#85)
* heartbeat * wio * bump
1 parent bd79254 commit 52f623f

File tree

4 files changed

+59
-9
lines changed

4 files changed

+59
-9
lines changed

service.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
name: codefresh-report-image
2-
version: 0.0.155
2+
version: 0.0.156

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
@@ -57,5 +57,26 @@ export namespace Utils {
5757
return str
5858
}
5959
}
60+
61+
export type Timer = {
62+
timeoutTime: number,
63+
restart: (timeoutMs?: number) => void,
64+
stop: () => void,
65+
}
66+
67+
export function createHeartbeatTimer(cb: () => void, timeoutTime: number): Timer {
68+
let timeout: NodeJS.Timeout = setTimeout(cb, timeoutTime)
69+
70+
return {
71+
timeoutTime,
72+
restart(_timeoutMs?: number) {
73+
this.stop()
74+
timeout = setTimeout(cb, _timeoutMs || this.timeoutTime)
75+
},
76+
stop() {
77+
clearTimeout(timeout)
78+
}
79+
}
80+
}
6081
}
6182

0 commit comments

Comments
 (0)