Skip to content

Commit aaabcc2

Browse files
refactor: enforce logger naming and no-console
1 parent 66e60c3 commit aaabcc2

51 files changed

Lines changed: 348 additions & 338 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

biome.json

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,24 @@
2424
"recommended": false,
2525
"correctness": { "noUnusedVariables": "error" },
2626
"style": { "useBlockStatements": "warn" },
27-
"suspicious": { "noExplicitAny": "off" }
27+
"suspicious": {
28+
"noExplicitAny": "off",
29+
"noConsole": "error"
30+
}
2831
}
2932
},
33+
"overrides": [
34+
{
35+
"includes": ["migrations/**", "src/clean-db.ts", "src/import-events.ts", "src/scripts/**", "test/**"],
36+
"linter": {
37+
"rules": {
38+
"suspicious": {
39+
"noConsole": "off"
40+
}
41+
}
42+
}
43+
}
44+
],
3045
"javascript": {
3146
"formatter": {
3247
"quoteStyle": "single",

src/adapters/redis-adapter.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { CacheClient } from '../@types/cache'
22
import { createLogger } from '../factories/logger-factory'
33
import { ICacheAdapter } from '../@types/adapters'
44

5-
const debug = createLogger('redis-adapter')
5+
const logger = createLogger('redis-adapter')
66

77
export class RedisAdapter implements ICacheAdapter {
88
private connection: Promise<void>
@@ -13,11 +13,11 @@ export class RedisAdapter implements ICacheAdapter {
1313
this.connection.catch((error) => this.onClientError(error))
1414

1515
this.client
16-
.on('connect', () => debug('connecting'))
17-
.on('ready', () => debug('connected'))
16+
.on('connect', () => logger('connecting'))
17+
.on('ready', () => logger('connected'))
1818
.on('error', (error) => this.onClientError(error))
1919
.on('reconnecting', () => {
20-
debug('reconnecting')
20+
logger('reconnecting')
2121
this.connection = new Promise((resolve, reject) => {
2222
const cleanup = () => {
2323
this.client.removeListener('ready', onReady)
@@ -42,25 +42,25 @@ export class RedisAdapter implements ICacheAdapter {
4242
}
4343

4444
private onClientError(error: Error) {
45-
debug.error('Unable to connect to Redis.', error)
45+
logger.error('Unable to connect to Redis.', error)
4646
// throw error
4747
}
4848

4949
public async hasKey(key: string): Promise<boolean> {
5050
await this.connection
51-
debug('has %s key', key)
51+
logger('has %s key', key)
5252
return Boolean(this.client.exists(key))
5353
}
5454

5555
public async getKey(key: string): Promise<string> {
5656
await this.connection
57-
debug('get %s key', key)
57+
logger('get %s key', key)
5858
return this.client.get(key)
5959
}
6060

6161
public async setKey(key: string, value: string, expirySeconds?: number): Promise<boolean> {
6262
await this.connection
63-
debug('set %s key', key)
63+
logger('set %s key', key)
6464
if (typeof expirySeconds === 'number') {
6565
return 'OK' === (await this.client.set(key, value, { EX: expirySeconds }))
6666
}
@@ -69,25 +69,25 @@ export class RedisAdapter implements ICacheAdapter {
6969

7070
public async removeRangeByScoreFromSortedSet(key: string, min: number, max: number): Promise<number> {
7171
await this.connection
72-
debug('remove %d..%d range from sorted set %s', min, max, key)
72+
logger('remove %d..%d range from sorted set %s', min, max, key)
7373
return this.client.zRemRangeByScore(key, min, max)
7474
}
7575

7676
public async getRangeFromSortedSet(key: string, min: number, max: number): Promise<string[]> {
7777
await this.connection
78-
debug('get %d..%d range from sorted set %s', min, max, key)
78+
logger('get %d..%d range from sorted set %s', min, max, key)
7979
return this.client.zRange(key, min, max)
8080
}
8181

8282
public async setKeyExpiry(key: string, expiry: number): Promise<void> {
8383
await this.connection
84-
debug('expire at %d from sorted set %s', expiry, key)
84+
logger('expire at %d from sorted set %s', expiry, key)
8585
await this.client.expire(key, expiry)
8686
}
8787

8888
public async addToSortedSet(key: string, set: Record<string, string>): Promise<number> {
8989
await this.connection
90-
debug('add %o to sorted set %s', set, key)
90+
logger('add %o to sorted set %s', set, key)
9191
const members = Object.entries(set).map(([value, score]) => ({ score: Number(score), value }))
9292

9393
return this.client.zAdd(key, members)

src/adapters/web-server-adapter.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import { Server } from 'http'
44
import { createLogger } from '../factories/logger-factory'
55
import { IWebServerAdapter } from '../@types/adapters'
66

7-
const debug = createLogger('web-server-adapter')
7+
const logger = createLogger('web-server-adapter')
88

99
export class WebServerAdapter extends EventEmitter implements IWebServerAdapter {
1010
public constructor(protected readonly webServer: Server) {
11-
debug('created')
11+
logger('created')
1212
super()
1313
this.webServer
1414
.on('error', this.onError.bind(this))
@@ -18,39 +18,39 @@ export class WebServerAdapter extends EventEmitter implements IWebServerAdapter
1818
}
1919

2020
public listen(port: number): void {
21-
debug('attempt to listen on port %d', port)
21+
logger('attempt to listen on port %d', port)
2222
this.webServer.listen(port)
2323
}
2424

2525
private onListening() {
26-
debug('listening for incoming connections')
26+
logger('listening for incoming connections')
2727
}
2828

2929
private onError(error: Error) {
30-
debug.error('web-server-adapter: error:', error)
30+
logger.error('web-server-adapter: error:', error)
3131
}
3232

3333
private onClientError(error: Error, socket: Duplex) {
3434
if (error['code'] === 'ECONNRESET' || !socket.writable) {
3535
return
3636
}
37-
debug.error('web-server-adapter: client socket error:', error)
37+
logger.error('web-server-adapter: client socket error:', error)
3838
socket.end('HTTP/1.1 400 Bad Request\r\nContent-Type: text/html\r\n')
3939
}
4040

4141
public close(callback?: () => void): void {
42-
debug('closing')
42+
logger('closing')
4343
this.webServer.close(() => {
4444
this.webServer.removeAllListeners()
4545
this.removeAllListeners()
4646
if (typeof callback !== 'undefined') {
4747
callback()
4848
}
4949
})
50-
debug('closed')
50+
logger('closed')
5151
}
5252

5353
protected onClose() {
54-
debug('stopped listening to incoming connections')
54+
logger('stopped listening to incoming connections')
5555
}
5656
}

src/adapters/web-socket-adapter.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import { messageSchema } from '../schemas/message-schema'
2222
import { Settings } from '../@types/settings'
2323
import { SocketAddress } from 'net'
2424

25-
const debug = createLogger('web-socket-adapter')
26-
const debugHeartbeat = debug.extend('heartbeat')
25+
const logger = createLogger('web-socket-adapter')
26+
const debugHeartbeat = logger.extend('heartbeat')
2727

2828
const abortableMessageHandlers: WeakMap<WebSocket, IAbortable[]> = new WeakMap()
2929

@@ -57,11 +57,11 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
5757
this.client
5858
.on('error', (error) => {
5959
if (error.name === 'RangeError' && error.message === 'Max payload size exceeded') {
60-
debug.error(`web-socket-adapter: client ${this.clientId} (${this.getClientAddress()}) sent payload too large`)
60+
logger.error(`web-socket-adapter: client ${this.clientId} (${this.getClientAddress()}) sent payload too large`)
6161
} else if (error.name === 'RangeError' && error.message === 'Invalid WebSocket frame: RSV1 must be clear') {
62-
debug(`client ${this.clientId} (${this.getClientAddress()}) enabled compression`)
62+
logger(`client ${this.clientId} (${this.getClientAddress()}) enabled compression`)
6363
} else {
64-
debug.error(`web-socket-adapter: client error ${this.clientId} (${this.getClientAddress()}):`, error)
64+
logger.error(`web-socket-adapter: client error ${this.clientId} (${this.getClientAddress()}):`, error)
6565
}
6666

6767
this.client.close()
@@ -78,7 +78,7 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
7878
.on(WebSocketAdapterEvent.Broadcast, this.onBroadcast.bind(this))
7979
.on(WebSocketAdapterEvent.Message, this.sendMessage.bind(this))
8080

81-
debug('client %s connected from %s', this.clientId, this.clientAddress.address)
81+
logger('client %s connected from %s', this.clientId, this.clientAddress.address)
8282
}
8383

8484
public getClientId(): string {
@@ -90,12 +90,12 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
9090
}
9191

9292
public onUnsubscribed(subscriptionId: string): void {
93-
debug('client %s unsubscribed %s', this.clientId, subscriptionId)
93+
logger('client %s unsubscribed %s', this.clientId, subscriptionId)
9494
this.subscriptions.delete(subscriptionId)
9595
}
9696

9797
public onSubscribed(subscriptionId: string, filters: SubscriptionFilter[]): void {
98-
debug('client %s subscribed %s to %o', this.clientId, subscriptionId, filters)
98+
logger('client %s subscribed %s to %o', this.clientId, subscriptionId, filters)
9999
this.subscriptions.set(subscriptionId, filters)
100100
}
101101

@@ -112,7 +112,7 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
112112
public onSendEvent(event: Event): void {
113113
this.subscriptions.forEach((filters, subscriptionId) => {
114114
if (filters.map(isEventMatchingFilter).some((isMatch) => isMatch(event))) {
115-
debug('sending event to client %s: %o', this.clientId, event)
115+
logger('sending event to client %s: %o', this.clientId, event)
116116
this.sendMessage(createOutgoingEventMessage(subscriptionId, event))
117117
}
118118
})
@@ -127,7 +127,7 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
127127

128128
public onHeartbeat(): void {
129129
if (!this.alive && !this.subscriptions.size) {
130-
debug.error(`web-socket-adapter: pong timeout for client ${this.clientId} (${this.getClientAddress()})`)
130+
logger.error(`web-socket-adapter: pong timeout for client ${this.clientId} (${this.getClientAddress()})`)
131131
this.client.close()
132132
return
133133
}
@@ -159,7 +159,7 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
159159

160160
messageHandler = this.createMessageHandler([message, this]) as IMessageHandler & IAbortable
161161
if (!messageHandler) {
162-
debug.error('web-socket-adapter: unhandled message: no handler found:', message)
162+
logger.error('web-socket-adapter: unhandled message: no handler found:', message)
163163
return
164164
}
165165

@@ -175,19 +175,19 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
175175
} catch (error) {
176176
if (error instanceof Error) {
177177
if (error.name === 'AbortError') {
178-
debug.error(`web-socket-adapter: abort from client ${this.clientId} (${this.getClientAddress()})`)
178+
logger.error(`web-socket-adapter: abort from client ${this.clientId} (${this.getClientAddress()})`)
179179
} else if (error.name === 'SyntaxError' || error instanceof ZodError) {
180-
debug('invalid message client %s (%s): %s', this.clientId, this.getClientAddress(), error.message)
180+
logger('invalid message client %s (%s): %s', this.clientId, this.getClientAddress(), error.message)
181181
const notice =
182182
error instanceof ZodError
183183
? `invalid: ${error.issues[0]?.message ?? error.message}`
184184
: `invalid: ${error.message}`
185185
this.sendMessage(createNoticeMessage(notice))
186186
} else {
187-
debug.error('web-socket-adapter: unable to handle message:', error)
187+
logger.error('web-socket-adapter: unable to handle message:', error)
188188
}
189189
} else {
190-
debug.error('web-socket-adapter: unable to handle message:', error)
190+
logger.error('web-socket-adapter: unable to handle message:', error)
191191
}
192192
} finally {
193193
if (abortable && messageHandler) {
@@ -218,7 +218,7 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
218218
const isRateLimited = await hit(period, rate)
219219

220220
if (isRateLimited) {
221-
debug('rate limited %s: %d messages / %d ms exceeded', client, rate, period)
221+
logger('rate limited %s: %d messages / %d ms exceeded', client, rate, period)
222222

223223
limited = true
224224
}
@@ -248,7 +248,7 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
248248
try {
249249
handler.abort()
250250
} catch (error) {
251-
debug.error('Unable to abort message handler', error)
251+
logger.error('Unable to abort message handler', error)
252252
}
253253
}
254254
}

src/adapters/web-socket-server-adapter.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { isRateLimited } from '../handlers/request-handlers/rate-limiter-middlew
1212
import { Settings } from '../@types/settings'
1313
import { WebServerAdapter } from './web-server-adapter'
1414

15-
const debug = createLogger('web-socket-server-adapter')
15+
const logger = createLogger('web-socket-server-adapter')
1616

1717
const WSS_CLIENT_HEALTH_PROBE_INTERVAL = 120000
1818

@@ -30,7 +30,7 @@ export class WebSocketServerAdapter extends WebServerAdapter implements IWebSock
3030
>,
3131
private readonly settings: () => Settings,
3232
) {
33-
debug('created')
33+
logger('created')
3434
super(webServer)
3535

3636
this.webSocketsAdapters = new WeakMap()
@@ -40,29 +40,29 @@ export class WebSocketServerAdapter extends WebServerAdapter implements IWebSock
4040
this.webSocketServer
4141
.on(WebSocketServerAdapterEvent.Connection, this.onConnection.bind(this))
4242
.on('error', (error) => {
43-
debug('error: %o', error)
43+
logger('error: %o', error)
4444
})
4545
this.heartbeatInterval = setInterval(this.onHeartbeat.bind(this), WSS_CLIENT_HEALTH_PROBE_INTERVAL)
4646
}
4747

4848
public close(callback?: () => void): void {
4949
super.close(() => {
50-
debug('closing')
50+
logger('closing')
5151
clearInterval(this.heartbeatInterval)
5252
this.webSocketServer.clients.forEach((webSocket: WebSocket) => {
5353
const webSocketAdapter = this.webSocketsAdapters.get(webSocket)
5454
if (webSocketAdapter) {
55-
debug('terminating client %s: %s', webSocketAdapter.getClientId(), webSocketAdapter.getClientAddress())
55+
logger('terminating client %s: %s', webSocketAdapter.getClientId(), webSocketAdapter.getClientAddress())
5656
}
5757
webSocket.terminate()
5858
})
59-
debug('closing web socket server')
59+
logger('closing web socket server')
6060
this.webSocketServer.close(() => {
6161
this.webSocketServer.removeAllListeners()
6262
if (typeof callback !== 'undefined') {
6363
callback()
6464
}
65-
debug('closed')
65+
logger('closed')
6666
})
6767
})
6868
this.removeAllListeners()
@@ -89,10 +89,10 @@ export class WebSocketServerAdapter extends WebServerAdapter implements IWebSock
8989
const currentSettings = this.settings()
9090
const remoteAddress = getRemoteAddress(req, currentSettings)
9191

92-
debug('client %s connected: %o', remoteAddress, req.headers)
92+
logger('client %s connected: %o', remoteAddress, req.headers)
9393

9494
if (await isRateLimited(remoteAddress, currentSettings)) {
95-
debug('client %s terminated: rate-limited', remoteAddress)
95+
logger('client %s terminated: rate-limited', remoteAddress)
9696
client.terminate()
9797
return
9898
}

0 commit comments

Comments
 (0)