Skip to content

Commit cbab7a2

Browse files
authored
feat: Support for log message handlers (#2347)
DH-18086: Support for log message handlers in the gRPC transport
1 parent bbba404 commit cbab7a2

File tree

1 file changed

+40
-6
lines changed

1 file changed

+40
-6
lines changed

packages/jsapi-nodejs/src/NodeHttp2gRPCTransport.ts

+40-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { assertNotNull } from '@deephaven/utils';
55

66
const logger = Log.module('@deephaven/jsapi-nodejs.NodeHttp2gRPCTransport');
77

8+
type LogLevel = 'debug' | 'error';
89
type GrpcTransport = DhcType.grpc.GrpcTransport;
910
type GrpcTransportFactory = DhcType.grpc.GrpcTransportFactory;
1011
type GrpcTransportOptions = DhcType.grpc.GrpcTransportOptions;
@@ -21,6 +22,24 @@ type GrpcTransportOptions = DhcType.grpc.GrpcTransportOptions;
2122
* })
2223
*/
2324
export class NodeHttp2gRPCTransport implements GrpcTransport {
25+
private static readonly logMessageHandlers = new Set<
26+
(logLevel: LogLevel, ...args: unknown[]) => void
27+
>();
28+
29+
/**
30+
* Log a message to the logger + any registered log message handlers.
31+
* @param logLevel The log level
32+
* @param args Additional args to log
33+
*/
34+
static logMessage = (logLevel: LogLevel, ...args: unknown[]): void => {
35+
logger[logLevel](...args);
36+
37+
// eslint-disable-next-line no-restricted-syntax
38+
for (const handler of NodeHttp2gRPCTransport.logMessageHandlers) {
39+
handler(logLevel, ...args);
40+
}
41+
};
42+
2443
private static sessionMap: Map<string, http2.ClientHttp2Session> = new Map();
2544

2645
/**
@@ -38,7 +57,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
3857
if (!NodeHttp2gRPCTransport.sessionMap.has(origin)) {
3958
const session = http2.connect(origin);
4059
session.on('error', err => {
41-
logger.error('Session error', err);
60+
NodeHttp2gRPCTransport.logMessage('error', 'Session error', err);
4261
});
4362
NodeHttp2gRPCTransport.sessionMap.set(origin, session);
4463
}
@@ -61,6 +80,20 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
6180
},
6281
};
6382

83+
/**
84+
* Register a log message handler.
85+
* @param handleLogMessage function to handle log messages
86+
* @returns function to unregister the handler
87+
*/
88+
static onLogMessage = (
89+
handleLogMessage: (logLevel: LogLevel, ...args: unknown[]) => void
90+
): (() => void) => {
91+
NodeHttp2gRPCTransport.logMessageHandlers.add(handleLogMessage);
92+
return () => {
93+
NodeHttp2gRPCTransport.logMessageHandlers.delete(handleLogMessage);
94+
};
95+
};
96+
6497
/**
6598
* Private constructor to limit instantiation to the static factory method.
6699
* @param options Transport options.
@@ -91,7 +124,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
91124
): http2.ClientHttp2Stream => {
92125
const url = new URL(this.options.url);
93126

94-
logger.debug('createRequest', url.pathname);
127+
NodeHttp2gRPCTransport.logMessage('debug', 'createRequest', url.pathname);
95128

96129
const req = this.session.request({
97130
...headers,
@@ -134,7 +167,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
134167
* @param metadata - the headers to send the server when opening the connection
135168
*/
136169
start(metadata: { [key: string]: string | Array<string> }): void {
137-
logger.debug('start', metadata.headersMap);
170+
NodeHttp2gRPCTransport.logMessage('debug', 'start', metadata);
138171

139172
if (this.request != null) {
140173
throw new Error('start called more than once');
@@ -153,7 +186,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
153186
* @param msgBytes - bytes to send to the server
154187
*/
155188
sendMessage(msgBytes: Uint8Array): void {
156-
logger.debug('sendMessage', msgBytes);
189+
NodeHttp2gRPCTransport.logMessage('debug', 'sendMessage', msgBytes);
157190
assertNotNull(this.request, 'request is required');
158191

159192
this.request.write(msgBytes);
@@ -164,7 +197,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
164197
* be sent, but that the client is still open to receiving messages.
165198
*/
166199
finishSend(): void {
167-
logger.debug('finishSend');
200+
NodeHttp2gRPCTransport.logMessage('debug', 'finishSend');
168201
assertNotNull(this.request, 'request is required');
169202
this.request.end();
170203
}
@@ -174,7 +207,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
174207
* sent nor received, and preventing the client from receiving any more events.
175208
*/
176209
cancel(): void {
177-
logger.debug('cancel');
210+
NodeHttp2gRPCTransport.logMessage('debug', 'cancel');
178211
assertNotNull(this.request, 'request is required');
179212
this.request.close();
180213
}
@@ -187,6 +220,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
187220
for (const session of NodeHttp2gRPCTransport.sessionMap.values()) {
188221
session.close();
189222
}
223+
NodeHttp2gRPCTransport.logMessageHandlers.clear();
190224
NodeHttp2gRPCTransport.sessionMap.clear();
191225
}
192226
}

0 commit comments

Comments
 (0)