@@ -21,16 +21,31 @@ const { ConsoleLogEntry, JavascriptLogEntry, GenericLogEntry } = require('./logE
21
21
const LOG = {
22
22
TYPE_CONSOLE : 'console' ,
23
23
TYPE_JS_LOGS : 'javascript' ,
24
+ TYPE_JS_EXCEPTION : 'javascriptException' ,
25
+ TYPE_LOGS : 'logs' ,
26
+ TYPE_CONSOLE_FILTER : 'console_filter' ,
27
+ TYPE_JS_LOGS_FILTER : 'javascript_filter' ,
28
+ TYPE_JS_EXCEPTION_FILTER : 'javascriptException_filter' ,
29
+ TYPE_LOGS_FILTER : 'logs_filter' ,
24
30
}
25
31
26
32
class LogInspector {
27
33
bidi
28
34
ws
35
+ #callbackId = 0
29
36
30
37
constructor ( driver , browsingContextIds ) {
31
38
this . _driver = driver
32
39
this . _browsingContextIds = browsingContextIds
33
- this . listener = { }
40
+ this . listener = new Map ( )
41
+ this . listener . set ( LOG . TYPE_CONSOLE , new Map ( ) )
42
+ this . listener . set ( LOG . TYPE_JS_LOGS , new Map ( ) )
43
+ this . listener . set ( LOG . TYPE_JS_EXCEPTION , new Map ( ) )
44
+ this . listener . set ( LOG . TYPE_LOGS , new Map ( ) )
45
+ this . listener . set ( LOG . TYPE_CONSOLE_FILTER , new Map ( ) )
46
+ this . listener . set ( LOG . TYPE_JS_LOGS_FILTER , new Map ( ) )
47
+ this . listener . set ( LOG . TYPE_JS_EXCEPTION_FILTER , new Map ( ) )
48
+ this . listener . set ( LOG . TYPE_LOGS_FILTER , new Map ( ) )
34
49
}
35
50
36
51
/**
@@ -42,26 +57,63 @@ class LogInspector {
42
57
await this . bidi . subscribe ( 'log.entryAdded' , this . _browsingContextIds )
43
58
}
44
59
45
- /**
46
- * @param kind
47
- */
48
- logListener ( kind ) {
49
- if ( ! ( kind in this . listener ) ) {
50
- this . listener [ kind ] = [ ]
60
+ addCallback ( eventType , callback ) {
61
+ const id = ++ this . #callbackId
62
+
63
+ const eventCallbackMap = this . listener . get ( eventType )
64
+ eventCallbackMap . set ( id , callback )
65
+ return id
66
+ }
67
+
68
+ removeCallback ( id ) {
69
+ for ( const [ , callbacks ] of this . listener ) {
70
+ if ( callbacks . has ( id ) ) {
71
+ callbacks . delete ( id )
72
+ }
73
+ }
74
+ }
75
+
76
+ invokeCallbacks ( eventType , data ) {
77
+ const callbacks = this . listener . get ( eventType )
78
+ if ( callbacks ) {
79
+ for ( const [ , callback ] of callbacks ) {
80
+ callback ( data )
81
+ }
82
+ }
83
+ }
84
+
85
+ invokeCallbacksWithFilter ( eventType , data , filterLevel ) {
86
+ const callbacks = this . listener . get ( eventType )
87
+ if ( callbacks ) {
88
+ for ( const [ , value ] of callbacks ) {
89
+ const callback = value . callback
90
+ const filter = value . filter
91
+ if ( filterLevel === filter . getLevel ( ) ) {
92
+ callback ( data )
93
+ }
94
+ }
51
95
}
52
96
}
53
97
54
98
/**
55
99
* Listen to Console logs
56
100
* @param callback
57
101
* @param filterBy
58
- * @returns {Promise<void > }
102
+ * @returns {Promise<number > }
59
103
*/
60
104
async onConsoleEntry ( callback , filterBy = undefined ) {
61
105
if ( filterBy !== undefined && ! ( filterBy instanceof FilterBy ) ) {
62
106
throw Error ( `Pass valid FilterBy object. Received: ${ filterBy } ` )
63
107
}
64
108
109
+ let id
110
+
111
+ if ( filterBy !== undefined ) {
112
+ id = this . addCallback ( LOG . TYPE_CONSOLE_FILTER , { callback : callback , filter : filterBy } )
113
+ } else {
114
+ id = this . addCallback ( LOG . TYPE_CONSOLE , callback )
115
+ }
116
+
65
117
this . ws = await this . bidi . socket
66
118
67
119
this . ws . on ( 'message' , ( event ) => {
@@ -81,27 +133,37 @@ class LogInspector {
81
133
82
134
if ( filterBy !== undefined ) {
83
135
if ( params ?. level === filterBy . getLevel ( ) ) {
84
- callback ( consoleEntry )
136
+ this . invokeCallbacksWithFilter ( LOG . TYPE_CONSOLE_FILTER , consoleEntry , filterBy . getLevel ( ) )
85
137
}
86
138
return
87
139
}
88
140
89
- callback ( consoleEntry )
141
+ this . invokeCallbacks ( LOG . TYPE_CONSOLE , consoleEntry )
90
142
}
91
143
} )
144
+
145
+ return id
92
146
}
93
147
94
148
/**
95
149
* Listen to JS logs
96
150
* @param callback
97
151
* @param filterBy
98
- * @returns {Promise<void > }
152
+ * @returns {Promise<number > }
99
153
*/
100
154
async onJavascriptLog ( callback , filterBy = undefined ) {
101
155
if ( filterBy !== undefined && ! ( filterBy instanceof FilterBy ) ) {
102
156
throw Error ( `Pass valid FilterBy object. Received: ${ filterBy } ` )
103
157
}
104
158
159
+ let id
160
+
161
+ if ( filterBy !== undefined ) {
162
+ id = this . addCallback ( LOG . TYPE_JS_LOGS_FILTER , { callback : callback , filter : filterBy } )
163
+ } else {
164
+ id = this . addCallback ( LOG . TYPE_JS_LOGS , callback )
165
+ }
166
+
105
167
this . ws = await this . bidi . socket
106
168
107
169
this . ws . on ( 'message' , ( event ) => {
@@ -118,29 +180,26 @@ class LogInspector {
118
180
119
181
if ( filterBy !== undefined ) {
120
182
if ( params ?. level === filterBy . getLevel ( ) ) {
121
- callback ( jsEntry )
183
+ this . invokeCallbacksWithFilter ( LOG . TYPE_JS_LOGS_FILTER , jsEntry , filterBy . getLevel ( ) )
122
184
}
123
185
return
124
186
}
125
187
126
- callback ( jsEntry )
188
+ this . invokeCallbacks ( LOG . TYPE_JS_LOGS , jsEntry )
127
189
}
128
190
} )
191
+
192
+ return id
129
193
}
130
194
131
195
/**
132
196
* Listen to JS Exceptions
133
197
* @param callback
134
- * @returns {Promise<void > }
198
+ * @returns {Promise<number > }
135
199
*/
136
200
async onJavascriptException ( callback ) {
201
+ const id = this . addCallback ( LOG . TYPE_JS_EXCEPTION , callback )
137
202
this . ws = await this . bidi . socket
138
- let enabled = LOG . TYPE_JS_EXCEPTION in this . listener || this . logListener ( LOG . TYPE_JS_EXCEPTION )
139
- this . listener [ LOG . TYPE_JS_EXCEPTION ] . push ( callback )
140
-
141
- if ( enabled ) {
142
- return
143
- }
144
203
145
204
this . ws . on ( 'message' , ( event ) => {
146
205
const { params } = JSON . parse ( Buffer . from ( event . toString ( ) ) )
@@ -153,24 +212,31 @@ class LogInspector {
153
212
params . stackTrace ,
154
213
)
155
214
156
- this . listener [ LOG . TYPE_JS_EXCEPTION ] . forEach ( ( listener ) => {
157
- listener ( jsErrorEntry )
158
- } )
215
+ this . invokeCallbacks ( LOG . TYPE_JS_EXCEPTION , jsErrorEntry )
159
216
}
160
217
} )
218
+
219
+ return id
161
220
}
162
221
163
222
/**
164
223
* Listen to any logs
165
224
* @param callback
166
225
* @param filterBy
167
- * @returns {Promise<void > }
226
+ * @returns {Promise<number > }
168
227
*/
169
228
async onLog ( callback , filterBy = undefined ) {
170
229
if ( filterBy !== undefined && ! ( filterBy instanceof FilterBy ) ) {
171
230
throw Error ( `Pass valid FilterBy object. Received: ${ filterBy } ` )
172
231
}
173
232
233
+ let id
234
+ if ( filterBy !== undefined ) {
235
+ id = this . addCallback ( LOG . TYPE_LOGS_FILTER , { callback : callback , filter : filterBy } )
236
+ } else {
237
+ id = this . addCallback ( LOG . TYPE_LOGS , callback )
238
+ }
239
+
174
240
this . ws = await this . bidi . socket
175
241
176
242
this . ws . on ( 'message' , ( event ) => {
@@ -191,7 +257,16 @@ class LogInspector {
191
257
return
192
258
}
193
259
194
- callback ( jsEntry )
260
+ if ( filterBy !== undefined ) {
261
+ if ( params ?. level === filterBy . getLevel ( ) ) {
262
+ {
263
+ this . invokeCallbacksWithFilter ( LOG . TYPE_LOGS_FILTER , jsEntry , filterBy . getLevel ( ) )
264
+ }
265
+ return
266
+ }
267
+ }
268
+
269
+ this . invokeCallbacks ( LOG . TYPE_LOGS , jsEntry )
195
270
return
196
271
}
197
272
@@ -209,12 +284,12 @@ class LogInspector {
209
284
210
285
if ( filterBy !== undefined ) {
211
286
if ( params ?. level === filterBy . getLevel ( ) ) {
212
- callback ( consoleEntry )
287
+ this . invokeCallbacksWithFilter ( LOG . TYPE_LOGS_FILTER , consoleEntry , filterBy . getLevel ( ) )
213
288
}
214
289
return
215
290
}
216
291
217
- callback ( consoleEntry )
292
+ this . invokeCallbacks ( LOG . TYPE_LOGS , consoleEntry )
218
293
return
219
294
}
220
295
@@ -229,14 +304,19 @@ class LogInspector {
229
304
230
305
if ( filterBy !== undefined ) {
231
306
if ( params ?. level === filterBy . getLevel ( ) ) {
232
- callback ( genericEntry )
307
+ {
308
+ this . invokeCallbacksWithFilter ( LOG . TYPE_LOGS_FILTER , genericEntry , filterBy . getLevel ( ) )
309
+ }
310
+ return
233
311
}
234
- return
235
312
}
236
313
237
- callback ( genericEntry )
314
+ this . invokeCallbacks ( LOG . TYPE_LOGS , genericEntry )
315
+ return
238
316
}
239
317
} )
318
+
319
+ return id
240
320
}
241
321
242
322
/**
0 commit comments