Skip to content

Commit fa7b953

Browse files
committed
feat(logger): enhance logging functionality with tag support and message relaying
- Updated the ConsolaCompatibleLogger to include a tag parameter for better log categorization. - Introduced a relayLogMessage function to facilitate message relaying with associated tags and log levels. - Refactored the createBuilderLoggerAdapter function to utilize the new tagging system, improving log context and traceability. Signed-off-by: Innei <tukon479@gmail.com>
1 parent 51a5a51 commit fa7b953

File tree

3 files changed

+84
-94
lines changed

3 files changed

+84
-94
lines changed

be/apps/core/src/modules/content/photo/builder/photo-builder-logger.adapter.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,58 @@
11
import type { Logger as BuilderLogger } from '@afilmory/builder/logger/index.js'
2+
import { relayLogMessage } from '@afilmory/builder/logger/index.js'
23
import type { PrettyLogger } from '@afilmory/framework'
34
import type { ConsolaInstance } from 'consola'
45

56
class ConsolaCompatibleLogger {
6-
constructor(private readonly logger: PrettyLogger) {}
7+
constructor(
8+
private readonly logger: PrettyLogger,
9+
private readonly tag: string,
10+
) {}
11+
12+
private forward(level: string, args: unknown[]): void {
13+
relayLogMessage(this.tag, level, args)
14+
}
715

816
info(...args: unknown[]): void {
17+
this.forward('info', args)
918
this.logger.info(...args)
1019
}
1120

1221
success(...args: unknown[]): void {
22+
this.forward('success', args)
1323
this.logger.info(...args)
1424
}
1525

1626
warn(...args: unknown[]): void {
27+
this.forward('warn', args)
1728
this.logger.warn(...args)
1829
}
1930

2031
error(...args: unknown[]): void {
32+
this.forward('error', args)
2133
this.logger.error(...args)
2234
}
2335

2436
log(...args: unknown[]): void {
37+
this.forward('log', args)
2538
this.logger.log(...args)
2639
}
2740

2841
debug(...args: unknown[]): void {
42+
this.forward('debug', args)
2943
this.logger.debug(...args)
3044
}
3145

3246
withTag(tag: string): ConsolaCompatibleLogger {
33-
return new ConsolaCompatibleLogger(this.logger.extend(tag))
47+
const modifier = String(tag ?? '')
48+
const nextTag = modifier ? combineTags(this.tag, modifier) : this.tag
49+
return new ConsolaCompatibleLogger(this.logger.extend(tag), nextTag)
3450
}
3551
}
3652

3753
export function createBuilderLoggerAdapter(baseLogger: PrettyLogger): BuilderLogger {
3854
const createTaggedLogger = (tag: string): ConsolaCompatibleLogger =>
39-
new ConsolaCompatibleLogger(baseLogger.extend(tag))
55+
new ConsolaCompatibleLogger(baseLogger.extend(tag), tag)
4056

4157
return {
4258
main: createTaggedLogger('PhotoBuilder:Main') as unknown as ConsolaInstance,
@@ -49,3 +65,13 @@ export function createBuilderLoggerAdapter(baseLogger: PrettyLogger): BuilderLog
4965
worker: (id: number) => createTaggedLogger(`PhotoBuilder:Worker-${id}`) as unknown as ConsolaInstance,
5066
}
5167
}
68+
69+
function combineTags(parentTag: string, childTag: string): string {
70+
if (!parentTag) {
71+
return childTag
72+
}
73+
if (!childTag) {
74+
return parentTag
75+
}
76+
return `${parentTag}/${childTag}`
77+
}
Lines changed: 50 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { Context } from 'hono'
2+
import { streamSSE } from 'hono/streaming'
23

