@@ -5,6 +5,7 @@ import { assertNotNull } from '@deephaven/utils';
5
5
6
6
const logger = Log . module ( '@deephaven/jsapi-nodejs.NodeHttp2gRPCTransport' ) ;
7
7
8
+ type LogLevel = 'debug' | 'error' ;
8
9
type GrpcTransport = DhcType . grpc . GrpcTransport ;
9
10
type GrpcTransportFactory = DhcType . grpc . GrpcTransportFactory ;
10
11
type GrpcTransportOptions = DhcType . grpc . GrpcTransportOptions ;
@@ -21,6 +22,24 @@ type GrpcTransportOptions = DhcType.grpc.GrpcTransportOptions;
21
22
* })
22
23
*/
23
24
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
+
24
43
private static sessionMap : Map < string , http2 . ClientHttp2Session > = new Map ( ) ;
25
44
26
45
/**
@@ -38,7 +57,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
38
57
if ( ! NodeHttp2gRPCTransport . sessionMap . has ( origin ) ) {
39
58
const session = http2 . connect ( origin ) ;
40
59
session . on ( 'error' , err => {
41
- logger . error ( 'Session error' , err ) ;
60
+ NodeHttp2gRPCTransport . logMessage ( 'error' , 'Session error' , err ) ;
42
61
} ) ;
43
62
NodeHttp2gRPCTransport . sessionMap . set ( origin , session ) ;
44
63
}
@@ -61,6 +80,20 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
61
80
} ,
62
81
} ;
63
82
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
+
64
97
/**
65
98
* Private constructor to limit instantiation to the static factory method.
66
99
* @param options Transport options.
@@ -91,7 +124,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
91
124
) : http2 . ClientHttp2Stream => {
92
125
const url = new URL ( this . options . url ) ;
93
126
94
- logger . debug ( 'createRequest' , url . pathname ) ;
127
+ NodeHttp2gRPCTransport . logMessage ( 'debug' , 'createRequest' , url . pathname ) ;
95
128
96
129
const req = this . session . request ( {
97
130
...headers ,
@@ -134,7 +167,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
134
167
* @param metadata - the headers to send the server when opening the connection
135
168
*/
136
169
start ( metadata : { [ key : string ] : string | Array < string > } ) : void {
137
- logger . debug ( ' start', metadata . headersMap ) ;
170
+ NodeHttp2gRPCTransport . logMessage ( 'debug' , ' start', metadata ) ;
138
171
139
172
if ( this . request != null ) {
140
173
throw new Error ( 'start called more than once' ) ;
@@ -153,7 +186,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
153
186
* @param msgBytes - bytes to send to the server
154
187
*/
155
188
sendMessage ( msgBytes : Uint8Array ) : void {
156
- logger . debug ( 'sendMessage' , msgBytes ) ;
189
+ NodeHttp2gRPCTransport . logMessage ( 'debug' , 'sendMessage' , msgBytes ) ;
157
190
assertNotNull ( this . request , 'request is required' ) ;
158
191
159
192
this . request . write ( msgBytes ) ;
@@ -164,7 +197,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
164
197
* be sent, but that the client is still open to receiving messages.
165
198
*/
166
199
finishSend ( ) : void {
167
- logger . debug ( 'finishSend' ) ;
200
+ NodeHttp2gRPCTransport . logMessage ( 'debug' , 'finishSend' ) ;
168
201
assertNotNull ( this . request , 'request is required' ) ;
169
202
this . request . end ( ) ;
170
203
}
@@ -174,7 +207,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
174
207
* sent nor received, and preventing the client from receiving any more events.
175
208
*/
176
209
cancel ( ) : void {
177
- logger . debug ( 'cancel' ) ;
210
+ NodeHttp2gRPCTransport . logMessage ( 'debug' , 'cancel' ) ;
178
211
assertNotNull ( this . request , 'request is required' ) ;
179
212
this . request . close ( ) ;
180
213
}
@@ -187,6 +220,7 @@ export class NodeHttp2gRPCTransport implements GrpcTransport {
187
220
for ( const session of NodeHttp2gRPCTransport . sessionMap . values ( ) ) {
188
221
session . close ( ) ;
189
222
}
223
+ NodeHttp2gRPCTransport . logMessageHandlers . clear ( ) ;
190
224
NodeHttp2gRPCTransport . sessionMap . clear ( ) ;
191
225
}
192
226
}
0 commit comments