15
15
* limitations under the License.
16
16
*/
17
17
18
+ import {
19
+ LogCallback ,
20
+ LogLevelString ,
21
+ FirebaseApp ,
22
+ LogOptions
23
+ } from '@firebase/app-types' ;
24
+ import { FirebaseService } from '@firebase/app-types/private' ;
25
+
18
26
/**
19
27
* A container for all of the Logger instances
20
28
*/
@@ -40,6 +48,15 @@ export enum LogLevel {
40
48
SILENT
41
49
}
42
50
51
+ const levelStringToEnum = {
52
+ 'debug' : LogLevel . DEBUG ,
53
+ 'verbose' : LogLevel . VERBOSE ,
54
+ 'info' : LogLevel . INFO ,
55
+ 'warn' : LogLevel . WARN ,
56
+ 'error' : LogLevel . ERROR ,
57
+ 'silent' : LogLevel . SILENT
58
+ } ;
59
+
43
60
/**
44
61
* The default log level
45
62
*/
@@ -53,45 +70,45 @@ const defaultLogLevel: LogLevel = LogLevel.INFO;
53
70
export type LogHandler = (
54
71
loggerInstance : Logger ,
55
72
logType : LogLevel ,
73
+ message : string ,
74
+ source ?: FirebaseService | FirebaseApp ,
56
75
...args : unknown [ ]
57
76
) => void ;
58
77
78
+ /**
79
+ * By default, `console.debug` is not displayed in the developer console (in
80
+ * chrome). To avoid forcing users to have to opt-in to these logs twice
81
+ * (i.e. once for firebase, and once in the console), we are sending `DEBUG`
82
+ * logs to the `console.log` function.
83
+ */
84
+ const ConsoleMethod = {
85
+ [ LogLevel . DEBUG ] : 'log' ,
86
+ [ LogLevel . VERBOSE ] : 'log' ,
87
+ [ LogLevel . INFO ] : 'info' ,
88
+ [ LogLevel . WARN ] : 'warn' ,
89
+ [ LogLevel . ERROR ] : 'error'
90
+ } ;
91
+
59
92
/**
60
93
* The default log handler will forward DEBUG, VERBOSE, INFO, WARN, and ERROR
61
94
* messages on to their corresponding console counterparts (if the log method
62
95
* is supported by the current log level)
63
96
*/
64
- const defaultLogHandler : LogHandler = ( instance , logType , ... args ) : void => {
97
+ const defaultLogHandler : LogHandler = ( instance , logType , message ) : void => {
65
98
if ( logType < instance . logLevel ) {
66
99
return ;
67
100
}
68
101
const now = new Date ( ) . toISOString ( ) ;
69
- switch ( logType ) {
70
- /**
71
- * By default, `console.debug` is not displayed in the developer console (in
72
- * chrome). To avoid forcing users to have to opt-in to these logs twice
73
- * (i.e. once for firebase, and once in the console), we are sending `DEBUG`
74
- * logs to the `console.log` function.
75
- */
76
- case LogLevel . DEBUG :
77
- console . log ( `[${ now } ] ${ instance . name } :` , ...args ) ;
78
- break ;
79
- case LogLevel . VERBOSE :
80
- console . log ( `[${ now } ] ${ instance . name } :` , ...args ) ;
81
- break ;
82
- case LogLevel . INFO :
83
- console . info ( `[${ now } ] ${ instance . name } :` , ...args ) ;
84
- break ;
85
- case LogLevel . WARN :
86
- console . warn ( `[${ now } ] ${ instance . name } :` , ...args ) ;
87
- break ;
88
- case LogLevel . ERROR :
89
- console . error ( `[${ now } ] ${ instance . name } :` , ...args ) ;
90
- break ;
91
- default :
92
- throw new Error (
93
- `Attempted to log a message with an invalid logType (value: ${ logType } )`
94
- ) ;
102
+ const method = ConsoleMethod [ logType as keyof typeof ConsoleMethod ] ;
103
+ if ( method ) {
104
+ console [ method as 'log' | 'info' | 'warn' | 'error' ] (
105
+ `[${ now } ] ${ instance . name } :` ,
106
+ message
107
+ ) ;
108
+ } else {
109
+ throw new Error (
110
+ `Attempted to log a message with an invalid logType (value: ${ logType } )`
111
+ ) ;
95
112
}
96
113
} ;
97
114
@@ -141,19 +158,67 @@ export class Logger {
141
158
* The functions below are all based on the `console` interface
142
159
*/
143
160
144
- debug ( ...args : unknown [ ] ) : void {
145
- this . _logHandler ( this , LogLevel . DEBUG , ...args ) ;
161
+ debug (
162
+ message : string ,
163
+ source ?: FirebaseService | FirebaseApp
164
+ ) : void {
165
+ this . _logHandler ( this , LogLevel . DEBUG , message , source ) ;
166
+ }
167
+ log (
168
+ message : string ,
169
+ source ?: FirebaseService | FirebaseApp
170
+ ) : void {
171
+ this . _logHandler ( this , LogLevel . VERBOSE , message , source ) ;
146
172
}
147
- log ( ...args : unknown [ ] ) : void {
148
- this . _logHandler ( this , LogLevel . VERBOSE , ...args ) ;
173
+ info (
174
+ message : string ,
175
+ source ?: FirebaseService | FirebaseApp
176
+ ) : void {
177
+ this . _logHandler ( this , LogLevel . INFO , message , source ) ;
149
178
}
150
- info ( ...args : unknown [ ] ) : void {
151
- this . _logHandler ( this , LogLevel . INFO , ...args ) ;
179
+ warn (
180
+ message : string ,
181
+ source ?: FirebaseService | FirebaseApp
182
+ ) : void {
183
+ this . _logHandler ( this , LogLevel . WARN , message , source ) ;
152
184
}
153
- warn ( ...args : unknown [ ] ) : void {
154
- this . _logHandler ( this , LogLevel . WARN , ...args ) ;
185
+ error (
186
+ message : string ,
187
+ source ?: FirebaseService | FirebaseApp
188
+ ) : void {
189
+ this . _logHandler ( this , LogLevel . ERROR , message , source ) ;
155
190
}
156
- error ( ...args : unknown [ ] ) : void {
157
- this . _logHandler ( this , LogLevel . ERROR , ...args ) ;
191
+ }
192
+
193
+ export function setLogLevel ( level : LogLevelString | LogLevel ) : void {
194
+ const newLevel = typeof level === 'string' ? levelStringToEnum [ level ] : level ;
195
+ instances . forEach ( inst => {
196
+ inst . logLevel = newLevel ;
197
+ } ) ;
198
+ }
199
+
200
+ export function addLogCallback ( logCallback : LogCallback , options : LogOptions ) {
201
+ for ( const index in instances ) {
202
+ const instance = instances [ index ] ;
203
+ let threshhold = instance . logLevel ;
204
+ if ( options && options . level ) {
205
+ threshhold = levelStringToEnum [ options . level ] ;
206
+ }
207
+ instance . logHandler = (
208
+ instance : Logger ,
209
+ level : LogLevel ,
210
+ message : string ,
211
+ source ?: FirebaseService | FirebaseApp
212
+ ) => {
213
+ if ( level >= threshhold && message && source ) {
214
+ logCallback ( {
215
+ level : LogLevel [ level ] . toLowerCase ( ) as LogLevelString ,
216
+ message,
217
+ type : instance . name ,
218
+ source
219
+ } ) ;
220
+ }
221
+ defaultLogHandler ( instance , level , message ) ;
222
+ } ;
158
223
}
159
224
}
0 commit comments