34
export interface CreateProgressSseResponseOptions<TEvent> {
45
context: Context
@@ -22,108 +23,67 @@ export function createProgressSseResponse<TEvent>({
2223
heartbeatIntervalMs = DEFAULT_HEARTBEAT_MS,
2324
handler,
2425
}: CreateProgressSseResponseOptions<TEvent>): Response {
25-
const encoder = new TextEncoder()
26-
let cleanup: (() => void) | undefined
26+
context.header('Cache-Control', 'no-cache, no-transform')
27+
context.header('X-Accel-Buffering', 'no')
2728

28-
const stream = new ReadableStream<Uint8Array>({
29-
start: (controller) => {
30-
let closed = false
31-
const rawRequest = context.req.raw
32-
const abortSignal = rawRequest.signal
29+
return streamSSE(context, async (stream) => {
30+
const controller = new AbortController()
31+
const abortSignal = controller.signal
3332

34-
let heartbeat: ReturnType<typeof setInterval> | undefined
35-
let abortHandler: (() => void) | undefined
33+
let heartbeat: ReturnType<typeof setInterval> | undefined
3634

37-
const cleanupInternal = () => {
38-
if (heartbeat) {
39-
clearInterval(heartbeat)
40-
heartbeat = undefined
41-
}
42-
43-
if (abortHandler) {
44-
abortSignal.removeEventListener('abort', abortHandler)
45-
abortHandler = undefined
46-
}
47-
48-
if (!closed) {
49-
closed = true
50-
try {
51-
controller.close()
52-
} catch {
53-
/* ignore */
54-
}
55-
}
56-
}
57-
58-
const sendChunk = (chunk: string) => {
59-
if (closed) {
60-
return
61-
}
62-
63-
try {
64-
controller.enqueue(encoder.encode(chunk))
65-
} catch {
66-
cleanupInternal()
67-
cleanup = undefined
68-
}
35+
const stopHeartbeat = () => {
36+
if (heartbeat) {
37+
clearInterval(heartbeat)
38+
heartbeat = undefined
6939
}
40+
}
7041

71-
const sendEvent = (event: TEvent) => {
72-
sendChunk(`event: ${eventName}\ndata: ${JSON.stringify(event)}\n\n`)
42+
stream.onAbort(() => {
43+
if (!abortSignal.aborted) {
44+
controller.abort()
7345
}
46+
stopHeartbeat()
47+
})
7448

75-
heartbeat = setInterval(() => {
76-
sendChunk(`: keep-alive ${new Date().toISOString()}\n\n`)
77-
}, heartbeatIntervalMs)
49+
const sendEvent = (event: TEvent) => {
50+
return stream.writeSSE({
51+
event: eventName,
52+
data: JSON.stringify(event),
53+
})
54+
}
7855

79-
abortHandler = () => {
80-
const currentCleanup = cleanup
81-
cleanup = undefined
82-
currentCleanup?.()
83-
}
56+
const sendChunk = (chunk: string) => {
57+
void stream.write(chunk)
58+
}
8459

85-
abortSignal.addEventListener('abort', abortHandler)
60+
await stream.write(': connected\n\n')
8661

87-
cleanup = () => {
88-
cleanupInternal()
89-
cleanup = undefined
62+
heartbeat = setInterval(() => {
63+
if (abortSignal.aborted) {
64+
stopHeartbeat()
65+
return
9066
}
9167

92-
sendChunk(': connected\n\n')
93-
;(async () => {
94-
try {
95-
await handler({
96-
sendEvent,
97-
sendChunk,
98-
abortSignal,
99-
})
100-
} catch (error) {
101-
console.error('SSE handler failed', error)
102-
} finally {
103-
const currentCleanup = cleanup
104-
cleanup = undefined
105-
currentCleanup?.()
106-
}
107-
})().catch((error) => {
108-
console.error('Unhandled SSE handler error', error)
109-
const currentCleanup = cleanup
110-
cleanup = undefined
111-
currentCleanup?.()
68+
stream.write(`: keep-alive ${new Date().toISOString()}\n\n`).catch((error) => {
69+
console.error('SSE heartbeat failed', error)
70+
stopHeartbeat()
11271
})
113-
},
114-
cancel() {
115-
const currentCleanup = cleanup
116-
cleanup = undefined
117-
currentCleanup?.()
118-
},
119-
})
120-
121-
return new Response(stream, {
122-
headers: {
123-
'Content-Type': 'text/event-stream',
124-
'Cache-Control': 'no-cache, no-transform',
125-
Connection: 'keep-alive',
126-
'X-Accel-Buffering': 'no',
127-
},
72+
}, heartbeatIntervalMs)
73+
74+
try {
75+
await handler({
76+
sendEvent: (event) => {
77+
void sendEvent(event)
78+
},
79+
sendChunk,
80+
abortSignal,
81+
})
82+
} catch (error) {
83+
console.error('SSE handler failed', error)
84+
} finally {
85+
stopHeartbeat()
86+
stream.close()
87+
}
12888
})
12989
}

packages/builder/src/logger/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type {ConsolaInstance} from 'consola';
1+
import type { ConsolaInstance } from 'consola'
22
import consola from 'consola'
33

44
export type LogLevel = 'log' | 'info' | 'success' | 'warn' | 'error' | 'debug' | 'trace' | 'start' | 'fatal'
@@ -26,6 +26,10 @@ export function setConsoleForwarding(enabled: boolean): void {
2626
forwardToConsole = enabled
2727
}
2828

29+
export function relayLogMessage(tag: string, level: LogLevel | string, args: unknown[]): void {
30+
notifyListener(tag, level, args)
31+
}
32+
2933
function notifyListener(tag: string, level: LogLevel | string, args: unknown[]): void {
3034
listener?.({
3135
tag,

0 commit comments

Comments
 (0)